VSCode中async/await断点不生效主因是source map未启用或ESM配置不当:需在launch.json设"sourceMaps": true,ESM项目加"--enable-source-maps",TS项目配"module": "ESNext"并确保.map文件存在。

VSCode 里跑不了 async/await 代码,基本不是语法问题,而是环境没对齐——Node.js 版本、模块系统、source map 三者只要一个没配好,断点就跳、await 就卡、调用栈就变匿名函数。
为什么 node -v 能跑但 async 断点不生效
Node.js 从 v7.6 起原生支持 async/await,但 VSCode 调试器(vscode-js-debug)需要 source map 才能把转译后代码(比如 TypeScript 编译输出或 Babel 处理结果)映射回原始 async 函数位置。没有有效 source map,调试器根本不知道你在 await 那行设的断点对应哪一行机器码。
- 常见现象:在
await fetch(...)行打断点,F5 启动后直接跳过;step into 进入的是Promise.then匿名回调,不是你写的async function - 关键检查点:确认
.js.map文件真实存在,且和.js文件同目录;TypeScript 项目需tsconfig.json含"sourceMap": true;Babel 项目需加--source-maps参数 - ESM 项目额外注意:Node.js ≥ v14.18 才支持
--enable-source-maps,且必须在launch.json的runtimeArgs中显式传入
launch.json 怎么配才让 await 断点命中
默认生成的 launch.json 往往漏掉 source map 和 ESM 支持,直接导致异步调试失效。
- 必须开启
"sourceMaps": true,否则调试器压根不尝试加载 .map 文件 - ESM 项目(
package.json有"type": "module"或入口是.mjs)要加:"runtimeArgs": ["--enable-source-maps"] -
"program"字段不能填${file}—— 它可能指向.ts源码,而调试器只认可执行的.js;应明确写成"${workspaceFolder}/dist/index.js"或类似路径 - 避免混用
outFiles和resolveSourceMapLocations:前者依赖路径硬匹配,容易因构建工具输出结构变化而失效;推荐后者配合 glob 排除node_modules,例如:"resolveSourceMapLocations": ["${workspaceFolder}/**","!**/node_modules/**"]
code-runner 插件跑 async 代码为啥卡住或乱码
code-runner 默认命令极简,不处理模块类型、编码、输入流,遇到 import、中文路径或 process.stdin 就容易假死。
- Windows 中文乱码:在设置中搜
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" - 含
readline或process.stdin的脚本别用code-runner—— 它不支持交互式输入;换用内置终端手动运行,或改用 F5 调试模式
Node.js 版本选哪个才稳住 async 堆栈
v14 在复杂 Promise 链中会丢失帧,v16–v20 对 async 堆栈跟踪修复较多,尤其涉及 Promise.allSettled 或嵌套 try/catch 时。
- 不要写死
"runtimeExecutable": "/usr/bin/node"—— 它绕过nvm/nodenv,调试器可能用错版本 - 推荐用
"runtimeVersion": "18.17.0"(需 VSCode ≥ 1.82),VSCode 会自动匹配已安装版本;验证方式:在内置终端运行node -v,结果必须和runtimeVersion一致 - 若项目依赖
ts-node或nodemon,必须用"runtimeExecutable"指向它们,但得额外加--inspect-brk,并确认其底层 Node 版本 ≥ v16
最易被忽略的是:TS + ESM 组合下,tsconfig.json 的 "module" 必须为 "ESNext","target" 至少 "ES2020",且 "outDir" 输出路径不能和源码混在一起——否则 .js 和 .js.map 位置错位,source map 就失效了。











