compounds 是唯一合法的多服务启动方式;vscode 原生不支持单 configuration 启动多进程,仅 compounds 可并行启动多个已命名、端口不冲突、console 为 integratedterminal 的调试配置。

compounds 是唯一合法的多服务启动方式
VSCode 原生不支持在一个 configuration 里启动多个进程。你在 configurations 数组里写两个 "type": "node" 配置,VSCode 只会执行第一个——这不是 bug,是设计如此。真正能同时拉起多个服务的,只有 compounds 块。
它本质是一个“调度层”:你先定义好若干个独立、可运行的调试配置(每个 name 必须唯一),再用 compounds 把它们的名字列出来,VSCode 才会并行启动全部。
- 每个被引用的配置必须有明确的
"name": "API Server"、"name": "Worker"等,不能重复 -
compounds本身不写program或port,只负责组合名字 - 如果某个服务依赖另一个先就绪(比如数据库要等 2 秒),VSCode 不会自动等待,得手动点“继续”或加
preLaunchTask做延时
端口冲突导致第二个服务卡死,9229 不是万能默认值
最常见的“启动了但断点不命中”,其实是第二个 node --inspect 进程因为端口被占而静默失败。VSCode 默认复用 9229,但 compounds 下所有服务必须显式分配不同端口。
- 每个
configuration里必须加"port": 9230、"port": 9231等,不能省略 - 启动后务必检查终端输出有没有
Debugger listening on ws://127.0.0.1:9230/—— 没这行,说明调试器根本没起来 - Windows 用户记得在任务管理器里杀干净残留
node.exe;macOS/Linux 推荐pkill -f "node --inspect",比只点 VSCode 的停止按钮更彻底
console: "integratedTerminal" 不是可选项,是硬性要求
如果你发现第二个服务启动后终端没反应、调试器连不上,大概率是漏了这一项。VSCode 在 compounds 模式下,对非主控终端的附加行为很敏感。
- 所有参与
compounds的配置都必须设"console": "integratedTerminal" - 设成
"externalTerminal"或不写,默认值,会导致后续服务无法正确 attach,卡在“connecting…” - 这个设置和
"request": "launch"必须共存:"request": "attach"仅适用于你已手动跑起node --inspect的场景,compounds下基本不用
TS 项目断点不触发?别怪 VSCode,先查 program 路径和 outFiles
TypeScript 编译后的 JS 文件路径和源码路径不一致,是断点失效最隐蔽的原因。VSCode 调试器 attach 的是 Node.js 实际运行的文件,不是你编辑器里打开的 .ts。
-
program必须指向编译产物,比如"${workspaceFolder}/dist/api/index.js",而不是src/下的 ts 文件 - 如果坚持用 ts 源码路径,就得配
"outFiles": ["${workspaceFolder}/dist/**/*.js"],让调试器知道去哪里映射 -
preLaunchTask如果没成功执行(比如 tsc 编译失败),program指向的文件就不存在,VSCode 不报错,但断点永远不触发
多服务调试真正的复杂点不在配置语法,而在于每个服务的生命周期是否真正进入调试态——端口、终端类型、路径、构建状态,四个条件缺一不可。少一个,表面看“启动成功”,实际只是进程在黑盒里空转。











