想象一下,你加入了一个 Node.js 项目,并想要引导它以查看进展,但是你遇到了一个错误。问题出在哪里?花费一些时间后,你发现你的机器上使用的 Node.js 版本不是项目所需的版本。
这是一个相当常见且令人讨厌的情况。我自己也遇到过。为了避免这种麻烦,聪明的人们开发了一种称为“node 版本管理器”的工具。这是一个 Shell 实用程序,可以让你轻松切换 Node.js 版本。
本文将重点介绍 Node.js 版本管理器市场。你将了解它们的区别以及你应该考虑使用哪一个。
为了更容易进行比较,我们将介绍以下标准:
参赛者比较
有了定义的标准,我们现在可以更详细地查看每个参赛者。
NVM
它是最受欢迎的 Node 版本管理解决方案(至少通过 GitHub 仓库星标,75.2k)。原因在于它的早期出现。在当时,它是最早的,如果不是第一个 Node.js 版本管理器之一,并在社区中获得了巨大的流行。
它是跨平台的吗?不完全是。它不完全支持 Windows。它在某些情况下可以工作,比如 GitBash(MSYS)、Cygwin 和 WSL(Windows 子系统 Linux)。对于 Windows 有一个单独的包叫做 nvm-windows,但它并不是 NVM 本身。
另一个限制是仅支持 POSIX shell,比如 bash 或 zsh,这使得其他 shell 的用户,比如 Fish,无法使用。
安装 NVM 最直接的方法是运行以下命令。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
这里是如何使用 NVM 在不同的 Node.js 版本之间进行切换。
user@machine:~/project node -v
v21.7.2
user@machine:~/project cat .nvmrc
18.19.1
user@machine:~/project nvm use
user@machine:~/project node -v
v18.19.1
NVM 可以通过.nvmrc文件来确定要使用哪个版本的 Node.js。在切换版本之前,你必须先创建一个文件,或者明确声明要切换到的 Node.js 版本,例如nvm use 18.10。
请注意,运行nvm use命令会为当前 shell 设置 Node.js 版本。这意味着什么?即使你离开项目文件夹并导航到另一个项目,Node.js 版本仍将保持不变,直到你重新运行 nvm use 命令。
它给你的工作流程增加了更多摩擦,并且会产生更大的认知负荷,因为你必须始终注意当前 shell 使用的 Node.js 版本以及特定项目所需的版本。
它仍然比手动管理所有可能的 Node.js 版本要好,但与无缝集成相去甚远。
N 是另一个流行的 Node.js 版本管理器(18.5k GitHub stars)。
它不是跨平台的,甚至比 NVM 还有更多的限制。它在 Microsoft Windows 的本机 shell(如 PowerShell)、Git for Windows Bash 或 Cygwin DLL 中无法工作。
N 可以直接从 NPM 安装。运行npm install -g n。也可以通过 Brew 在 macOS 上安装,或者通过下载 sh 脚本安装。
curl -L https://bit.ly/n-install | bash
使用 N 的一个重要好处是它能够直接从“engines”部分检测到 Node 版本。如果你有以下 package.json 结构:
{
"name": "project",
"version": "1.0.0",
"main": "index.js",
"engines": {
"node": "18.17.0"
},
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [],
"license": "ISC"
}
N 将按照你在 engines 部分指定的要求安装“18.17.0”。
然而,N 也存在与 NVM 类似的问题。如果你想为不同项目使用确切的 Node.js 版本,你必须自行跟踪。
此外,N 将这个问题提升到一个全新的水平。使用 N 意味着管理一个“全局” Node.js 版本。即使关闭了一个 shell,你仍然使用的是最新项目所用的 Node 版本 —— 不是最好的体验。
FNM
FNM 是用 Rust 编写的一个 Node 版本管理器。它和 N 一样受欢迎(15.2k GitHub 星)。
FNM 是列表中第一个跨平台的 Node 版本管理器。它可以在 Windows 上运行,无需安装任何其他软件包。
安装过程清晰直观。
# macOS
brew install fnm
# Using rust package manager cargo
cargo - cargo install fnm
# On windows using winget
winget - winget install Schniz.fnm
或者使用适用于基于 Unix 的操作系统的 bash 脚本。
curl -fsSL https://fnm.vercel.app/install | bash
FNM 根据每个 shell 管理 Node.js 版本,并不像 N 那样通过全局版本控制来构建其主要工作流程。它有一个“默认”版本,是全局的,起到了后备的作用,以防某个项目没有指定的 Node.js 版本。
FNM 的另一个很酷的功能是根据你所在的文件夹自动切换 Node.js 版本,但你需要进行一些配置。
自动切换的工作方式如下:如果你从一个使用 18.17.0 版本的项目切换到另一个使用 20.12.1 版本的项目,FNM 在你进入新项目文件夹后会自动切换 Node.js 版本。
user@machine:~ node -v
V21.7.2
user@machine:~ cd project-1
Using Node.js v18.17.0
user@machine:~/project-1 cat .node-version
18.17.0
user@machine:~/project-1 cd ..
user@machine:~ node -v
V18.17.0
user@machine:~ cd project-2
Using Node.js V20.12.1
user@machine:~/project-2 cat .node-version
v20.12.1
我们在两个项目之间切换,Node 版本会根据这些项目内的 .node-version 文件自动更改。
你必须在计算机上安装所需的 Node.js 版本,以使自动切换正常工作。
另一件需要记住的事情是它只能从你在项目中创建的额外文件中检测到节点版本。这些文件是 .node-version 或 .nvmrc。
Volta
Volta 是版本管理器领域中的新星(在 GitHub 上有 10k 星)。
它是用 Rust 编写的,支持跨平台。
对于基于 Unix 的系统,安装过程是无缝的。
curl https://get.volta.sh | bash
Windows 有一个单独的安装程序。
当你配置 Volta 的 Node.js 版本时,无需创建额外的文件。Volta 使用来自package.json的配置。
{
"name": "project",
"version": "1.0.0",
"main": "index.js",
"engines": {
"node": "18.17.0"
},
}
这种配置的好处是engines部分紧邻 Volta 配置。这样可以轻松保持它们同步。当放置在单独的文件中时,很容易忘记同步这些版本。
另一个重要特性是工具链的管理。这是什么意思?
想象一下,你正在使用 Yarn 作为包管理器。其他 Node.js 版本管理器只能管理 Node.js 版本。与此同时,Yarn 版本可以在项目之间变化。
这就是 Volta 的亮点。你不仅可以动态切换 Node.js 版本,还可以切换 Yarn 版本。只需在“volta”配置部分下添加 Yarn 版本。
"volta": {
"node": "18.17.0",
"yarn": "1.22.22"
}
每当你运行安装命令时,请确保 Volta、Node.js 和 Yarn 的版本与声明的版本匹配。这不是很神奇吗?
PNPM
不要感到惊讶。PNPM 通常被视为 NPM 和 Yarn 等包管理器的替代品。然而,与那些不同,PNPM 可以管理 Node.js 版本本身。
PNPM 是跨平台的,并且在所有平台上提供相同的 Node.js 版本管理体验。
然而,使用 PNPM 作为 Node 版本管理器有四个缺点。
首先,PNPM 本质上不是一个 Node 版本管理器。它是一个可以管理 Node.js 版本的包管理器。你不能轻松地将其与其他包管理器如 NPM 或 Yarn 一起使用。
其次,使用 PNPM 安装的 Node.js 不包含 Corepack。以下是文档中的说明:
PNPM 环境不包括 Corepack 的二进制文件。如果你想使用 Corepack 安装其他包管理器,你需要单独安装它(例如 PNPM add -g corepack)。
第三个是 PNPM 只能全局管理 Node.js 版本。你不能为每个 shell 配置它。如果你尝试在没有 --global 标志的情况下安装,你会收到以下错误消息:
"pnpm env use" 目前只能与 "--global" 选项一起使用
当你从一个项目切换到另一个项目时,它不会动态切换 Node.js 版本。这意味着你必须自行跟踪并确保它与项目所需的版本匹配。
结论
Node.js 版本管理器已经走过了很长的路。NVM 是第一个也是相当长时间以来最流行的解决方案之一,而且仍然如此。
但生态系统正在不断发展。随着时间的推移,出现了不同的工具,如 N、FNM 和 Volta。每种工具都有其优缺点。
在这一点上,Volta 似乎是我们最具功能丰富和完整的 Node.js 版本管理器。它是跨平台的,在日常使用中提供无缝体验,并负责处理项目中使用的其他工具。
创业/副业必备:
本站已持续更新1W+创业副业顶尖课程,涵盖多个领域。
点击查看详情
评论(0)