fnm 是一款快速简单跨平台的 Node.js 版本管理器,使用 Rust 构建。

# 安装 fnm
winget install Schniz.fnm
fnm --version
fnm current
# 查看最新版本
fnm ls-remote --lts --latest
# 安装版本
fnm install 24.12.0
# 使用指定版本
fnm use 24.12.0
# 固化nodejs,管 Node.js 版本
node --version | ForEach-Object { $_ -replace '^v', '' } | Set-Content -NoNewline -Encoding utf8 .node-version

# 检查有没有 Corepack,输出类似 0.34.0,表示存在
corepack --version
# 查路径
Get-Command corepack
where.exe corepack

# 启用 Corepack
corepack enable
# 只启用 pnpm
corepack enable pnpm
# 固定版本,具体 pnpm 版本使用 pnpm --version 获取
corepack use [email protected]
npm pkg set "engines.node=>=22"
# 执行后,package.json 里会出现类似
# {
#   "packageManager": "[email protected]"
# }
# 更加稳妥保守,指定 pnpm 和 node 版本
# {
#   "packageManager": "[email protected]",
#   "engines": {
#     "node": ">=22 <23"
#   }
# }

1. 安装 fnm

打开 PowerShell,执行以下安装 fnm(或者直接 github 下载 win 版的 exe 文件然后添加路径到 Path 即可):

winget install Schniz.fnm

安装后关闭并重新打开终端,检查:

fnm --version

2. 配置 PowerShell 自动加载 fnm

创建并打开 PowerShell profile,实现检查配置文件是否存在,如果不存在,就自动新建一个:

if (-not (Test-Path $PROFILE)) { New-Item $PROFILE -Force }
notepad $PROFILE

把这一行加到文件末尾:

fnm env --use-on-cd --version-file-strategy=recursive --shell powershell | Out-String | Invoke-Expression

然后重启终端。

这行配置的作用是:进入项目目录时,fnm 会根据 .node-version.nvmrc 自动切换 Node 版本;recursive 可以让子目录也继承父目录里的版本文件。fnm 官方也推荐 --use-on-cd,并建议显式指定 shell。

3. 项目级最佳实践

在每个项目根目录提交一个 .node-version

node --version | ForEach-Object { $_ -replace '^v', '' } | Set-Content -NoNewline -Encoding utf8 .node-version
cat .node-version
# 24.12.0
git add .node-version
git commit -m "chore: pin node version"

以后进入项目目录时自动切换:

cd your-project
node -v

第一次进项目,如果版本还没装:

fnm install
fnm use

fnm 的命令支持 installusedefaultcurrentlistlist-remote 等,fnm install 也支持 --ltsfnm use 支持缺失版本自动安装参数。

4. 常用命令速查

场景 命令
查看本机已装版本 fnm ls
查看远程可装版本 fnm ls-remote
查看最新 LTS fnm ls-remote --lts --latest
安装 LTS fnm install --lts
安装指定版本 fnm install 24 / fnm install 22.13.1
切换版本 fnm use 24
设置默认版本 fnm default 24
查看当前版本 fnm current
卸载版本 fnm uninstall 22

5. 推荐工作流(新 Node.js 项目)

核心思路:项目根目录放版本文件,fnm 自动切换 Node 版本,包管理器交给 Corepack/lockfile。

1. 先配置 PowerShell 自动切换

Windows 11 常用 PowerShell。打开 PowerShell,执行:

if (-not (Test-Path $PROFILE)) { New-Item $PROFILE -Force }
notepad $PROFILE

在打开的 profile 文件末尾加:

fnm env --use-on-cd --shell powershell --version-file-strategy=recursive --corepack-enabled | Out-String | Invoke-Expression

然后重新打开终端。

--use-on-cd 会在进入目录时自动根据 .node-version.nvmrc 切换版本;--version-file-strategy=recursive 适合项目里进入 src/packages/xxx/ 等子目录时仍然识别根目录版本文件。fnm 官方也建议 shell 初始化时显式指定 shell,且支持 .node-version / .nvmrc

验证:

fnm --version
fnm current
node -v
npm -v

2. 新项目:先看项目有没有版本文件

进入项目根目录:

cd path\to\project
dir -Force

优先找这些文件:

.node-version
.nvmrc
package.json
pnpm-lock.yaml / yarn.lock / package-lock.json

fnm 支持 .node-version.nvmrc,没有传版本时也能根据当前目录的版本文件解析要用的 Node。


3. 如果项目已有 .node-version.nvmrc

直接:

fnm install
fnm use
node -v

或者更省事:

fnm use --install-if-missing

fnm install 可以不带版本,从项目版本文件读取;fnm use --install-if-missing 会在缺少该版本时自动安装。

然后安装依赖:

corepack enable

看 lockfile 选择:

pnpm install
# 或
yarn install
# 或
npm install

更推荐用项目已有的 lockfile 对应包管理器:

文件 命令
pnpm-lock.yaml pnpm install
yarn.lock yarn install
package-lock.json npm install

4. 如果项目没有版本文件

建议先选 当前 LTS

fnm install --lts
fnm use --lts
node -v

然后把当前 Node 版本固定到项目里:

node --version | ForEach-Object { $_ -replace '^v', '' } | Set-Content -NoNewline -Encoding utf8 .node-version

也可以只写主版本,例如:

"22" | Set-Content .node-version

区别是:

22        # 使用最新 22.x.x,适合大多数项目
22.11     # 使用最新 22.11.x
22.11.0   # 精确锁死版本

团队项目更推荐 .node-version主版本精确版本

22

如果团队对构建一致性要求高,比如 CI/CD、桌面端、Electron、生产部署,写精确版本:

22.11.0

5. 推荐提交到 Git 的文件

新项目建议至少提交:

.node-version
package.json
pnpm-lock.yaml / yarn.lock / package-lock.json

如果用 pnpm,推荐在 package.json 里加:

{
  "packageManager": "[email protected]",
  "engines": {
    "node": ">=22 <23"
  }
}

然后:

corepack enable
pnpm install

--corepack-enabled 会让 fnm 在新安装 Node 时启用 Corepack;fnm 文档也说明它会调用 corepack enable

6. 其它

先用 fnm 安装/启用 Node(PowerShell)

先确认有没有 node/npm:

node -v
npm -v

如果提示找不到命令,就用 fnm 装一个 LTS(比如 Node 24):

fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
fnm install 24
fnm use 24
fnm default 24
node -v
npm -v
npm i -g @openai/codex@latest
codex --version
codex

如果你已经能看到 node -v / npm -v 输出,就可以直接跳到下一步。

让 PowerShell 每次打开都自动注入 PATH

把 fnm 的环境注入写进 $PROFILE,不然经常会出现“新开窗口 node 找不到”的问题:

notepad $PROFILE

在文件里加一行:

fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression

保存后重新打开 PowerShell,再跑一次:

node -v
npm -v

执行 notepad $PROFILE 时提示文件不存在

当执行 notepad $PROFILE 时提示文件不存在,是因为PowerShell配置文件尚未创建。PowerShell的$PROFILE变量指向当前用户配置文件的路径,但该文件默认不存在,需手动创建。

配置文件路径由PowerShell版本决定: 对于Windows PowerShell(v5.1), 路径通常为$env:USERPROFILE\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1; 对于PowerShell Core(v6+), 路径为$env:USERPROFILE\Documents\PowerShell\Microsoft.PowerShell_profile.ps1。 可通过运行$PROFILE命令查看具体路径。

创建配置文件的方法: 推荐使用PowerShell命令自动创建,避免手动操作。以管理员身份打开PowerShell,执行以下命令:

New-Item -Path $PROFILE -ItemType File -Force

此命令会创建文件及缺失的目录结构。创建后,使用notepad $PROFILE即可正常打开编辑。

常见问题处理: 如果遇到执行策略限制,可运行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser允许脚本执行。 若配置文件内容有语法错误(如conda初始化问题),需检查并修正错误,例如清理PATH环境变量中的多余引号。

pnpm

pnpm 不是 Node/npm 自带的,需要你额外安装/启用。而且用 fnm 切换不同 Node 版本时,“全局安装的工具”也可能跟着变(因为每个 Node 版本的全局 npm 目录是独立的)。

✅ 最佳实践:用 Corepack 管理 pnpm(推荐)

Corepack 是 Node 自带的“包管理器分发器”(Node ≥ 16.13 / 18+ 基本都带),最适合配合 fnm。

1) 确认版本

node -v
npm -v

2) 启用并激活 pnpm

# 切换 Node 版本后 pnpm 又没了
# 解决方式(简单粗暴且稳定):每次切完 Node 都跑一次
corepack enable
corepack prepare pnpm@latest --activate
pnpm -v

这会让 pnpm 可用,而且你可以把 pnpm 版本“固定”在项目里,团队一致性最好。

3) 在项目里固定 pnpm 版本(强烈推荐)

package.json 加上:

{
  "packageManager": "[email protected]"
}

以后新人只要:

corepack enable
pnpm -v

就能自动拿到项目指定版本(不会“我这台可以你那台不行”)。

fnm 安装目录

fnm install 24 装下来的 Node.js 文件都放在 FNM_DIR 下面FNM_DIR 是 fnm 的“安装根目录”环境变量)。

一般目录结构是:

  • Node 版本本体$FNM_DIR/node-versions/v24.x.y/installation/

    • Windows 例子:C:\Users\<你>\AppData\Roaming\fnm\node-versions\v22.14.0\installation(v24 也是同样结构)
  • 别名(default 等):$FNM_DIR/aliases/(例如 default)

  • 每个 shell 会话用的临时链接目录FNM_MULTISHELL_PATH(fnm 用它来动态改 PATH)

各系统默认 FNM_DIR 常见位置

  • Windows%USERPROFILE%\AppData\Roaming\fnm
  • macOS / Linux:通常跟着 fnm 默认数据目录走(README 里给的是 $XDG_DATA_HOME/fnm,没设就回退到 Linux ~/.local/share/fnm、macOS ~/Library/Application Support/fnm)。 ([GitHub][5])

你看到的“24”会被解析成“最新的 v24.x.y”,所以实际文件夹名会是 v24.?.?(不是只有 24)。

最靠谱的定位方法

通用:先看 fnm 根目录(FNM_DIR)
  • macOS/Linux:
echo "$FNM_DIR"
fnm env --json | sed -n '1,120p'
  • Windows PowerShell:
$env:FNM_DIR
fnm env --json
看“node 可执行文件”到底指向哪
  • macOS/Linux:
fnm use 24
which node
node -v
  • Windows(PowerShell / CMD 都行):
fnm use 24
where.exe node
node -v

找到路径后,你就能在文件系统里定位到对应的: ...\fnm\node-versions\v24.x.y\installation\(Windows)或 .../fnm/node-versions/v24.x.y/installation/(macOS/Linux)。