# 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 分为渲染引擎 WebCoreJavaScript 解释引擎 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>,包 bugs
  • npm bugs,当前项目 bugs
  • npm 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 环境下推荐使用 nvmwnvm-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 版本目录路径。