必须双路配置终端环境和调试器 runtimeExecutable:仅配终端F5仍用旧Node,仅配调试器npm命令会失败;VSCode调试器不继承终端PATH,需在launch.json中设"runtimeExecutable": "${env:NVM_BIN}/node"并验证NVM_BIN有效。

必须双路配置:终端环境 + 调试器 runtimeExecutable,缺一不可。只配终端,F5 调试仍用旧 Node;只配调试器,npm run、npx 命令会失败。
终端里 node -v 对了,但 F5 调试还是旧版本?
VSCode 调试器(type: "node")启动时捕获的是进程启动瞬间的环境快照,不继承终端的 PATH 或 NVM_BIN。它根本不知道你刚在终端里执行了 nvm use 18.19.0。
- 必须在项目根目录的
.vscode/launch.json中显式写入:"runtimeExecutable": "${env:NVM_BIN}/node" - 验证
NVM_BIN是否可用:新开集成终端,运行echo $NVM_BIN,有输出才有效;没输出说明 nvm 没加载 - 不要硬编码路径,如
"runtimeExecutable": "/Users/x/.nvm/versions/node/v18.19.0/bin/node"—— 换机器或重装 nvm 就失效 - F5 启动后,在代码里加
console.log(process.version),这才是真实运行时版本
新开终端还是系统自带 node?检查 shell 初始化是否被跳过
VSCode 集成终端默认不是 login shell,~/.zshrc 或 ~/.bash_profile 里的 nvm 初始化逻辑(如 source ~/.nvm/nvm.sh)压根不会执行。
- macOS/Linux:在
settings.json中设"terminal.integrated.inheritEnv": true,然后完全退出 VSCode(不只是关窗口)再重开 - 或更稳妥:在工作区
.vscode/settings.json中补全环境变量:"terminal.integrated.env.zsh": { "NVM_DIR": "/Users/you/.nvm", "PATH": "/Users/you/.nvm/bin:${env:PATH}" } - Windows PowerShell:确保
$PROFILE里有Import-Module "$env:USERPROFILE\.nvm\nvm.ps1",且终端 profile 显式设为 PowerShell - 验证:新开终端后运行
which nvm和nvm current,两者都应返回合理值
想打开项目就自动切 Node 版本?别指望“静默”
.nvmrc 文件只是声明,没人读它就等于不存在。VSCode 不原生解析它,nvm 本身也不会自动触发 nvm use。
- 最轻量做法:项目根目录放
.nvmrc(内容如v16.20.2),每次打开项目后手动跑一次nvm use - 省事一点:装插件
vsc-nvm,它会在新终端启动时自动检测并执行nvm use(注意:已存在的终端需重启才生效) - Volta 用户注意:
.nvmrc写范围(如^18)无效,只能用具体版本或别名(如lts),且必须先运行volta pin node@18.19.0生成.node-version
真正容易被忽略的是:终端和调试器是两个独立进程,它们各自加载环境的方式完全不同。哪怕你把 PATH、NVM_BIN、NODE_ENV 全配对了,只要 launch.json 里没写 runtimeExecutable,F5 就永远走不通。这不是 bug,是设计使然。


















