VSCode扩展调试需匹配启动方式、launch.json配置与宿主环境,必须通过Extension Development Host运行,正确配置type为extensionHost、outFiles为"${workspaceFolder}/out/*/.js"并确保TS已编译。

VSCode 扩展调试不是“装个 Debugger 就行”,关键在于启动方式、launch.json 配置与扩展宿主环境的匹配。直接 F5 启动多半失败,因为没指定正确的 type 和 request。
用 Extension Development Host 启动调试会话
VSCode 扩展必须运行在另一个 VSCode 实例(即 Extension Development Host)中才能被断点命中。这不是普通 Node.js 脚本,不能用 node 直接跑 extension.js。
- 确保工作区根目录下有
package.json(含contributes和main字段)和src/extension.ts(或.js) - 按
Ctrl+Shift+P(macOS 为Cmd+Shift+P),输入Developer: Toggle Developer Tools确认当前环境可调试 - 创建
.vscode/launch.json,核心配置必须包含:{ "version": "0.2.0", "configurations": [ { "name": "Launch Extension", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceFolder}"], "outFiles": ["${workspaceFolder}/out/**/*.js"] } ] }
outFiles 路径不匹配导致断点失效
TS 编译后代码在 out/ 下,但 VSCode 调试器默认只映射源码路径。如果 outFiles 写成 ["./out/**/*.js"] 或漏掉 **,断点永远不会触发。
- 始终用绝对路径变量:
"${workspaceFolder}/out/**/*.js"(注意双星号) - 检查
tsconfig.json中outDir是否为out;若改为dist,outFiles必须同步改 - 启动调试前手动运行
tsc -b或确认 Watch 模式已激活,否则out/是空的
修改扩展逻辑后热重载不生效
VSCode 扩展没有 HMR,每次改完代码都必须重启 Extension Development Host 实例 —— 但不是关窗口再开,而是点击调试工具栏的 Restart 按钮(或 Ctrl+Shift+F5)。
- 仅保存文件不会触发重载;
F5是重新启动整个调试会话,比Restart更重 - 如果扩展注册了
onCommand,但命令未出现在命令面板,先检查package.json的contributes.commands是否拼写正确,再确认activationEvents是否满足触发条件(比如写了"*"就总能激活) - 频繁报
Cannot find module 'xxx'?多半是node_modules没装全,或npm install在错误目录下执行
真正卡住的地方往往不是语法或 API,而是 launch.json 里一个斜杠写错、outFiles 少了星号、或者忘了编译就去点 F5。调试扩展时,眼睛要盯住调试控制台输出的第一行:它会明确告诉你加载的是哪个 main 文件、是否找到 package.json、有没有解析 activationEvents —— 这些信息比断点更早暴露问题。










