断点打在ts却停在js错行,是source map映射错位所致;需确保tsconfig.json中"sourcemap": true且"inlinesourcemap": false,launch.json中"outfiles"路径与tsc实际输出完全一致,并禁用dist目录下格式化,同时验证构建产物、outdir和outfiles三者路径严格匹配。

断点打在TS上却停在JS错行,是source map没对上
这不是VSCode抽风,而是调试器靠source map把编译后的dist/index.js行号反查回src/index.ts原始位置——一旦映射关系错位,断点就“漂”了。常见现象:你在第15行打的断点,实际停在第12行或跳过整块逻辑。
-
tsconfig.json里必须有"sourceMap": true,且"inlineSourceMap"设为false(VSCode更认独立.map文件) -
launch.json中"outFiles"路径要和tsc实际输出完全一致,比如"${workspaceFolder}/dist/**/*.js",多一个斜杠或少一个**都会让调试器找不到产物 - 打开「调试控制台」,搜
Loaded source map from:——如果看到404,说明outFiles或构建路径错了;如果看到路径但行号仍不对,大概率是tsconfig.json里"outDir"和launch.json中outFiles不一致
格式化插件改了JS文件,导致.map文件失效
ESLint或Prettier自动修复时若直接操作dist/下的.js文件,会破坏它与.map的二进制对应关系——哪怕只多一个空格,source map的行偏移就全乱了。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 绝对禁止在
dist/目录下启用editor.formatOnSave或eslint.autoFixOnSave - 在
.vscode/settings.json里加这条规则,锁死产出目录:"files.exclude": {"dist/**": true},同时配"editor.formatOnSaveExclude": ["dist/**/*.js", "dist/**/*.map"] - 检查
package.json的scripts,确保build命令用的是tsc --build或npm run tsc,而不是prettier --write dist/**/*.js这类危险操作
Node版本或调试器类型选错,让source map解析失败
Node v14以下不支持完整的ESM调试符号,pwa-node调试器在某些CI环境又会fallback失败,结果就是source map加载了但解析不动。
-
launch.json里优先用"type": "node",别写"pwa-node"——老项目、Docker或远程WSL场景下更稳 - 确认
node -v≥ 14,终端和VSCode内置终端都得能跑出版本号;macOS用户特别注意zsh启动VSCode时PATH可能没继承,需在.vscode/settings.json里显式补"terminal.integrated.env.osx" - 如果用了
ts-node直跑,program字段就得指向${workspaceFolder}/node_modules/.bin/ts-node,再把args设成["--loader", "ts-node/esm", "src/index.ts"],不能混用sourceMaps和runtimeExecutable
构建工具生成的.map文件被压缩或混淆干扰
Vite或Webpack默认开启代码压缩时,会把console.log等语句删掉,或者把变量重命名,导致断点所在行在最终JS里根本不存在——调试器只能往前或往后找最近的可停指令。
- Vite项目:检查
vite.config.ts,确保build.sourcemap为true,且build.minify设为false(开发调试阶段别开压缩) - Webpack项目:
devtool必须用'source-map'或'inline-source-map',禁用'eval'——后者不生成真实.map文件,调试器读不到完整映射 - 手动验证:启动服务后,浏览器访问
http://localhost:3000/assets/index.abc123.js.map(路径按实际dist结构替换),返回必须是合法JSON,且sources字段里包含你的src/路径
outFiles路径、tsconfig.json的outDir、构建产物实际存放位置这三者之间差一个字符——这种错位不会报错,只会让断点安静地失效。










