浅谈 node版本管理器 nvm 与 n 实现原理

817 阅读3分钟

最近换了新电脑,芯片由 Intel 换成 Apple M2的,不想从老电脑上把软件 导到新电脑上。打算在新电脑上 按新的。其中就遇到 选择node版本管理器 的问题:n 还是 nvm呢?

之前在老电脑上 用的是n,对于它的切换node版本的命令操作也比较习惯。nvm 之前没用过,但是网上看了一些资料说它对于安装包的隔离做的比较好,而且它的star 要比 n要多些。所以稍微研究了下,它们的实现原理,以便能找到更适合自己的 node版本管理器。

先说下n(github.com/tj/n):

我安装的n的版本是 v14.17.0

用n安装node时,会把各node版本放在 usr/local/n/versions/node

然后把 usr/local/n/versions/node/版本号/bin下的 node 命令软链到 /usr/local/bin ,同时被软链到 /usr/local/bin 下的还有此node版本对应的 npm 命令

然后我们就可以在全局使用 node命令了。

当我们用n再安装一个新的node版本时,新版本也会放在usr/local/n/versions/node下,然后把新版本的 node 命令、npm命令软链到 /usr/local/bin ,替换掉之前的。这样 node 的版本就切换了。

当我们用n切换到一个已安装过的node版本时,会把对应版本的 node命令 软链到 /usr/local/bin 下,替换 node 版本。但是此情况下 npm 版本、以及其他通过 node的npm全局安装 命令(如:pnpm)版本,则不会换。

再看看 nvm(github.com/nvm-sh/nvm)…

我安装的nvm版本是 v0.39.3

用nvm安装node时,会把各node版本放在 /Users/用户/.nvm/versions/node 下,这里看起来和 n 的做法差不多。

但是,nvm 并不会 把node命令往/usr/local/bin 下,做软链。我们用的就是 .nvm/versions/node/版本号/bin 下的 node命令

那么我们是如何能在全局下,直接引用到 .nvm/versions/node/版本号/bin 下的 node命令的呢?

因为 nvm 扩展了PATH,把 .nvm/versions/node/当前选用的版本号/bin 的路径放在了$PATH的最前面

当我们用nvm再安装一个新的node版本时,新版本会放在/Users/用户/.nvm/versions/node 下,并修改 $PATH 指向 /User/用户/.nvm/versions/node/新版本号/bin

⚠️ 值得注意的是,通过 nvm 安装的node 的 npm 安装在全局的包(如:pnpm),也是安装在 /User/用户/.nvm/versions/node/对应node版本号/lib/node_modules 下的,然后软链一份命令(如:pnpm)到 /User/用户/.nvm/versions/node/对应node版本号/bin 下。

所以用nvm切换node版本时,$PATH 换了路径。切换了node版本的同时,还切换了 npm版本、以及在node版本全局安装的包(如:pnpm版本)(如果没有,需要时,手动再安一遍)

另外再补充一点:因为 不同目录下,可以设置不同$PATH,所以一台电脑 的不同项目,用nvm可以设置不同的 node版本。而 n 使用 /usr/local/bin ,则不同项目共用一个node版本,需要每次启不同项目前,手动用 n 切换 node版本。

总结:

以上就是 n 与 nvm 两款node版本管理器 在实现node版本切换时,原理上的一些不同点。因为我希望在切换node版本时,可以一同切换掉npm版本、全局安装的包。担心如果只切换了node版本,使用时会发生一些奇奇怪怪的问题。最终 我选择了用 nvm 来作为 新电脑的 node版本管理器。