FNM vs NVM

7 阅读6分钟

fnmnvm 都是非常优秀的 Node.js 版本管理工具,核心功能相同,但在设计哲学、性能和跨平台体验上有着本质的区别。

简单来说,nvm 是久经考验的“老将”,而 fnm 是速度更快、体验更现代的“新星”

核心差异一览

对比维度nvm (Node Version Manager)fnm (Fast Node Manager)
开发语言Shell 脚本 (Bash)Rust 语言
核心优势生态成熟、文档丰富、社区庞大极快的速度、极低的内存占用
启动速度较慢 (约 200-400ms),每次打开终端都需要加载脚本极快 (<10ms),编译为本地二进制文件执行
跨平台支持不统一
- macOS/Linux: 使用 nvm
- Windows: 需使用独立的 nvm-windows
完全统一
一个工具原生支持 Windows、macOS、Linux
自动切换版本需要手动编写 Shell 脚本或安装插件才能实现开箱即用
进入目录自动读取 .node-version.nvmrc 文件并切换
支持的版本文件.nvmrc.node-version, .nvmrc, package.json (engines字段)
安装方式macOS/Linux 通过 curl 脚本;Windows 需下载独立安装程序统一且简单
包管理器一键安装 (如 brew install fnmwinget install Schniz.fnm)
Apple Silicon (M1/M2)支持,但非原生或存在兼容性问题原生支持,性能表现更好

详细解读

1. 🚀 性能:fnm 的绝对优势

这是两者最直观的区别。nvm 是 Shell 脚本,每次启动新终端都要加载大量脚本代码,会有明显的延迟。而 fnm 用 Rust 编写,是编译后的二进制程序,启动和切换版本几乎是瞬时的。实测数据显示,fnm 的启动速度比 nvm20-40 倍

2. 💻 跨平台体验:fnm 更省心

如果你只在 macOS 或 Linux 上开发,这点可能不明显。但如果你需要在 Windows 上工作(或团队中有使用 Windows 的同事),fnm 的优势就体现出来了:

  • nvm:在 macOS/Linux 上用 nvm,在 Windows 上需要安装另一个工具 nvm-windows。这两个工具的命令和配置方式并不完全相同,带来了额外的切换成本。
  • fnm:在三个主流操作系统上,安装方式、命令和环境配置完全一致,真正做到“一次学习,处处使用”。

3. 🔄 自动化:fnm 更智能

在日常开发中,我们经常需要在不同 Node 版本的项目间切换。

  • nvm:你需要在项目根目录创建 .nvmrc 文件,然后每次 cd 进入项目后,手动运行 nvm use 命令。
  • fnm:创建好 .node-version.nvmrc 文件后,只需在 Shell 配置中加上 --use-on-cd 参数,之后每次 cd 进入项目,版本会自动切换,无需任何手动操作。

如何选择?

  • 选择 nvm,如果:

    • 你主要在 macOS/Linux 上开发,且对终端启动速度不敏感。
    • 你正在维护一个有大量历史配置的老项目,团队已深度依赖 nvm。
    • 你需要用到一些依赖 nvm 特定实现的复杂 Shell 脚本或插件。
  • 选择 fnm,如果:

    • 你是新用户,希望一步到位选择体验最好的工具。
    • 你追求极致的开发效率和流畅的终端体验。
    • 你需要在 Windows、macOS 和 Linux 多平台之间切换开发。
    • 你使用 Apple Silicon (M1/M2) 芯片的 Mac,希望获得原生性能。
    • 你希望实现项目 Node 版本的全自动切换

💡 迁移提示nvm 迁移到 fnm 的成本很低。fnm 完全兼容 .nvmrc 文件,你只需安装 fnm,调整 Shell 配置,然后重新安装需要的 Node 版本即可。原有的项目配置无需任何修改。

两者都是优秀的工具,选择哪个主要取决于你对性能、跨平台和现代化体验的追求程度。

FNM使用方法

以下是 fnm 的常用命令和使用方法。fnm 的命令风格与 nvm 类似,上手很快。

💡 使用任何命令前,请确保已正确安装并配置 Shell 环境(安装脚本通常会自动完成配置)。配置完成后,重新打开终端或执行 source ~/.zshrc(或对应的配置文件)使配置生效。


📦 版本管理核心命令

操作命令示例说明
安装指定版本fnm install 18.17.0安装具体的版本号
安装最新 LTSfnm install --lts安装最新的长期支持版本
安装最新稳定版fnm install latest安装最新的稳定版本
切换使用版本fnm use 18.17.0在当前终端会话中切换到指定版本
设置默认版本fnm default 18.17.0设置新终端窗口默认使用的版本
查看已安装版本fnm listfnm ls列出本地已安装的所有 Node 版本
查看可用版本fnm list-remotefnm ls-remote列出所有可以安装的远程版本
查看当前版本fnm current显示当前正在使用的 Node 版本
卸载版本fnm uninstall 18.17.0移除某个已安装的版本

🚀 进阶与自动化技巧

1. 版本别名

可以为常用的版本设置一个简短易记的别名,方便切换。

# 设置别名
fnm alias 20.11.0 my-project

# 使用别名切换
fnm use my-project

# 移除别名
fnm unalias my-project

2. 项目级自动切换(推荐 ⭐)

这是 fnm 最实用的特性之一,可以实现 cd 进入项目目录时自动切换到对应 Node 版本。

首先,在项目根目录下创建一个 .node-version.nvmrc 文件,并在其中写入所需的 Node 版本号:

echo "20.11.0" > .node-version

然后,确保在 Shell 配置中启用了 --use-on-cd 选项(大多数安装脚本已默认开启)。如果你手动配置,需要在 ~/.zshrc~/.bashrc 中添加:

eval "$(fnm env --use-on-cd)"

配置完成后,每次 cd 进入包含该文件的目录,fnm 就会自动切换到相应的 Node 版本。


⚙️ 其他实用命令

  • 查看帮助fnm --helpfnm install --help 查看特定命令的帮助信息。
  • Shell 自动补全fnm completions --shell <SHELL> 可以生成补全脚本,提升命令行操作效率。<SHELL> 可以是 zshbashfishpowershell

🛠️ 常用工作流示例

一个典型的 fnm 使用流程如下:

  1. 初次设置:安装并设置默认版本。

    fnm install 20     # 安装 Node 20 的最新版本
    fnm default 20     # 将其设为默认版本
    
  2. 接手旧项目:进入项目目录,自动切换版本。

    cd my-old-project  # 假设项目中有 .node-version 文件,版本会自动切换
    node -v            # 验证版本
    
  3. 尝鲜新特性:临时安装并使用新版,不影响其他窗口。

    fnm install 22     # 安装新版本
    fnm use 22         # 当前终端临时使用 Node 22
    node -v            # 验证版本,其他终端窗口仍使用默认的 Node 20
    
  4. 清理空间:移除不再需要的旧版本。

    fnm uninstall 14   # 移除 Node 14
    

如果你是刚接触 fnm,建议从版本管理核心命令开始尝试,并尽快在项目中引入 .node-version 文件来体验自动切换的便利。