vscode调试器默认不继承终端环境变量,必须同时启用terminal.integrated.inheritenv为true并配置launch.json中"runtimeexecutable": "${env:nvm_bin}/node",否则f5调试仍会使用旧node版本。

VSCode 本身不感知 nvm 切换的 Node 版本,只靠终端里执行 nvm use 是不够的——F5 调试仍可能跑错版本。必须同时配置终端环境继承 + 调试器运行路径,缺一不可。
终端里 node -v 对了,但 F5 调试还是旧版?
这是最典型的“半生效”现象:VSCode 调试器(type: "node")启动时读的是进程启动那一刻的环境变量快照,不是你当前终端里 nvm use 后的 PATH 或 NVM_BIN。
-
which node在集成终端中返回~/.nvm/versions/node/v18.19.0/bin/node,但process.version打印v16.20.2→ 说明调试器没走你刚切的版本 - 报错
Cannot find module 'node:fs'→ Node.js 16 不支持node:协议,实际在跑旧版 - 根本原因:调试器默认不继承终端环境,也不重新解析
PATH
launch.json 必须显式指定 runtimeExecutable
不能依赖“自动查找”,必须用环境变量动态指向当前 nvm 激活的版本。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- 正确写法:
"runtimeExecutable": "${env:NVM_BIN}/node" - 前提:终端里
echo $NVM_BIN有输出(如/Users/xxx/.nvm/versions/node/v18.19.0/bin),否则展开为空,调试器直接报Cannot resolve runtimeExecutable - 绝对路径硬编码(如
"runtimeExecutable": "/Users/xxx/.nvm/versions/node/v18.19.0/bin/node")不可移植,换机器或重装nvm就失效 - Windows 用户注意:
${env:NVM_BIN}在 PowerShell 下需确保$PROFILE已加载nvm.ps1,且 VSCode 终端 profile 设为 PowerShell
terminal.integrated.inheritEnv 必须设为 true 并完全重启 VSCode
VSCode GUI 进程默认不加载 shell 初始化文件(如 ~/.zshrc),所以即使你配了 source ~/.nvm/nvm.sh,nvm 命令和 NVM_BIN 也不存在于 VSCode 环境中。
- 设置方式:Cmd+, → 搜
terminal.integrated.inheritEnv→ 勾选 → 必须完全退出 VSCode(不只是关窗口),再重开 - 验证:
which nvm应返回~/.nvm/nvm.sh;nvm current应显示预期版本 - macOS/Linux 若仍无效,可手动补环境变量到
settings.json:"terminal.integrated.env.zsh": { "NVM_DIR": "~/.nvm", "PATH": "~/.nvm/bin:${env:PATH}" } - 不重启就改设置 = 白配
想打开项目就自动切版本?别信“静默切换”
.nvmrc 文件只是个声明,VSCode 和 nvm 都不会自动读它并执行 nvm use。所谓“自动”,全靠人或插件触发。
- 最轻量做法:项目根目录放
.nvmrc(内容如v16.20.2),每次打开项目后,在集成终端手动执行nvm use - 省事方案:装插件
vsc-nvm,它会在新开终端时自动检测.nvmrc并执行nvm use;但已存在的终端不会刷新,得重启终端 - Volta 用户注意:
.nvmrc写^18会失败,Volta 只认具体版本或lts,且需先运行volta pin node@18.19.0生成.node-version
真正容易被忽略的点是:VSCode 启动那一刻的环境变量快照,决定了调试器能拿到什么;而终端里 nvm use 只改当前 shell 的环境,不改 VSCode 主进程的环境。所以“双路协同”不是锦上添花,而是必要条件。










