vscode 当前唯一推荐的调试器是内置的 vscode-js-debug,需在 launch.json 中设 "type": "pwa-node";支持 debugger 语句+auto attach 快速调试,但须注意作用域、上下文及 source map 配置。

VSCode 内置的 JavaScript Debugger(即 vscode-js-debug)已完全取代旧版 Debugger for Chrome 和 Node.js 调试器,是当前唯一推荐的交互式调试方案。它不是“可选插件”,而是 VSCode 1.48+ 默认集成、不可卸载的核心组件——你不需要手动安装,也不该再去搜“Debugger for Chrome”。
为什么 launch.json 里 type 是 pwa-node 而不是 node
VSCode 旧版配置中常见 "type": "node",但自 2021 年起,官方强制迁移到 pwa-node(Progressive Web App Node),这是 vscode-js-debug 的底层协议标识。使用 "type": "node" 仍能运行,但会触发警告,且无法启用新特性(如 Worker 线程调试、条件异常断点)。
-
launch.json中必须写"type": "pwa-node",否则自动附加、子进程捕获等功能失效 -
"request": "launch"适用于直接执行脚本;"request": "attach"用于连接已运行的node --inspect进程 - 若项目含
worker_threads,仅pwa-node能自动关联并支持跨线程单步调试
debugger 语句 + Auto Attach 是最快启动调试的方式
不用配 launch.json,不改任何文件,只要一行 debugger 就能进断点——前提是开启自动附加模式。但它不是“万能开关”,有明确触发边界:
- 必须在终端中用
node index.js启动(不能用npm start或nodemon,除非额外配置--inspect) - 命令面板中执行
Debug: Toggle Auto Attach,选Only With Debugger Statement(避免干扰其他 Node 进程) -
debugger必须位于同步执行路径上;放在setTimeout或事件回调里,需确保该回调确实被调用 - 退出调试后务必关闭 Auto Attach,否则后续所有
node命令都会被拦截
调试控制台里执行代码,作用域和 this 指向容易错
在断点暂停时,调试控制台(Debug Console)看似能自由执行任意 JS 表达式,但它的执行上下文严格绑定当前栈帧——不是全局,也不是文件顶层,更不是浏览器 window。
- 输入
this返回的是当前函数的调用对象(可能为undefined或模块exports),不是globalThis - 访问变量前先确认它是否在当前作用域:局部变量、闭包变量、参数都可见;外层函数的私有变量不可见
- 修改对象属性(如
obj.x = 1)会真实生效;但重新赋值变量(如let a = 2)只在控制台内临时生效,不影响原逻辑 - 异步操作(
await fetch(...))在控制台中可用,但返回 Promise 后需手动.then()或再次await
真正难的不是设断点,而是理解「谁在调用」「在哪执行」「上下文是谁」——尤其当代码经过打包、转译或运行在 Worker 里时,source map 配置错误、webRoot 路径偏差、outFiles 匹配失败,都会让断点悬空或跳转到混淆后的代码行。这些细节不报错,却让调试彻底失效。











