Nvm和n比较

node 的版本管理工具

creationix/nvm: https://github.com/nvm-sh/nvm
TJ: https://github.com/tj/n

2021.11.20 星期六 17:20

比较

nvm

不同于 n,nvm 不是一个 npm package,而是一个独立软件包。这意味着我们需要单独使用它的安装逻辑:

或者使用 Homebrew 来安装。安装完后,还需要修改一下 shell 配置(~/.zshrc or whatever)

然后我们可以使用 nvm 来安装不同版本的 node。

在安装的时候,nvm 将不同的 node 版本存储到~/.nvm/<version>/ 下,然后修改 $PATH,将指定版本的 node 路径加入,这样我们调用的 node 命令即是使用指定版本的 node。

nvm 显然比 n 要复杂一些,但是另一方面,由于它是一个独立软件包,因此它和 node 之间的关系看上去更合乎逻辑:nvm 不依赖 node 环境,是 node 依赖 nvm;而不像 n 那样产生类似循环依赖的问题。

n

n 是一个需要全局安装的 npm package。
这意味着,我们在使用 n 管理 node 版本前,首先需要一个 node 环境。我们或者用 Homebrew 来安装一个 node,或者从官网下载 pkg 来安装,总之我们得先自己装一个 node —— n 本身是没法给你装的。

然后我们可以使用 n 来安装不同版本的 node。

在安装的时候,n 会先将指定版本的 node 存储下来,然后将其复制到我们熟知的路径 /usr/local/bin,非常简单明了。当然由于 n 会操作到非用户目录,所以需要加 sudo 来执行命令。

所以这样看来,n 在其实现上是一个非常易理解的方案。

如何选择

  • 安装简易度。nvm 安装起来显然是要麻烦不少;n 这种安装方式更符合 node 的惯性思维。见仁见智吧。
  • 系统支持。注意, nvm 不支持 Windows。
  • 对全局模块的管理。n 对全局模块毫无作为,因此有可能在切换了 node 版本后发生全局模块执行出错的问题;nvm 的全局模块存在于各自版本的沙箱中,切换版本后需要重新安装,不同版本间也不存在任何冲突。
  • 关于 node 路径。n 是万年不变的 /usr/local/bin;nvm 需要手动指定路径。

所以,如何选择?真心见仁见智了,不过这里可以给出大体的建议:
1) 如果你使用 Windows,那没得选了,使用 n,或者换一台 Mac。
1) 如果你会频繁切换 node 版本(比如本地经常测试最新版的特性,同时又要兼顾代码在生产环境的兼容性),那么从全局模块兼容性的角度考虑,只能使用 nvm。
1) 如果你是一个轻量级的用户,不需要担心兼容性的问题,更关心 node 安装和使用上的体验,那么选择 n。
你如果要问,楼主最终选用了谁?我会说,我选择了更流行的那一个。

nvm 注意

### 0
nvm 应运而生,nvm 是 Mac 下的 node 管理工具
如果需要管理 Windows 下的 node,官方推荐使用 nvmw 或 nvm-windows。
不过,nvm-windows 并不是 nvm 的简单移植,他们也没有任何关系。但下面介绍的所有命令,都可以在 nvm-windows 中运行。

### 1

由于 npm 安装的模块路径均为 /usr/local/lib/node_modules,当使用 n 切换不同的 node 版本时,实际上会共用全局的 node/npm 目录。 因此不能很好的满足『按不同 node 版本使用不同全局 node 模块』的需求。

### 2
卸载全局安装的 node/npm
OS X/Linux 安装: 与 Windows 不同,我们并不一定要先卸载原有的 NodeJS。当然我们推荐还是先卸载掉比较好。

### 3
在项目中使用不同版本的 Node
我们可以通过创建项目目录中的 .nvmrc 文件来指定要使用的 Node 版本。之后在项目目录中执行 nvm use 即可。.nvmrc 文件内容只需要遵守上文提到的语义化版本规则即可。另外还有个工具叫做 avn,可以自动化这个过程。

### 4
在多环境中,npm该如何使用呢?

但问题来了,我们安装过的 npm 包,都要重新再装一次?幸运的是,我们有个办法来解决我们的问题,运行下面这个命令,可以从特定版本导入到我们将要安装的新版本 Node:
nvm install v5.0.0 --reinstall-packages-from=4.2

### 5 其他命令

1
2
3
4
5
6
7
8
# 直接运行特定版本的 Node
nvm run 4.2.2 --version
# 在当前终端的子进程中运行特定版本的 Node
nvm exec 4.2.2 node --version
# 确认某个版本Node的路径
nvm which 4.2.2
# 安装 Node 的其他实现,例如 iojs(一个基于 ES6 的 Node 实现,现在已经和 Node 合并)
nvm install iojs-v3.2.0

knowledge is no pay,reward is kindness
0%