fnm 和 nvm 对比
在管理多个 Node.js 项目(每个项目都可能需要不同的 Node 版本)时,可靠的版本管理器可以简化您的工作流程。 两种流行的选择是 fnm(Fast Node Manager) 和 nvm(Node Version Manager)。本文从性能、功能、安装简便性、使用和兼容性等方面对 fnm 和 nvm 进行了比较,帮助你选择最适合自己开发需求的版本管理器。
fnm 和 nvm 简介
nvm:作为最广泛使用的 Node.js 版本管理器,nvm 提供了可靠的 Node.js 版本管理。它用 Bash 编写,适用于类 UNIX 环境(如 macOS 和 Linux),也可以通过兼容的 shell(如 WSL)在 Windows 上使用。
fnm:fnm 是一种较新的、快速的替代方案,由 Rust 编写,以其速度闻名。fnm 支持多线程,因此在安装和切换 Node 版本时特别快。它还提供跨平台支持,包括 WSL、macOS 和 Windows。
安装
nvm
要安装 nvm,在 UNIX 系统或 Windows 的 WSL 上运行以下命令:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
或者使用 wget:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
安装完成之后,在 ~/.bashrc 或 ~/.zshrc 中添加以下内容:
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
重启终端或运行 source ~/.bashrc 或 source ~/.zshrc 使配置生效,然后检查 nvm 是否安装成功:
nvm --version
fnm
在 UNIX 系统上,可以运行脚本或使用 homebrew 安装 fnm:
# 运行脚本安装
curl -fsSL https://fnm.vercel.app/install | bash
# 或使用 homebrew 安装
brew install fnm
在 Windows 上,可以使用 PowerShell 安装 fnm:
winget install Schniz.fnm
安装完成后,需要设置环境变量。
~/.bashrc:
eval "$(fnm env --use-on-cd --shell bash)"
~/.zshrc:
eval "$(fnm env --use-on-cd --shell zsh)"
PowerShell:
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
重启终端使配置生效,然后检查 fnm 是否安装成功:
fnm --version
使用
nvm
安装 Node.js 版本
nvm install <version>
切换 Node.js 版本
nvm use <version>
设置默认 Node.js 版本
nvm alias default <version>
列出所有已安装的 Node.js 版本
nvm ls
自动切换版本
nvm 默认没有支持根据 .nvmrc 文件自动切换版本,需要在 ~/.bashrc 或 ~/.zshrc 中添加以下内容:
# 自动使用 .nvmrc 文件中定义的 Node 版本
auto_nvm_use() {
  # 如果存在 .nvmrc 文件,则切换到该文件指定的版本
  if [ -f ".nvmrc" ]; then
    local nvmrc_version
    nvmrc_version=$(<.nvmrc)
    # 检查当前版本是否与 .nvmrc 中的版本不同
    if [ "$(nvm version)" != "v$nvmrc_version" ]; then
      nvm use "$nvmrc_version" || echo "NVM: Version $nvmrc_version specified in .nvmrc is not installed."
    fi
  fi
}
# 针对 Bash 的目录切换钩子
if [ -n "$BASH_VERSION" ]; then
  PROMPT_COMMAND="auto_nvm_use;$PROMPT_COMMAND"
fi
# 针对 Zsh 的目录切换钩子
if [ -n "$ZSH_VERSION" ]; then
  autoload -U add-zsh-hook
  add-zsh-hook chpwd auto_nvm_use
  auto_nvm_use  # 立即执行一次,适配启动后的初始目录
fi
同时,如果想要支持递归查找版本文件,也需要自己实现。
fnm
安装 Node.js 版本
fnm install <version>
切换 Node.js 版本
fnm use <version>
设置默认 Node.js 版本
fnm alias default <version>
列出所有已安装的 Node.js 版本
fnm ls
自动切换版本
fnm 默认支持根据 .nvmrc、.node-version 或 packages.json#engines#node(如果 --resolve-engines 启用)文件自动切换版本,只需要在 ~/.bashrc 或 ~/.zshrc 中添加以下内容,--use-on-cd 表示根据当前目录下的 .nvmrc 文件自动切换版本,--version-file-strategy=recursive 表示递归查找版本文件。
eval "$(fnm env --use-on-cd --version-file-strategy=recursive)"
提示
fnm 开箱即带许多功能。其中一些默认情况下不会激活,因为它们会改变 shell 的默认行为,还有一些只是功能标志,以避免破坏性更改,或者只是实验性的,直到我们认为值得引入它们为止。
所有这些功能都可以通过在初始化 shell 时为 fnm env 调用添加标志来配置。例如,如果你的 shell 设置为 eval "$(fnm env)",那么你可以添加一个标志,将其更改为 eval "$(fnm env --my-flag=value)"。
详细可以查看配置文档:fnm 配置 实现更好的使用体验。
命令对比
fnm 中的命令与 nvm 中的命令几乎完全相同,因此 nvm 用户可以根据需要更方便地切换到 fnm。
对比
性能比较
安装速度:由于采用 Rust 基础和多线程架构,fnm 的速度明显更快。 与 nvm 相比,安装时间通常更快。
内存使用:fnm 针对低内存使用率进行了优化,因此在高端和资源受限的系统上都很高效。
版本切换:在 fnm 中,版本切换是即时进行的。 相比之下,nvm 可能会出现轻微延迟,尤其是在切换大量使用的版本时。
跨平台兼容性
nvm:主要为类 UNIX 系统设计。在 Windows 上,可以通过 WSL 或第三方工具(如 nvm-windows)使用。
fnm:天然支持跨平台,包括 Windows、macOS 和 Linux,适合在不同操作系统上工作。
社区和支持
nvm:用户群体庞大,文档丰富,社区资源充足,解决问题更为容易。
fnm:虽然相对较新,但 fnm 的受欢迎度迅速上升,文档特别针对安装和使用做了详细的说明。
总结
nvm 和 fnm 都是管理 Node.js 版本的有效工具。虽然 nvm 是一个被广泛采用的选择,具有强大的社区支持,但 fnm 作为一种新兴的快速、轻量级替代方案,正在迅速崛起。对于需要跨平台兼容性和频繁版本切换的开发者来说,fnm 可能更适合,而偏好成熟工具和丰富文档支持的用户可以选择 nvm。