必须用"type": "node",禁用"pwa-node":后者在Turborepo等场景fallback不稳定,易静默失败;request须为"launch"或"attach",program必须指向真实编译后.js路径(如"${workspaceFolder}/packages/api/dist/index.js"),不可用npm start或ts-node。

launch.json 里 type 写成 pwa-node 就卡住?用 node
VSCode 调试器对 pwa-node 的 fallback 行为不稳定,尤其在 Turborepo monorepo 场景下容易静默失败——type 必须明确设为 node,否则断点根本不会触发。
-
request只能是launch(跑新进程)或attach(连已有进程),不能省略;launch时program必须指向编译后的.js文件,比如"${workspaceFolder}/packages/api/dist/index.js",不是npm start或ts-node命令 - Turborepo 构建产物路径得和
outFiles对齐:如果turbo run build输出到dist/**,launch.json就得写"outFiles": ["./packages/api/dist/**/*.js"] - 子包路径不统一?加
"resolveSourceMapLocations": ["${workspaceFolder}/packages/**/src/**"],不然断点停在 JS 里,TS 源码映射不上
VSCode 终端里 turbo 报 command not found?别碰全局 PATH
turbo 不是没装,是 VSCode 启动终端时压根没加载项目根目录下的 node_modules/.bin —— macOS/Linux 下它读的是 shell 启动文件(如 ~/.zshrc),但不会自动把当前工作区的 ./node_modules/.bin 加进去。
- 先验证:
npx turbo --version能输出版本号,说明安装没问题,纯属 PATH 缺失 - 检查 VSCode 设置里的
terminal.integrated.defaultProfile:macOS 必须是zsh或bash,Windows 别误设成 PowerShell(~/.zshrc就不生效) - 最稳方案:所有构建命令都用
npx turbo run build,绕过 PATH 依赖;VSCode 的tasks.json里也直接写"command": "npx turbo run build"
turbo.json 的 inputs 配错,缓存就失效
Turborepo 缓存靠哈希比对输入文件内容来命中,inputs 漏掉关键配置或塞进 node_modules,会导致每次构建都跳过缓存,甚至产出错误结果。
-
inputs必须包含所有影响输出的文件:源码("src/**")、配置("tsconfig.json"、"package.json")、环境变量文件(".env"如果构建逻辑读它) -
outputs要精确到产物目录,比如"dist/**"或"lib/**";写成"**"会让缓存体积暴增,拖慢 CI -
node_modules别手动加进inputs——lockfile 变更时 turbo 会自动处理依赖哈希,加了反而干扰判断 - 大二进制产物(WASM、图标集)建议关缓存:
"cache": false,或用cacheDirectory指向外部路径
调试时发现 node 找不到或版本报错?PATH 和 Node 版本必须双重对齐
你在终端敲 node -v 成功,不代表 VSCode 调试器能调用它——尤其 macOS/Linux 下 VSCode 常不继承 shell 的 PATH,且调试器底层依赖 async_hooks,Node 版本低于 14 就会挂起失败。
- 在 VSCode 内置终端里执行
which node,拿到完整路径(如/opt/homebrew/bin/node) - 在项目根目录的
.vscode/settings.json中注入:"terminal.integrated.env.osx": {"PATH": "/opt/homebrew/bin:${env:PATH}"} - 改完必须彻底重启 VSCode,环境变量不会热更新
- 确认 Node ≥ 14:
node -v输出至少v14.0.0,否则异步栈无法挂起,断点停不住
turbo run build 成功了,就默认 launch.json 里的 program 和 outFiles 也能自动对上——其实只要构建路径、TS 输出配置、VSCode 工作区范围有一处没对齐,断点就永远停在 JS 上。


















