必须在 tasks.json 中同时设置 "group": "build" 和 "isBuildCommand": true,且 task 的 "label" 值需与 launch.json 中 preLaunchTask 完全一致;构建任务需生成有效 source map,且 outFiles 路径须匹配 outDir;避免混用 program 与 runtimeExecutable。

tasks.json 里怎么写才能让 Ctrl+Shift+B 触发构建并自动进调试
必须在 tasks.json 中显式声明 "group": "build" 和 "isBuildCommand": true,否则 VSCode 根本不会把它识别为“构建任务”,Ctrl+Shift+B 就搜不到。它和 launch.json 是松耦合的,但调试器靠 preLaunchTask 字段来触发这个任务——所以 task 名必须和 preLaunchTask 的值完全一致(大小写、空格都不能错)。
常见错误是:写了 "group": "build" 却漏了 "isBuildCommand": true;或者 task 名用了下划线(如 "tsc_build"),但 launch.json 里写成 "preLaunchTask": "tsc build" —— 中间空格会被当成分隔符,匹配失败。
-
"label"字段就是你在preLaunchTask里要填的内容,建议纯字母+数字,避免空格和特殊符号 - 如果构建耗时较长(比如 tsc + esbuild),加
"isBackground": true并配"problemMatcher",否则调试器会卡住等任务“结束”(而 watch 模式根本不会结束) - Windows 用户注意:
type: "shell"在 PowerShell 下默认禁止执行脚本,npm run build可能直接报xxx.ps1 cannot be loaded,此时改用type: "process"更稳
launch.json 中 preLaunchTask 不生效的典型原因
preLaunchTask 失效,90% 不是语法错,而是 task 没通过验证或没被发现。VSCode 启动调试前会检查 task 是否存在、是否属于 build 组、是否已启用 isBuildCommand,任一条件不满足就静默跳过,控制台也不报错。
验证方法很简单:按 Ctrl+Shift+P → 输入 Tasks: Run Build Task,看列表里有没有你的 task 名。没有?回去检查 tasks.json 的 group 和 isBuildCommand;有但名字对不上?核对 label 值。
- 别在
preLaunchTask里写路径或命令,只写label字符串 - 如果 task 依赖环境变量(比如
NODE_ENV=production),得在tasks.json的"options.env"里显式声明,settings.json里的终端环境变量不生效 - 多个 task 串联?VSCode 不支持原生依赖链,得把它们合并成一个 shell 命令,或用
npm-run-all这类工具封装
为什么构建完断点还在 .js 上,不是 .ts
不是 preLaunchTask 没跑,而是它跑完但没生成有效的 source map。TypeScript 编译器(tsc)必须实际输出 .js.map 文件,且路径要和 launch.json 中 outFiles 的 glob 完全匹配。哪怕 tsc 报了 “Found 0 errors”,只要 sourceMap: true 没开、outDir 路径写错、或 rootDir 指向偏差,.map 文件就不会生成或放错位置。
最直接的验证方式:手动运行一遍 tsc,然后去 dist/(或你设的 outDir)下找对应 .js 文件旁有没有同名 .js.map。没有?问题出在编译环节,跟 VSCode 配置无关。
-
tsconfig.json中"sourceMap": true和"outDir"必须同时存在且非注释状态 -
launch.json的outFiles值要和outDir对应,比如outDir: "./dist"→outFiles: ["${workspaceFolder}/dist/**/*.js"]</li> <li>用 <code>ts-node跑就不需要outFiles和sourceMaps,但必须删掉这些字段,否则调试器会尝试加载不存在的 map 文件并失败
runtimeExecutable + preLaunchTask 混用会怎样
会冲突。VSCode 调试器只认一种启动方式:program + preLaunchTask 是预编译后执行 node ./dist/index.js;runtimeExecutable + args 是直接调用 ts-node 或 npx 解释执行 .ts。两者同时存在时,VSCode 优先用 runtimeExecutable,忽略 program 和 preLaunchTask,但不会警告。
典型症状:你改了 preLaunchTask 名字,重新按 F5,结果还是跑老代码——因为实际走的是 runtimeExecutable 那条路,压根没触发构建任务。
- 选预编译路线:删掉
runtimeExecutable和args,确保program指向.ts入口,并配好preLaunchTask - 选即时解释路线:删掉
program、outFiles、sourceMaps,runtimeExecutable指向ts-node或npx,args传["ts-node", "..."] - 别在同一个配置里混写,尤其不要留着注释掉的字段——VSCode 有时会误读注释中的引号或逗号,导致 JSON 解析失败
tsc 静默跳过了某些文件,或者 outDir 被 tsconfig.json 里另一个 extends 配置覆盖了。动手前,先手动跑一遍构建命令,盯紧输出目录。


















