>[success] # Node 工程化 前端工程化是基于 Node.js,想对工程化有了解 需要了解 Node.js 部分知识 1. 什么是`Node.js`,是一个基于**V8 JavaScript引擎的JavaScript运行时环境**,**V8**可以嵌入到任何**C ++应用程序**,V8 只是作为执行 js的,**以浏览器为例** V8 只是浏览器构成一部分(**解析、渲染HTML、CSS等相关渲染引擎,另外还需要提供支持浏览器操作的API、浏览器自己的事件循环**),`Node.js` 中除了V8 (**文件系统读/写、网络IO、加密、压缩解压文件**) 2. `Node.js`,编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings,将任务放到Libuv的事件循环中,libuv(**使用C语言编写的库**)提供了**事件循环、文件系统读写、网络IO、线程池**等等内容 ![](https://img.kancloud.cn/36/1b/361b6bfcbb618c7d350c125a7085fe89_1170x421.png) >[danger] ##### 安装 1. Node.js 在安装时候有两个版本 1.1. **LTS版本**:(Long-term support, 长期支持)相对稳定一些,推荐线上环境使用该版本; 1.2. **Current版本**:最新的Node版本,包含很多新特性 2. 不同环境安装`Node.js` 也不同方式,**Mac上的homebrew,Linux上的yum、dnf**等,也可以自己下载安装包**window选择.msi安装包,Mac选择.pkg安装包** >[danger] ##### 多版本管理工具 1. 用来切换电脑上node 版本工具有两个,**nvm:Node Version Manager**,**n:Interactively Manage Your Node.js Versions**,这两种都不能在Window 上使用 2. **Window 需要使用nvm**,在GitHub上有提供对应的window版本:https://github.com/coreybutler/nvm-windows , 直接下载安装即可 >[danger] ##### 使用 nvm 1. **nvm list** 查看当前安装的Node.js所有版本 2. **nvm install 版本号** 安装指定版本的Node.js (**nvm install latest** 安装最新的node版本) 3. **nvm uninstall 版本号** 卸载指定版本的Node.js 4. **nvm use 版本号** 选择指定版本的Node.js >[danger] ##### 使用 n 1. 通过 npm 安装 n 管理参考 https://github.com/tj/n ,`npm install -g n` 2. **n lts** 安装最新的lts 版本 3. **n latest** 安装最新版本 4. **n** 查看版本 >[danger] ##### 想更新node 版本 1. 这里接受的是win 更新方式,输入where node 看一下node 安装的盘符,在node 官网下载一个新的版本包,然后安装刚才查看的盘符 2. Linux 只是使用 n 更新即可 >[danger] ##### Node 的 REPL 1. REPL是**Read-Eval-Print Loop的简称,翻译为“读取-求值-输出”循环**,**是一个简单的、交互式的编程环境** ,你可以直接在控制进行代码演练 ![](https://img.kancloud.cn/33/d0/33d029fb06e4f187bd4ed44b50729c7a_1200x628.png) >[info] ## Node 中全局对象 1. **global是一个全局对象,类似于浏览器中的window**,在新的标准中浏览器和 Node 都可以使用**globalThis**,也是全局对象的 2. 和浏览器不同点,**node中,我们通过var定义一个变量,它只是在当前模块中有一个变量,不会放到全局中**,**但是在浏览器中执行的JavaScript代码,如果我们在顶级范围内通过var定义的一个属性,默认会被添加到window对象上** ~~~ // 在node 环境下执行 var a = 1 console.log(global.a) // undefined ~~~ 3. **__dirname、__filename、exports、module、require()**,这些全局对象实际上是模块中的变量,**只是每个模块都有**,看来像是全局变量,在命令行交互中是不可以使用的 ![](https://img.kancloud.cn/37/0e/370e112b31758ab1b58cd18805ce0126_448x737.png) >[danger] ##### 在工程化中会用到的 1. **__dirname**:获取当前文件所在的路径(不包括后面的文件名) 2. **__filename**:获取当前文件所在的路径和文件名称(包括后面的文件名称) 3. **process对象**:process提供了Node进程中相关的信息.可以获取Node的运行环境、参数信息等 3.1. **process.argv** : 接受命令行参数,执行node 使用脚本 `node xx.js`,下**执行node程序的过程中,我们可能希望给node传递一些参数** `node xx.js xx1 xx2`,可以使用 **process.argv** ,得到一个数组,前两项数据分别是:Node.js环境的路径;当前执行的js文件的全路径,从第三个参数开始表示命令行参数 ~~~ console.log(process.argv) ~~~ ![](https://img.kancloud.cn/9e/fc/9efc8c849247a00cdf17cd17cfb56b57_417x133.png) >[info] ## 内置模块path 1. 在不同 系统上路径系统是不同,**window**上会使用` \`或者 `\\ `来作为文件路径的分隔符,当然目前也支持 `/`,在**Mac OS、Linux**的Unix操作系统上使用` /` 来作为文件路径的分隔符,因此在不同系统中路径符不同,需要操作我们可以使用 **path** 模块 >[danger] ##### 获取路径一些信息api 1. **dirname**:获取文件的父文件夹; 2. **basename**:获取文件名; 3. **extname**:获取文件扩展名; ~~~ console.log(path.extname(filepath)) // .txt console.log(path.basename(filepath)) // nba.txt console.log(path.basename(filepath, '.txt')) // nba //只要名称不要后缀 console.log(path.dirname(filepath)) // C://abc/cba ~~~ >[danger] ##### 路径拼接 -- join 1. 用于连接路径**从左到右进行处理**,拼接后生成的是**相对路径**。该方法的主要用途在于,会正确使用当前系统的路径分隔符,**Unix系统是"/",Windows系统是"\"**。下面案例 window 打印结果 `\abc\cba\123.txt`,Unix系统是`/abc/cba/123.txt` ~~~ const path1 = '/abc/cba' const path2 = '123.txt' console.log(path.join(path1, path2)) ~~~ 2. join 尾部的斜杠**不会被删除**,会把全部给定的 path 片段连接到一起,并规范化生成的路径,下面案例中拼接重叠的路径最后打印只有一个。但末尾的还存在 ~~~ const path1 = '/abc/cba/' const path2 = '/123' const path3 = '/456/' console.log(path.join(path1, path2, path3)) // \abc\cba\123\456\ ~~~ 3. 长度为零的 path 片段会被忽略 ~~~ path.join('/目录1', '', '目录3'); // \目录1\目录3 ~~~ 4. 如果连接后的路径字符串为长度为零的字符串,则返回 ‘.’,表示当前工作目录 ~~~ path.join('', '', ''); // . ~~~ >[danger] ##### 拼接绝对路径 -- path.resolve() 1. `path.resolve()` 方法路径的序列是从右往左被处理的会把一个路径或路径片段的序列解析为一个**绝对路径**;如果没有path传递段,path.resolve()将返回当前工作目录的绝对路径 ~~~ const path = require('path') console.log(path.resolve('./abc/cba', '../zz/bb', './abc.txt')) // d:\lzz\abc\zz\bb\abc.txt console.log(path.resolve()) // d:\lzz ~~~ 2. 生成的路径被规范化并删除尾部斜杠,零长度path段被忽略 ~~~ const path = require('path') console.log(path.resolve('./abc/cba', '../zz/bb', './abc.txt/')) // d:\lzz\abc\zz\bb\abc.txt ~~~