研发协作
用 Turborepo 管理…
在 TypeScript/JavaScript monorepo 中创建 Turborepo 工作区、配置 turbo.json 任务依赖与缓存、集成 Next.js/NestJS、搭建测试与 CI/CD 流水线并优化构建性能时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Turborepo 管理 TypeS特定
解决思路
- 创建工作区:运行 `pnpm create turbo@latest my-workspace` 并 `cd my-workspace`。
- 在已有项目中初始化:运行 `pnpm add -D -w turbo`。
- 在根目录创建 turbo.json 最小配置:`{"$schema":"https://turborepo.dev/schema.json","pipeline":{"build":{"dependsOn":["^build"],"outputs":["dist/**",".next/**"]},"lint":{"outputs":[]},"test":{"dependsOn":["build"],"outputs":["coverage/**"]}}}`。
- 在根 package.json 添加脚本:`{"scripts":{"build":"turbo run build","dev":"turbo run dev","lint":"turbo run lint","test":"turbo run test","clean":"turbo run clean"}}`。
- 在 CI 前验证任务图:运行 `turbo run build --dry-run --filter=...` 确认任务执行顺序。
- 在 turbo.json 中配置任务:`{"pipeline":{"build":{"dependsOn":["^build"],"outputs":["dist/**"]},"test":{"dependsOn":["build"],"outputs":["coverage/**"]},"lint":{"outputs":[]}}}`。
- 运行任务:`turbo run build`(所有包)、`turbo run lint test build`(多任务)、`turbo run build --filter=web`(指定包)。
- 并行类型检查使用 transit 节点避免缓存问题:`{"pipeline":{"transit":{"dependsOn":["^transit"]},"typecheck":{"dependsOn":["transit"]}}}`。
- 提交前验证:运行 `turbo run build --dry-run` 检查任务顺序和受影响的包。
- Next.js 集成:outputs 设为 `".next/**"`,env 设为 `["NEXT_PUBLIC_*"]`,详见 references/nextjs-config.md。
- NestJS 集成:outputs 设为 `"dist/**"`,dev 任务设置 `cache: false, persistent: true`,详见 references/nestjs-config.md。
- Vitest 配置:`{"pipeline":{"test":{"outputs":[],"inputs":["$TURBO_DEFAULT$","vitest.config.ts"]},"test:watch":{"cache":false,"persistent":true}}}`。
- 运行受影响的测试:`turbo run test --filter=[HEAD^]`,完整测试配置见 references/testing-config.md。
- 创建包级 turbo.json:`{"extends":["//"],"tasks":{"build":{"outputs":["$TURBO_EXTENDS$",".next/**"]}}}`,详见 references/package-configs.md。
- GitHub Actions CI 配置:依次执行 `pnpm install`;`pnpm turbo run build --filter=[HEAD^] --dry-run` 并检查输出确认只构建预期包;`pnpm run test --filter=[HEAD^]`;`pnpm run build --filter=[HEAD^]`;`pnpm turbo run build --filter=[HEAD^] --dry-run | grep "Cache"` 确认未变更包命中缓存。
- 远程缓存设置:运行 `npx turbo login` 登录 Vercel,再运行 `npx turbo link` 关联仓库,完整 CI/CD 示例见 references/ci-cd.md。
- 任务属性参考:`dependsOn`(先完成的任务,如 `["^build"]` 表示先构建依赖)、`outputs`(要缓存的文件/文件夹,如 `["dist/**"]`)、`inputs`(参与缓存哈希的文件,如 `["src/**/*.ts"]`)、`env`(影响哈希的环境变量,如 `["DATABASE_URL"]`)、`cache`(是否启用缓存 true/false)、`persistent`(长时间运行任务,dev 服务器设为 true)、`outputLogs`(日志详细度 `"full"`/`"new-only"`/`"errors-only"`)。
- 依赖模式:`^task` 先在依赖中运行任务(拓扑顺序);`task` 先在同一包中运行任务;`package#task` 运行指定包的任务。
- 过滤语法:`web` 仅 web 包;`web...` web 及其所有依赖;`...web` web 及其所有依赖方;`...web...` web 加依赖和依赖方;`[HEAD^]` 自上次提交以来变更的包;`./apps/*` apps/ 下所有包。
- 性能优化:使用具体 outputs 只缓存所需内容;微调 inputs 排除不影响输出的文件;使用 transit 节点启用并行类型检查;使用远程缓存跨团队/CI 共享缓存;使用包级配置定制每个包的行为。
- 缓存策略示例:`{"pipeline":{"build":{"outputs":["dist/**"],"inputs":["$TURBO_DEFAULT$","!README.md","!**/*.md"]}}}`。
- 任务组织:独立任务(无 dependsOn)如 lint、format、spellcheck;构建任务(`dependsOn: ["^build"]`)如 build、compile;测试任务(`dependsOn: ["build"]`)如 test、e2e;开发任务(`cache: false, persistent: true`)如 dev、watch。
- 任务顺序错误时检查 dependsOn 配置,例如 `{"build":{"dependsOn":["^build"]}}`。
- 未变更文件缓存未命中时检查 globalDependencies 和 inputs,例如 `{"globalDependencies":["tsconfig.json"],"pipeline":{"build":{"inputs":["$TURBO_DEFAULT$","!*.md"]}}}`。
- 缓存命中后出现类型错误时使用 transit 节点做类型检查:`{"transit":{"dependsOn":["^transit"]},"typecheck":{"dependsOn":["transit"]}}`。
- 创建含 Next.js 和 NestJS 的工作区示例:`pnpm create turbo@latest my-workspace`;`cd my-workspace`;`pnpm add next react react-dom -F apps/web`;`pnpm add @nestjs/core @nestjs/common -F apps/api`。
- 调试缓存问题:运行 `turbo run build --dry-run --filter=web` 查看将执行的内容;运行 `turbo run build --force --filter=web` 显示哈希输入。
适用边界 · 注意事项
- 需要 Node.js 18+,且根 package.json 必须包含 package manager 字段。
- 必须指定 outputs 才能启用缓存;persistent 任务不能有依赖方。
- 远程缓存需要 Vercel 账号或自托管方案;Windows 上建议使用 WSL 或 Git Bash;大型 monorepo 可能需要提高 concurrency 设置。