必须在launch.json中显式配置runtimeExecutable字段指向fnm安装的具体node二进制文件,如Windows下"C:UsersyournameAppDataRoamingnmersions8.20.2in ode.exe",而非依赖shell环境变量或写"node"。

VSCode 调试器报 “Cannot find runtime 'node'” 怎么办
不是 VSCode 没装好,是它根本没读 fnm 切换后的 Node 路径——调试器不继承终端环境变量,也不认 fnm use 的临时状态。必须在 launch.json 里硬编码指定可执行文件路径。
- 先在终端运行
fnm which 18.20.2(把18.20.2换成你项目实际用的版本),拿到真实路径 - Windows 示例:
"runtimeExecutable": "C:\Users\yourname\AppData\Roaming\fnm\versions\18.20.2\bin\node.exe"(注意双反斜杠) - macOS/Linux 示例:
"runtimeExecutable": "/Users/yourname/.fnm/versions/18.20.2/bin/node" - 绝对不要写
"runtimeExecutable": "node"——这会让调试器绕过 fnm,直接查系统 PATH - 路径里不能含波浪号
~,Windows 不识别;也不能用环境变量如${env:FNM_DIR},VSCode 启动时未必能展开
为什么 VSCode 终端能用 fnm,但调试器找不到 node
因为 VSCode 启动时不会自动加载 PowerShell 的 $PROFILE 或 Bash 的 .bash_profile,fnm env --use-on-cd | Out-String | Invoke-Expression 这类初始化逻辑只在交互式终端生效,对调试器进程无效。
-
fnm use 18.20.2只影响当前终端会话,不修改全局 PATH,也不影响新启的调试进程 - 即使你在终端里成功执行了
fnm use,重启 VSCode 后调试器仍 fallback 到旧版或报错 - fnm 安装的二进制默认放在
$FNM_DIR/versions/下,这个路径不在系统 PATH 中,调试器默认查不到 - 最稳妥的做法:每个
launch.json的configuration都显式配runtimeExecutable,别指望环境变量自动生效
如何让 .node-version 文件真正起作用
.node-version 文件本身只是个声明,VSCode 不会主动触发 fnm use。必须靠手动桥接,否则调试器永远不知道该用哪个版本。
- 在项目根目录新建
.node-version,内容仅一行:18.20.2(不带v前缀) - 确保 VSCode 内置终端已加载 fnm:打开终端后运行
fnm --version,有输出才算初始化成功 - Windows 用户可在
settings.json加:"terminal.integrated.env.windows": {"FNM_MULTISHELL_PATH": "${env:FNM_DIR}"} - macOS/Linux 用户对应加:
"terminal.integrated.env.osx"或"terminal.integrated.env.linux" - 但注意:这些环境变量只影响终端,不影响调试器——调试器仍需
runtimeExecutable显式指向具体二进制
fnm + VSCode 配置最容易被忽略的细节
真正麻烦的不是写配置,而是不同环节读取环境的方式完全割裂:终端靠 shell 初始化,调试器靠 runtimeExecutable 或 runtimeVersion,任务靠 tasks.json 显式调用。没人统一调度,全靠你手动对齐。
- 别混用
.node-version(fnm)和.nvmrc(nvm)——它们互不识别,选一个工具并坚持用到底 -
runtimeVersion字段在 type: "node" 的 launch 配置里有效,但依赖nvm exec,fnm 用户别用它,没效果 - 验证是否真生效:在 VSCode 终端里依次运行
node -v、which node、fnm current,三者输出必须一致 - 如果用了 ESM(
"type": "module"),调试时还得在launch.json里加"runtimeArgs": ["--loader", "ts-node/esm"](若用 ts-node)


















