使用 fnm 高效管理 Node.js 多版本环境
在前端与全栈开发中,不同项目往往依赖不同版本的 Node.js。过去我们常用 nvm 或 Windows 下的 nvm-windows,但它们不仅切换较慢、在 Windows 上往往需要管理员权限修改符号链接,且不同终端窗口之间容易产生全局状态冲突。
fnm (Fast Node Manager) 是一个使用 Rust 编写的全平台 Node.js 版本管理工具,具有以下突出优势:
- ⚡ 极致性能:启动和切换极快,终端几乎感觉不到任何延迟;
- 💻 跨平台一致性:同时原生支持 Windows、macOS 与 Linux;
- 🔀 终端环境独立:基于进程会话(multishell)机制,不同终端窗口可以同时运行互不干扰的不同 Node.js 版本;
- 📂 自动感知与切换:支持
--use-on-cd,进入包含.node-version或.nvmrc的项目目录时自动切换版本。
1. 安装与环境配置
Windows
推荐使用系统自带的 winget 包管理器一键安装:
winget install Schniz.fnm
亦可使用 Scoop(
scoop install fnm)或 Chocolatey(choco install fnm)进行安装。
配置 PowerShell 环境变量与自动清理
安装完成后需要让 PowerShell 加载 fnm 的环境变量与钩子(Hook)。在 PowerShell 中执行以下命令编辑配置文件:
notepad $PROFILE
在打开的 $PROFILE 文件末尾追加以下内容并保存:
# 1. 加载 fnm 环境变量,并在切换目录时自动根据 .node-version / .nvmrc 切换版本
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
# 2. 定期清理 1 天前的 fnm 临时文件夹
# 原理:fnm 在 Windows 下通过在临时目录生成指向真实 Node 路径的软链接实现多终端隔离,但这些临时目录不会自动清理
Get-ChildItem -Path "$env:LOCALAPPDATA\fnm_multishells" -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-1) } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
保存后,重启 PowerShell 或执行 . $PROFILE 即可生效。
macOS 与 Linux
macOS
通过 Homebrew 即可完成安装:
brew install fnm
Linux
通过官方提供的脚本快速安装:
curl -fsSL https://fnm.vercel.app/install | bash
Shell 自动加载配置
对于使用 bash 或 zsh 的环境,官方安装脚本通常会自动写入配置。若未自动写入,可在 ~/.bashrc 或 ~/.zshrc 中手动添加:
eval "$(fnm env --use-on-cd)"
小贴士:Linux 下
fnm env默认使用/run/user/<UID>/fnm_multishells作为临时目录,该目录挂载于内存临时文件系统(tmpfs),系统重启后会自动释放,因此无需像 Windows 一样配置定期清理脚本。
2. 常用操作命令
安装 Node.js 版本
# 安装最新的 LTS(长期支持)版本(强烈推荐日常开发使用)
fnm install --lts
# 安装最新版本(Current)
fnm install latest
# 指定主版本号(自动拉取该大版本的最新次版本)
fnm install 22
# 安装具体版本号
fnm install 22.14.0
查看版本列表
# 查看本地已安装的 Node.js 版本列表(带 * 号为当前终端使用的版本)
fnm ls
# 查看当前终端正在使用的 Node.js 版本
fnm current
# 查询远程官方源中可安装的所有版本
fnm ls-remote
切换与设置默认版本
# 切换当前终端会话使用的版本(仅当前窗口生效,不影响其他终端)
fnm use 22
# 设置全局默认版本(新打开终端时的默认激活版本)
fnm default 22
卸载版本
# 卸载指定版本以释放磁盘空间
fnm uninstall 18.20.0
3. 项目级自动版本管理
团队协作时,不同项目对 Node.js 运行时有严格要求。借助 fnm 的 --use-on-cd 功能,只需在项目根目录新建一个 .node-version 或 .nvmrc 文件,写入需要的版本号:
22
当终端 cd 进入该目录时,fnm 会自动检测并切换到对应版本;如果本地未安装该版本,终端还会贴心提示你运行 fnm install。
4. 进阶技巧:国内镜像加速下载
若在国内网络环境下下载 Node.js 较慢,可通过设置环境变量 FNM_NODE_DIST_MIRROR 指定镜像源(例如华为云源、淘宝源或高校镜像源):
PowerShell(添加到 $PROFILE):
$env:FNM_NODE_DIST_MIRROR = "https://repo.huaweicloud.com/nodejs/"
Bash / Zsh(添加到 ~/.bashrc 或 ~/.zshrc):
export FNM_NODE_DIST_MIRROR="https://repo.huaweicloud.com/nodejs/"