vscode插件断点不生效本质是sourcemap映射失败;需确保tsc和webpack双层均启用sourcemap、路径一致,launch.json中outfiles和resolvesourcemaplocations配置精准,并检查chrome devtools的source map开关及调试端口。

VSCode插件调试时断点不生效,基本就是sourceMap没对上
VSCode 插件本质是 Node.js 程序(运行在 Extension Host 进程中),但它的构建流程比普通 TS 项目更隐蔽:TypeScript 编译、打包(如 webpack)、甚至 monaco-editor 的路径重写都可能干扰 source map。断点灰掉、变量显示 undefined、调用栈全是 loader.js 或 bootstrap-fork.js —— 这些都不是 VSCode 调试器坏了,而是它压根没把 extension.js 映射回 src/extension.ts。
确保 tsc 和 webpack 都生成有效 .map 文件
插件项目通常用 tsc 编译 + webpack 打包双层处理,source map 必须在两层都启用,且路径不能断裂:
-
tsc层:确认tsconfig.json含"sourceMap": true,且"outDir"指向out/或dist/(与后续 webpack 输入一致) -
webpack层:必须设devtool: 'source-map'(别用inline-source-map,VSCode 插件调试不支持内联);同时加output.sourceMapFilename: '[name].js.map',保证 .map 文件和 .js 同目录 - 检查最终产物:
dist/extension.js末尾必须有且仅有一行//# sourceMappingURL=extension.js.map,且dist/extension.js.map文件真实存在、可读 - 如果用了
webpack的resolve.alias(比如@/指向src/),需在sourceMapPathOverrides中补映射,否则webpack:///src/extension.ts找不到真实文件
launch.json 的 outFiles 和 resolveSourceMapLocations 必须精准
插件调试的 launch.json 里,outFiles 不是指源码位置,而是告诉 VSCode:“去这些 JS 文件里找 source map”,填错就彻底失联:
-
outFiles示例(假设输出到dist/):["${workspaceFolder}/dist/**/*.js"]—— 注意通配符要覆盖所有入口,比如dist/extension.js和dist/testRunner.js都得被扫到 -
resolveSourceMapLocations控制“从 map 里读到的src/xxx.ts路径,去哪找真实文件”:["${workspaceFolder}/**", "!**/node_modules/**"]是基础写法;若sources字段里出现webpack:///./src/extension.ts,就得加一条"webpack:///./src/*": "${workspaceFolder}/src/*" - 别漏掉
sourceMaps: true,它只是开关,不是映射逻辑本身 - 如果插件用了多包结构(如 lerna + pnpm workspace),
resolveSourceMapLocations得显式包含其他包路径,例如"${workspaceFolder}/packages/*/src/**"
Chrome DevTools 的 sourcemap 开关和端口必须匹配
VSCode 插件调试依赖 VS Code 内置的 Edge/Chrome 调试协议代理,但底层仍是 CDP。即使 launch.json 完美,浏览器侧关了 sourcemap 或端口冲突,照样白搭:
- 启动插件调试前,手动打开 Chrome,访问
chrome://inspect→ 点击 Configure → 加入localhost:9229(VSCode 默认调试端口);确保 “Discover network targets” 已勾选 - 在 Chrome DevTools 的 Settings → Preferences → Sources → 勾选 “Enable JavaScript source maps” 和 “Enable CSS source maps”
- 如果调试时看到 “Debugger attached” 但断点不触发,检查终端输出是否有
Cannot connect to the target—— 多半是另一个进程占了 9229 端口,改用port: 9230并同步更新 Chrome 的 Configure 列表 - 插件调试不用配
webRoot(那是前端网页场景用的),这里完全由outFiles+resolveSourceMapLocations决定映射路径
最易被忽略的是 webpack 输出路径和 tsconfig outDir 的一致性 —— 两者差一个斜杠、多一层子目录,source map 就会断在 loader.js 里,而你还在反复检查 launch.json。先用 cat dist/extension.js | tail -n 1 看 sourceMappingURL 是否存在且路径正确,再查 map 文件内容里的 sources 字段是否指向你预期的源码位置,比盲调配置快得多。











