vscode终端不继承shell环境变量导致nvm失效,需设置terminal.integrated.inheritenv为true并完全重启;调试器需配置"runtimeexecutable": "${env:nvm_bin}/node";typescript server需重启或手动刷新。

VSCode 终端不继承 shell 环境变量,nvm 就等于没装
你 nvm use 18.19.0 后终端里 node -v 显示正确,但新开一个 VSCode 集成终端却回到系统默认 Node——根本不是 nvm 没装好,而是 VSCode 启动时压根没加载你的 shell 初始化文件(比如 ~/.zshrc)。它默认启动的是 non-login shell,source ~/.nvm/nvm.sh 这行根本不会执行。
必须显式告诉 VSCode:“请把我的 shell 环境变量带进来”。在设置里搜 terminal.integrated.inheritEnv,设为 true;改完后必须完全退出 VSCode(关掉所有窗口 + 进程)再重开,否则无效。
- macOS/Linux:确认
~/.zshrc或~/.zprofile里有export NVM_DIR="$HOME/.nvm"和source "$NVM_DIR/nvm.sh" - Windows PowerShell:确保
$PROFILE里有Import-Module "$env:USERPROFILE\.nvm\nvm.ps1",且 VSCode 终端 profile 设为 PowerShell - 验证方式:新开终端后运行
which nvm和nvm current,两者都应有输出
launch.json 里不配 runtimeExecutable,F5 调试永远用错版本
终端里 node -v 是 v18.19.0,但按 F5 启动后 console.log(process.version) 打印出 v16.20.2?这不是终端配置失败,是调试器根本没读你终端的环境。VSCode 的 Node 调试器("type": "node")启动时只查自己启动那一刻的 PATH 快照,和你在终端里 nvm use 无关。
唯一可靠写法是:"runtimeExecutable": "${env:NVM_BIN}/node"。前提是 NVM_BIN 真的存在——在终端里运行 echo $NVM_BIN,有输出才有效;没输出说明 VSCode 启动时根本没加载 nvm。
- 别硬编码路径,如
"runtimeExecutable": "/Users/x/.nvm/versions/node/v18.19.0/bin/node",换机器或重装 nvm 就崩 - 如果项目用
volta,对应写法是"runtimeExecutable": "${env:VOLTA_HOME}/bin/node",同样要先验证echo $VOLTA_HOME - 配完记得重启调试会话,旧的 launch 进程不会自动 reload 环境
想打开项目就自动切 Node?.nvmrc 文件本身不会触发任何动作
.nvmrc 只是一个纯文本声明文件,内容写 v16.20.2 并不等于“VSCode 一打开就执行 nvm use v16.20.2”。VSCode 不原生读它,nvm 本身也不会监听目录变化自动切换——它只是个静态快照。
可行路径只有两条:
- 手动最稳:项目根目录放
.nvmrc,每次打开后在终端手动跑一次nvm use - 插件辅助:装
vsc-nvm,它会在新终端启动时自动检测并执行nvm use;注意:已存在的终端不会自动更新,必须关闭重开
Volta 用户同理:.node-version 也得靠 volta pin node@18.19.0 手动生成,Volta 不会自动创建或监听变更。
多项目并发时,终端、调试器、语言服务三者环境可能各自为政
你以为终端和调试器都对了,结果 TS 类型检查报错“node:fs not found”?那很可能是 TypeScript Server 还在用旧版 Node 启动——它不走 shell 环境,也不读 launch.json,而是依赖 VSCode 启动时绑定的 Node 可执行路径。
解决办法只有两个:
- 重启 VSCode(彻底退出进程),让 TS Server 重新加载当前生效的 Node 环境
- 或者在命令面板运行
Developer: Restart TS Server,强制刷新语言服务上下文
这三套环境(终端 / 调试器 / TS Server)没有共享状态,任何一个环节漏掉,就会出现“看着对、跑着错”的现象。别指望一次配置全搞定,每个环节都得单独验证。











