你一定遇到过这个场景
电脑上同时维护多个前端项目,有的老项目跑在 Node 16 上,新项目已经用 Node 18 甚至 22 了。你装了 nvm-windows 来管理版本,想着 nvm use 16 切一下就行。
但很快你就发现不对劲:
- 终端 A 切到 Node 16 启动老项目
- 切到终端 B 想给新项目装个依赖,发现也是 Node 16 了
- 手动
nvm use 18切回去,终端 A 的进程不受影响,但新开的终端全是 18 - 来回切了几次,自己都忘了当前到底是哪个版本
根本原因:nvm-windows 的 nvm use 改的是全局符号链接,不是当前终端。 一个终端切换,所有终端跟着变。这跟 Mac/Linux 上的 nvm 完全不同——那边每个 shell 会话是独立的。
解决思路
既然 nvm use 会污染全局,那就不走它。
nvm-windows 把每个 Node 版本装在独立目录里,比如 C:\nvm\v16.20.2\、C:\nvm\v18.20.7\。我们只需要把对应版本的路径放到当前终端的 PATH 最前面,这个终端就优先用这个版本,完全不影响其他终端。
配合 .nvmrc 文件,进入项目目录时自动切换,离开后自动恢复,全程不用手动敲命令。
配置步骤
第一步:确认 nvm-windows 已安装并装好需要的 Node 版本
nvm list你应该能看到类似这样的输出:
* 18.20.7 (Currently using 64-bit executable)
16.20.2如果缺少版本,先装上:
nvm install 16
nvm install 18第二步:修改 ~/.bashrc
打开 Git Bash,编辑配置文件:
vim ~/.bashrc把下面这段代码粘贴进去:
# nvm-windows: 每个终端独立使用不同 Node 版本
_use_nvm_version() {
if [ -f .nvmrc ]; then
local version
version=$(cat .nvmrc | tr -d '[:space:]')
local nvm_path="/c/nvm/v${version}"
if [ -d "$nvm_path" ]; then
# 清掉 PATH 里之前加过的 nvm 版本路径
export PATH=$(echo "$PATH" | tr ':' '\n' | grep -v '/c/nvm/v' | paste -sd:)
# 把目标版本放到 PATH 最前面
export PATH="${nvm_path}:${PATH}"
echo "Using node $version (this terminal only)"
else
echo "Node $version not found in /c/nvm/"
fi
fi
}
# 重写 cd 命令:每次切换目录时自动检测 .nvmrc
cd() {
builtin cd "$@"
_use_nvm_version
}
# 终端启动时也检测一次(支持在项目目录直接打开终端)
_use_nvm_version保存退出。
注意: 如果你的 nvm-windows 不是装在默认的C:\nvm,把第 6 行/c/nvm/改成你的实际路径。可以用nvm root查看安装目录。
第三步:在项目里添加 .nvmrc 文件
在项目根目录创建一个 .nvmrc 文件,里面只写版本号:
# 老项目用 Node 16
echo "16" > .nvmrc
# 新项目用 Node 18
echo "18" > .nvmrc第四步:验证效果
重新打开 Git Bash:
# 进入有 .nvmrc 的项目目录
cd /e/my-old-project
node --version
# 输出: Using node 16 (this terminal only)
# 输出: v16.20.2
# 再开一个终端,进入另一个项目
cd /e/my-new-project
node --version
# 输出: Using node 18 (this terminal only)
# 输出: v18.20.7两个终端互不影响,全局版本也没有被改动。
原理说明
整个方案的核心只有三步:
- 读版本号:进入目录时,读取
.nvmrc文件内容(比如16) - 拼出路径:拼成
/c/nvm/v16.20.2,这就是 nvm-windows 存放该版本 Node 的目录 - 塞进 PATH:把这个路径放到当前终端的
$PATH最前面,系统就会优先从这里找node命令
因为只修改了当前终端的 $PATH 环境变量,所以不会影响全局,也不会影响其他终端。
常见问题
Q:新项目怎么接入?
A:只要在项目根目录放一个 .nvmrc 文件就自动生效,不需要改任何配置。
Q:没有 .nvmrc 的目录会怎样?
A:什么都不做,保持当前终端的 Node 版本不变。
Q:Windows CMD 或 PowerShell 也有效吗?
A:无效,这只对 Git Bash(或其他 bash 终端)生效。如果你需要在 PowerShell 里也支持,可以考虑用 nvs 或 fnm 替代 nvm-windows,它们原生支持 per-shell 切换。
Q:nvm list 显示的版本跟实际用的不一样?
A:正常。nvm list 显示的是全局符号链接指向的版本,而我们绕过了它,所以显示可能不同。以 node --version 的实际输出为准。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。