你一定遇到过这个场景

电脑上同时维护多个前端项目,有的老项目跑在 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

两个终端互不影响,全局版本也没有被改动。

原理说明

整个方案的核心只有三步:

  1. 读版本号:进入目录时,读取 .nvmrc 文件内容(比如 16
  2. 拼出路径:拼成 /c/nvm/v16.20.2,这就是 nvm-windows 存放该版本 Node 的目录
  3. 塞进 PATH:把这个路径放到当前终端的 $PATH 最前面,系统就会优先从这里找 node 命令

因为只修改了当前终端的 $PATH 环境变量,所以不会影响全局,也不会影响其他终端。

常见问题

Q:新项目怎么接入?

A:只要在项目根目录放一个 .nvmrc 文件就自动生效,不需要改任何配置。

Q:没有 .nvmrc 的目录会怎样?

A:什么都不做,保持当前终端的 Node 版本不变。

Q:Windows CMD 或 PowerShell 也有效吗?

A:无效,这只对 Git Bash(或其他 bash 终端)生效。如果你需要在 PowerShell 里也支持,可以考虑用 nvsfnm 替代 nvm-windows,它们原生支持 per-shell 切换。

Q:nvm list 显示的版本跟实际用的不一样?

A:正常。nvm list 显示的是全局符号链接指向的版本,而我们绕过了它,所以显示可能不同。以 node --version 的实际输出为准。


linvic
944 声望43 粉丝

console.log('hello FED');