vscode调试node.js失败主因是环境变量未继承、program路径错误或模块解析模式不匹配:需确保内置终端能执行node -v,program指向真实js入口(非ts源码),esm项目须在package.json声明"type": "module"并显式设cwd。

VSCode 里 node -v 报错,或 F5 调试直接卡住、断点不命中——不是插件没装全,也不是 launch.json 写得不够花哨,而是环境变量没继承、program 指向了错误文件、或模块解析模式和项目实际不符。这三处对不上,其他所有配置都是白搭。
终端能跑 node,但 VSCode 内置终端报 command not found
这不是 VSCode 故障,是它压根没加载你的 shell 初始化文件(比如 ~/.zshrc 或 ~/.bash_profile),PATH 里自然没有 node。
- macOS/Linux:运行
which node确认路径(如/opt/homebrew/bin/node),确保该路径已写进~/.zshrc的export PATH="...:$PATH";改完后必须彻底退出 VSCode(不只是关窗口),再从终端执行code .启动 - Windows:打开“系统属性 → 高级 → 环境变量”,检查
C:\Program Files\nodejs\是否在“系统变量”的PATH中;没加就手动添,或者重装 Node.js 并**务必勾选 “Add to PATH”** - 验证方式只有一种:在 VSCode 内置终端(
Ctrl + `)中输入node -v—— 没输出就别往下配launch.json,全是空转
launch.json 的 program 字段总指向错误文件
program 是调试器找入口的唯一依据,写错路径、混用源码和编译后文件、忽略工作目录,断点就永远停不住。
- 单文件快速测试可用
"program": "${file}" - 后端项目必须显式写绝对路径,比如
"program": "${workspaceFolder}/src/server.js" - TypeScript 项目:
program必须指向.js文件(如dist/server.js),不能指src/server.ts;同时tsconfig.json得有"sourceMap": true,且生成的.js.map和.js必须在同一目录 - ESM 项目:根目录
package.json必须含"type": "module",否则调试器按 CommonJS 解析,import路径全错 - 加
"cwd": "${workspaceFolder}"显式声明工作目录,避免require('./config')因路径解析失败而报Cannot find module
用 nodemon 或 ts-node 调试时断点失效
这类工具会接管进程启动逻辑,VSCode 默认的 launch 模式无法稳定附加,强行配 runtimeExecutable 很容易断连或跳过断点。
-
nodemon:不要在launch.json里设runtimeExecutable指向nodemon;改用attach模式——终端先跑nodemon --inspect-brk src/server.js,再在launch.json新增一个request: "attach"配置连过去 -
ts-node:用type: "pwa-node"(新版推荐),配runtimeExecutable指向你本地安装的ts-node可执行文件路径(如"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/ts-node"),并加runtimeArgs支持 ESM - 如果用了
nvm/fnm/volta,调试器默认不识别版本切换逻辑;稳妥做法是在launch.json中显式指定runtimeExecutable路径,比如"runtimeExecutable": "~/.nvm/versions/node/v18.17.0/bin/node"
code-runner 插件运行 JS 脚本乱码、卡死、不支持 import
code-runner 默认命令极简:node $fileName,它不处理编码、模块类型、输入流,也不读 package.json 配置,所以容易出问题。
- Windows 中文路径下乱码:在 VSCode 设置中搜索
code-runner.executorMap,把javascript对应值改成:"node -r utf-8 $fileName" - ESM 报
Cannot use import statement outside a module:先确保项目根目录package.json有"type": "module",再把 executor 改成:"node --experimental-specifier-resolution=node $fileName" - 遇到
process.stdin就假死:这是code-runner的固有限制,它不支持交互式输入;换用内置终端手动运行,或改用调试模式(F5)
最常被忽略的其实是 cwd 和 type 的组合影响:哪怕 program 路径完全正确,只要工作目录不对,require('./utils') 就可能去错地方找文件;而 "type": "module" 缺失,import 语句在调试器眼里就是语法错误——这两处不显眼,却直接决定整个调试链路是否成立。










