# Node
Node.js 是一个基于 Chrome v8 引擎的 JavaScript 运行时环境。那什么是运行时环境呢?
# 运行时环境
运行时环境或运行时,更确切的称谓是 Managed Runtime Environment
,即托管运行时环境,而 JavaScript
引擎则是对同一个概念的更通俗叫法。运行时是一个平台,它把运行在底层的操作系统和体系结构的特点抽象出来,承担了解释与编译、堆管理(Heap Management)、垃圾回收机制(Garbage Collection)、内存分配(Memory Allocation)、安全机制(Security)等功能。
简单点说,JavaScript
运行时环境就是一个能够执行 JavaScript
语句的运行环境,它提供一系列以往由处理器和操作系统才能提供的功能,使得开发者能够脱离底层指令,从而专注于业务逻辑开发。
# Chrome v8 引擎
是一个高性能的 JavaScript
解释引擎。Chrome
浏览器内核是 WebKit
的一个分支(WebKit 分为渲染引擎 WebCore
和 JavaScript
解释引擎 JavaScriptCore
两部分)。Google
认为运行现代 Web
应用需要一个强劲的 JavaScript
引擎,然而 JavaScriptCore
的运行效率并不让人满意。于是 Google
开发了一个高性能的 JavaScript
引擎,就是 Chrome v8
。
# 包管理器 NPM
在同一个项目中,当我们想把编写好的模块给别人复用的时候,只需要引入路径就可以了。不同项目,也只需要通过通信工具发送就好。但当我们决定开源时,由于应用模块的人都不认识,遍布世界各地,如何保证所有需要该模块的开发者都能够随时得到适用于各自系统的版本,并且在模块之间存在依赖关系的时候,也能够顺利找到所有的依赖项?这就需要使用模块管理工具 NPM
了。
NPM
(Node Package Manager)官网地址为 https://www.npmjs.com (opens new window)。Node.js 社区的工具包非常丰富,前端开发者可以在 NPM
的官网上获取和上传模块、搜索社区资源。NPM
中的单个模块通常只用来解决一个问题,职责明确单一。
# 模块结构
完全符合 CommonJS 规范的模块应包含以下 5 个文件。
package.json
,模块的描述性文件。bin
,存放可执行的二进制文件。lib
,存放JavaScript
代码。doc
,存放文档。test
,存放单元测试用例。
# 常用命令
# 简写
npm install
可简写npm i
# 创建 package.json
npm init
npm init -y
# 安装/卸载
npm install <package> -g
,全局npm install <package>
, 本地npm install <package>@latest
,安装到最新版本npm install <package> <package>
,一次性npm install <package> --save-dev
/npm install <package> -D
,开发时依赖包npm install <package> --save
/npm install <package> -S
,运行时依赖包npm uninstall <package>
,卸载
# 更新
npm update <package>
,简单更新npm update <package>@version
,更新到指定版本
高版本到低版本,可先卸载在安装
# 查看/检查
npm -v
,自身版本号npm help
,所有命令npm root
,项目所在目录npm root -g
,全局所在目录npm view <package>
,包所有信息npm view <package> dependencies
,包的属性npm view <package> repository.url
,包源文件地址npm view <package> engines
,包依赖 node 最低版本号npm view <package> version
,包当前版本号npm view <package> versions
,包历史版本号npm view <package> maintainers
,包作者信息npm list -g
,全局包列表npm list
,当前项目包列表npm list --depth=0
,限制展示目录层级npm home antd
,查看 ant.design 主页npm docs antd
,查看 ant.design 文档npm repo antd
,查看 ant.design github 仓库npm bugs <package>
,包 bugsnpm bugs
,当前项目 bugsnpm outdated
,检查所有包是否过时
# 清除
npm cache clean
,清除缓存(慎用该命令)npm prune
,清除没有使用到的包
# 发布
npm search <package>
,发布前先查看包名是否存在。- 注册账号 https://www.npmjs.com/signup (opens new window)。
- 进入项目目录运行命令
npm adduser
,输入刚刚注册好的用户名、密码和邮箱。 - 发布命令
npm public
。
# 依赖包版本号
NPM 的版本兼容机制非常宽松,比如 ^2.5.0
,定义的是只要在大版本号“2”上相同,就允许下载最新版本的依赖包。也就是说,实际上得到的版本也许是 2.5.2
,符号 ^
表示的是大于某个版本号。虽然 NPM
的模块开发原则是:大版本相同的接口必须保持兼容,然而这个原则并非强制执行,因此用户下载的最新版本也许会导致依赖包的行为完全不兼容,从而导致模块不可用。
package-lock.json
锁定了依赖版本号,只要保存了源文件,就能够确保得到完全一致的依赖包,从而提高了模块的稳定性和可用性。package-lock.json
就是 NPM
为了防止模块包的不一致而进行的功能加强,这也是在 Yarn
冲击下的必然结果。这个文件在运行命令 npm install
的时候为了锁定依赖版本和来源而由 NPM
自动创建,实际上记录了当前状态下安装的所有模块信息,确保了在下载时间、开发者、机器和下载源都不相同的情况下也能够得到完全一样的模块包。
# NVM
在日常开发过程中经常会因为不同的项目所依赖的 Node.js
版本不同,而需要在不同的 Node.js 版本之间进行切换。NVM(Node Version Manager,Node版本管理器)是在 Mac
环境下管理 Node.js
版本的工具。在 Windows
环境下推荐使用 nvmw
或 nvm-windows
。在 github 上有对 nvm
详细的描述。github 地址:https://github.com/creationix/nvm (opens new window)。
# 安装和检测 NVM
- 建议使用
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
,安装后将创建目录~/.nvm
并将内容存放在这里。 - 或
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
nvm -h
,测试是否安装成功。nvm install v8.9.0
,安装node 8.9.0
版本。
如果安装后不起作用,可以
- 查看
~/.bashrc
,~/.bash_profile
,~/.zshrc
,~/.profile
中有没有配置信息export NVM_DIR...
。 - 若没有,就
cd ~、vim .bash_profile
。 - 将下面
nvm
全局变量配置信息粘贴到文件中,esc -> 输入":wq" -> 回车。 - 让配置文件里面生效
source .bash_profile
。
// nvm 全局变量配置信息
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" ## This loads nvm
# 切换不同版本,配置默认版本
nvm ls
列出本机所有已安装的版本。nvm alias default v12.10.0
,如果不设置,每次进入终端都要设置哪个版本,烦死,效率低。- 若项目所需
Node.js
版本不是默认版本,可以在项目根目录下创建.nvmrc
文件并在其中预先指定版本号。 /Users/你的电脑/.nvm/versions/node/
,nvm
版本目录路径。