VSCode调试Node.js项目时type必须为"node"而非"pwa-node",因其在monorepo(如Lerna)场景下更稳定,可避免autoAttachChildProcesses失效、子包断点不命中等问题;调试Lerna子包需显式配置program指向编译后JS入口、cwd设为根目录,并启用autoAttachChildProcesses支持子进程调试。

launch.json 里 type 必须是 node,不是 pwa-node
VSCode 调试 Node.js 项目时,type: "node" 是最稳定的选择。虽然新版文档提到了 pwa-node,但它在 monorepo 场景下容易 fallback 失败,尤其当你用 ts-node 或 esbuild-node 启动时,pwa-node 可能直接忽略 autoAttachChildProcesses。Lerna 管理的多包项目里,子包启动方式各异,统一用 type: "node" 能避免一半以上的断点不命中问题。
调试 Lerna 子包必须显式指定 program 和 cwd
VSCode 默认从当前打开的文件夹启动调试,但 Lerna 的子包(比如 packages/ui)本身没有独立的 node_modules,它的依赖靠根目录软链或 paths 映射。如果只写 "program": "./src/index.ts",调试器会找不到模块解析上下文。
-
program必须指向编译后或可执行的 JS 入口,例如"${workspaceFolder}/packages/ui/dist/index.js";TS 项目需先tsc或用ts-node配合runtimeExecutable -
cwd必须设为根目录:"cwd": "${workspaceFolder}",否则require('my-utils')会因路径错乱而报Cannot find module - 若用
ts-node,runtimeExecutable应设为"${workspaceFolder}/node_modules/.bin/ts-node",且runtimeArgs加["--project", "packages/ui/tsconfig.json"]
跨包跳转失效?检查 tsconfig.base.json 的 paths 和 TS 服务重启
你在 packages/app 里 import { foo } from 'my-utils',Ctrl+Click 却跳不到 packages/my-utils 源码——这不是 VSCode 问题,是 TypeScript 语言服务没加载正确的路径映射。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
- 确认根目录存在
tsconfig.base.json,且每个子包的tsconfig.json都"extends": "../tsconfig.base.json" -
tsconfig.base.json的compilerOptions.paths必须覆盖所有本地包,例如:"my-utils": ["packages/my-utils/src"] - 改完 tsconfig 后,必须手动触发 TS 服务重启:Cmd/Ctrl+Shift+P → 输入 “TypeScript: Restart TS server”
- 不要依赖 VSCode 自动识别 symlink —— Lerna 的
bootstrap生成的是硬链或 pnpm/yarn 的 virtual store,TS 只认paths配置
autoAttachChildProcesses 是调试 Worker 或 fork 子进程的唯一开关
Lerna 项目常含 CLI 工具或后台服务,它们可能 spawn 子进程或创建 Worker。如果你在主进程打了断点,子进程却完全不暂停,大概率是漏了这个配置。
- 在
launch.json的 configuration 中加:"autoAttachChildProcesses": true - 仅对
child_process.fork()和new Worker()生效;spawn()需额外传--inspect-brk - Worker 构造时必须带
execArgv:new Worker('./worker.js', { execArgv: ['--inspect-brk=9230'] }) - 主进程 launch 配置中要同步设
"port": 9230和"runtimeArgs": ["--inspect-brk"],端口必须一致且未被占用
monorepo 调试真正的难点不在配置本身,而在路径、TS 解析、进程上下文三者必须严格对齐——少一个环节,断点就悬在半空。

















