跳至主要內容

fnm 和 nvm 对比

njr工程化frontendnodefnmnvmnode package manager大约 5 分钟约 1453 字

在管理多个 Node.js 项目(每个项目都可能需要不同的 Node 版本)时,可靠的版本管理器可以简化您的工作流程。 两种流行的选择是 fnm(Fast Node Manager)open in new windownvm(Node Version Manager)open in new window。本文从性能、功能、安装简便性、使用和兼容性等方面对 fnmnvm 进行了比较,帮助你选择最适合自己开发需求的版本管理器。

fnm 和 nvm 简介

nvm:作为最广泛使用的 Node.js 版本管理器,nvm 提供了可靠的 Node.js 版本管理。它用 Bash 编写,适用于类 UNIX 环境(如 macOS 和 Linux),也可以通过兼容的 shell(如 WSL)在 Windows 上使用。

fnmfnm 是一种较新的、快速的替代方案,由 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 ~/.bashrcsource ~/.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-versionpackages.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 配置open in new window 实现更好的使用体验。

命令对比

fnm 中的命令与 nvm 中的命令几乎完全相同,因此 nvm 用户可以根据需要更方便地切换到 fnm

对比

性能比较

安装速度:由于采用 Rust 基础和多线程架构,fnm 的速度明显更快。 与 nvm 相比,安装时间通常更快。

内存使用:fnm 针对低内存使用率进行了优化,因此在高端和资源受限的系统上都很高效。

版本切换:在 fnm 中,版本切换是即时进行的。 相比之下,nvm 可能会出现轻微延迟,尤其是在切换大量使用的版本时。

跨平台兼容性

nvm:主要为类 UNIX 系统设计。在 Windows 上,可以通过 WSL 或第三方工具(如 nvm-windows)使用。

fnm:天然支持跨平台,包括 Windows、macOS 和 Linux,适合在不同操作系统上工作。

社区和支持

nvm:用户群体庞大,文档丰富,社区资源充足,解决问题更为容易。

fnm:虽然相对较新,但 fnm 的受欢迎度迅速上升,文档特别针对安装和使用做了详细的说明。

总结

nvmfnm 都是管理 Node.js 版本的有效工具。虽然 nvm 是一个被广泛采用的选择,具有强大的社区支持,但 fnm 作为一种新兴的快速、轻量级替代方案,正在迅速崛起。对于需要跨平台兼容性和频繁版本切换的开发者来说,fnm 可能更适合,而偏好成熟工具和丰富文档支持的用户可以选择 nvm