← ARCHIVE // 返回文章列表⚡ LEVEL 5 READING TERMINAL
⚡ (Updated: )

使用 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/"

5. 参考链接