为什么 2025 年我建议你把 nvm 换成 fnm?

85 阅读3分钟

在 Node.js 开发领域,nvm(Node Version Manager)曾经是绝对的统治者。但随着前端工程化对效率的追求,越来越多的开发者开始转向 fnm (Fast Node Manager)

本文将为你解析为什么你应该考虑“弃坑” nvm,并手把手教你如何切换到 fnm。


一、 为什么我们开始“嫌弃” nvm?

虽然 nvm 依然是行业标准,但在现代开发环境下,它暴露出了三个核心痛点:

1. 启动延迟(致命伤)

nvm 是由纯 Shell 脚本编写的。每次你新建一个终端窗口,Shell 都要加载一遍 nvm 的环境初始化脚本。

  • 后果: 你的终端启动可能会慢 0.5s 到 2s。对于每天打开无数次终端的开发者来说,这种“粘滞感”非常影响体验。

2. 跨平台支持混乱

nvm 原生只支持 macOS 和 Linux。Windows 用户必须使用 nvm-windows,虽然名字相近,但它们是完全不同的两个项目,命令参数和行为逻辑并不完全统一。

3. 运行性能

由于基于 Shell 脚本,在大规模并发或自动化脚本中,nvm 切换版本的效率相对较低。


二、 认识 fnm:新一代版本管理器

fnm 是由 Rust 编写的 Node.js 版本管理器,它的目标只有三个:快、跨平台、简单

fnm 的核心优势

  • 极致速度: 得益于 Rust 的高性能,fnm 比 nvm 快得多。它在初始化时几乎是瞬间完成,不会拖慢终端启动速度。
  • 单文件二进制: 它是编译好的二进制文件,不依赖庞大的脚本库。
  • 真正的跨平台: Windows、macOS、Linux 使用同一套代码,命令完全一致。
  • 自动切换版本: 只要目录中有 .nvmrc.node-version 文件,fnm 可以在你 cd 进入目录时自动切换 Node 版本。

三、 fnm 安装与使用指南

1. 安装方式

  • macOS / Linux:

    Bash

    curl -fsSL https://fnm.vercel.app/install | bash
    
  • Windows (使用 Scoop 或 Winget):

    PowerShell

    winget install Schniz.fnm
    # 或者使用 Scoop
    scoop install fnm
    

2. 配置环境变量

安装完成后,你需要将 fnm 挂载到你的 Shell(如 .zshrc, .bashrc 或 PowerShell Profile)中,这样它才能实现“自动切换”功能。

Zsh 用户示例:

在 ~/.zshrc 末尾添加:

Bash

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

3. 常用命令对比

常用操作fnm 命令对应 nvm 命令
安装指定版本fnm install 20nvm install 20
切换版本fnm use 18nvm use 18
查看本地已安装fnm listnvm ls
查看远程可安装fnm list-remotenvm ls-remote
设置默认版本fnm default 20nvm alias default 20
卸载版本fnm uninstall 16nvm uninstall 16

四、 总结:你应该换吗?

  • 如果你追求终端秒开的快感,且厌倦了在不同系统间记两套命令,fnm 是目前的最优解
  • 如果你习惯于老牌工具的稳定性,且不在乎那 1 秒钟的启动延迟,继续使用 nvm 也没有任何问题。

迁移小贴士: 卸载 nvm 前,建议先截图 nvm ls 记下已安装的版本,然后使用 fnm 重新安装。由于 fnm 支持读取 .nvmrc 文件,你不需要修改项目中的任何配置。

你想尝试在你的电脑上配置 fnm 的自动切换功能吗?我可以为你提供具体的配置代码。