fnm 和 nvm 都是非常优秀的 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 fnm, winget install Schniz.fnm) |
| Apple Silicon (M1/M2) | 支持,但非原生或存在兼容性问题 | 原生支持,性能表现更好 |
详细解读
1. 🚀 性能:fnm 的绝对优势
这是两者最直观的区别。nvm 是 Shell 脚本,每次启动新终端都要加载大量脚本代码,会有明显的延迟。而 fnm 用 Rust 编写,是编译后的二进制程序,启动和切换版本几乎是瞬时的。实测数据显示,fnm 的启动速度比 nvm 快 20-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 | 安装具体的版本号 |
| 安装最新 LTS | fnm install --lts | 安装最新的长期支持版本 |
| 安装最新稳定版 | fnm install latest | 安装最新的稳定版本 |
| 切换使用版本 | fnm use 18.17.0 | 在当前终端会话中切换到指定版本 |
| 设置默认版本 | fnm default 18.17.0 | 设置新终端窗口默认使用的版本 |
| 查看已安装版本 | fnm list 或 fnm ls | 列出本地已安装的所有 Node 版本 |
| 查看可用版本 | fnm list-remote 或 fnm 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 --help或fnm install --help查看特定命令的帮助信息。 - Shell 自动补全:
fnm completions --shell <SHELL>可以生成补全脚本,提升命令行操作效率。<SHELL>可以是zsh、bash、fish或powershell。
🛠️ 常用工作流示例
一个典型的 fnm 使用流程如下:
-
初次设置:安装并设置默认版本。
fnm install 20 # 安装 Node 20 的最新版本 fnm default 20 # 将其设为默认版本 -
接手旧项目:进入项目目录,自动切换版本。
cd my-old-project # 假设项目中有 .node-version 文件,版本会自动切换 node -v # 验证版本 -
尝鲜新特性:临时安装并使用新版,不影响其他窗口。
fnm install 22 # 安装新版本 fnm use 22 # 当前终端临时使用 Node 22 node -v # 验证版本,其他终端窗口仍使用默认的 Node 20 -
清理空间:移除不再需要的旧版本。
fnm uninstall 14 # 移除 Node 14
如果你是刚接触 fnm,建议从版本管理核心命令开始尝试,并尽快在项目中引入 .node-version 文件来体验自动切换的便利。