根本原因是devtool、sourcemappathoverrides和调试目标未对齐:devtool须用source-map或inline-source-map,禁用eval系列;sourcemappathoverrides需按chrome sources中显示的路径前缀精准映射;launch.json中type必须为pwa-chrome、url须与dev server完全一致、webroot应指向项目根目录。

断点打不中、显示“No source available”、红点变空心——根本不是 VSCode 有问题,而是 devtool、sourceMapPathOverrides 和调试目标三者没对齐。
devtool 必须用 source-map 或 inline-source-map
Webpack 默认开发模式常配 devtool: "eval-source-map",它把映射塞进 eval() 字符串里,Chrome DevTools 能认,但 VSCode 调试器解析不了,断点必然漂移或失效。
-
devtool: "source-map":生成独立main.js.map文件,路径清晰,VSCode 最稳 -
devtool: "inline-source-map":base64 map 写在 JS 文件末尾,免 I/O,但某些代理/CDN 可能截断sourceMappingURL注释 - 避开所有
eval系列(eval-source-map、cheap-module-eval-source-map)——它们不落地 .map 文件,VSCode 无法定位原始源码 - Vue CLI 用户注意:
productionSourceMap: true不影响 dev server 行为,必须在vue.config.js的configureWebpack.devtool里显式设值
sourceMapPathOverrides 配错等于没配
VSCode 拿到浏览器返回的 sources 路径(比如 webpack:///./src/App.tsx),再按 sourceMapPathOverrides 规则去本地找真实文件。配错就直接“No source available”。
- 先在 Chrome DevTools 的 Sources 面板右键压缩 JS → “Reveal in sidebar”,看左侧显示的路径前缀(常见有
webpack:///./src/、webpack:///src/、webpack://my-project/src/) -
${webRoot}必须是项目根目录(即webpack.config.js所在位置),不是src或dist - 统一用正斜杠
/,Windows 下也别用\ - 典型配置示例:
"sourceMapPathOverrides": { "webpack:///./src/*": "${webRoot}/src/*", "webpack:///src/*": "${webRoot}/src/*", "webpack:///./*": "${webRoot}/*" } - 如果用了 monorepo 或
resolve.alias(如@/指向packages/utils),还得加类似"webpack:///@/*": "${webRoot}/packages/*"
launch.json 的 type 和 url 必须严格匹配运行环境
VSCode 1.80+ 已停用旧版 chrome 调试器,必须用 pwa-chrome,否则连接失败或断点加载失败。
-
type必须是"pwa-chrome",不是"chrome" -
url必须和你实际启动的 dev server 地址完全一致(包括端口、协议、路径),比如"http://localhost:3000",不能写成"http://127.0.0.1:3000"或漏掉端口 -
webRoot推荐写成"${workspaceFolder}",确保指向项目根目录 - 如果用的是 webpack-cli 启动(非 webpack-dev-server),需改用
type: "node"+runtimeExecutable: "npx"+runtimeArgs: ["webpack"],并确保devtool生效且output.path可访问
打包产物里 debugger 语句不触发?先关压缩
Webpack 的 TerserPlugin 默认会删掉 debugger 语句,尤其在 production mode 下。这不是调试器问题,是代码根本没执行那行。
- 开发时务必关掉压缩:Webpack 中设
optimization.minimize: false,或直接删掉TerserPlugin实例 - Vite 用户设
build.minify = false - 确认浏览器开发者工具 Sources 面板里,能看到未混淆的原始文件结构;如果只看到
index.js一整块,说明 sourcemap 没生效或被拦截 - 检查网络面板,确认
.map文件返回状态是 200,不是 404 —— 常见于 webpack-dev-server 未正确挂载静态资源或代理规则拦截了.map请求
最易忽略的其实是 webRoot 和真实路径的偏差:比如你项目在 /Users/me/project,但 sourceMapPathOverrides 里写的却是 "${workspaceFolder}/src/*",而实际 webpack.config.js 在 /project/packages/web,那所有映射都会错位。动手前先看一眼 Chrome Sources 里的路径前缀,比猜配置快得多。











