今天用Claude调试以前的前端项目时,我需要使用nodejs14,按照往常的习惯直接使用nvm install 14,并且切换过去即可。但这次出问题了,我是用nvm use 14,虽然显示切换成功了,但使用node -v依旧显示的时nodejs 24的版本。后续折腾一番环境变量,终于可以切换了,但安装nodejs 14的时候又出幺蛾子了(实测nodejs 18就没问题),npm死活装不上,虽然可以通过手动下载等方式将其配置好,但也略嫌麻烦,于是就萌生了更换工具的想法。

对于Nodejs的版本管理工具,还有另外一个使用Rust实现的fnm。具体请查看Schniz/fnm: 🚀 Fast and simple Node.js version manager, built in Rust。我目前使用scoop来管理这些开发软件,所以安装也是极其方便。(别忘了先卸载nvm)

1
scoop install fnm

安装完成后,其命令几乎和nvm一样一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装node
fnm install 24
fnm install 14
# 切换版本
fnm use 14
# 查看安装了那些
fnm list
# 设置为默认版本
fnm default 24
# 卸载
fnm uninstall 18
# 查看当前使用的
fnm current
# 设置别名
fnm alias 14.21.3 project_name
# 使用别名
fnm use project_name
# 删除别名
fnm unalias project_name

和nvm替换全局不同,fnm仅仅对当前session有效。

所以,安装完成后,一般会有一段提示,让你再powershell的$PROFILE末尾配置如下:

1
2
3
4
5
# 配置 fnm 环境变量
fnm env --use-on-cd | Out-String | Invoke-Expression

# 如果是bash/zsh
eval "$(fnm env --use-on-cd)"

这个命令的作用就是进入目录后,如果当前目录存在.node-version(或者.nvmrc),并且里面是版本号时,就会自动切换到这个node版本,简直是健忘症的福音啊。所以我在每个前端的项目中,都创建了这个文件,并且指定版本:

1
2
3
4
# 在前端项目的根目录,请千万注意,不要把文件名搞成.node_version,我因为这个问题和AI讨论了一下午,AI都开始怀疑是PWS的问题了。
nvim .node-version
# 填入一个版本号,例如:
14

这样,打开不同的前端项目就会自动的切换到指定版本。

效果

它的检测顺序是:

  1. .node-version文件
  2. .nvmrc文件
  3. package.json中的engines.node字段(需启用--resolve-engines

当然,也可以零时使用某个版本来执行命令,并且不会影响已经使用其他版本运行的项目。

1
fnm exec --using=14 node index.js

这是 fnmnvm-windows 最大的技术区别:

  • nvm:通过修改系统的全局 Path 和创建硬链接来工作,容易被其他软件抢占优先级。
  • fnm:当你执行 fnm use 时,它只在当前的 PowerShell 会话(窗口)里临时修改 Path
  • 意义:这意味着你可以在窗口 A 开着 Node 14 跑老代码,窗口 B 开着 Node 24 跑新代码,互不干扰