🚀 Turbo 使用指南

570 阅读7分钟

📖 本文档详细解析项目中 Turbo 的使用方式,适合 Turbo 初学者学习参考(本文档使用claude-4-sonnet模型生成)

📋 目录

🎯 什么是 Turbo?

Turbo 是一个为 JavaScript 和 TypeScript 项目设计的高性能构建系统,专门针对 Monorepo(单体仓库) 进行优化。

🔍 核心特性

特性说明优势
🚄 增量构建只构建发生变化的包大幅减少构建时间
💾 智能缓存本地和远程缓存构建结果避免重复构建
🔗 依赖管理自动处理包之间的依赖关系确保构建顺序正确
并行执行同时构建多个独立的包最大化利用系统资源

🤔 为什么需要 Turbo?

在传统的 Monorepo 项目中,我们面临这些挑战:

# 传统方式:每次都要构建所有包
npm run build  # 构建全部包,即使只修改了一个文件

# 手动管理依赖关系
cd packages/web-ui && npm run build
cd ../web-echarts && npm run build  # 需要等 web-ui 完成
cd ../web-business && npm run build  # 需要等前面的包完成

🎯 Turbo 解决方案:

  • ✅ 自动检测变化,只构建必要的包
  • ✅ 智能缓存,避免重复工作
  • ✅ 并行构建,提升效率
  • ✅ 依赖关系自动管理

🏗️ 项目架构分析

📦 Monorepo 结构

我们的项目是一个典型的 Monorepo 结构:

xh-web-business-components/
├── 📁 packages/                    # 核心包目录
│   ├── 🎨 web-ui/                 # UI 基础组件包
│   ├── 📊 web-echarts/            # 图表组件包
│   ├── 💼 web-business-components/ # 业务组件包
│   ├── 🛠️ web-cli/               # CLI 工具包
│   └── 🧰 web-utils/              # 工具函数包
├── 📁 apps/                       # 应用目录
│   ├── 📖 docs/                   # 文档站点
│   └── 🎮 playground/             # 组件演示
└── ⚙️ turbo.json                  # Turbo 配置文件

🔗 包依赖关系图

graph TD
    A[web-utils] --> B[web-ui]
    A --> C[web-echarts]
    A --> D[web-business-components]
    B --> D
    C --> D
    E[web-cli] -.-> A
    E -.-> B
    E -.-> C
    E -.-> D

    F[docs] --> A
    F --> B
    F --> C
    F --> D

    G[playground] --> A
    G --> B
    G --> C
    G --> D

    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e8f5e8
    style D fill:#fff3e0
    style E fill:#fce4ec

📊 包信息总览

包名版本描述构建产物
@hb/xh-web-ui1.4.1UI 基础组件es/, lib/, dist/
@hb/xh-web-echarts1.4.1图表组件es/, lib/, dist/
@hb/xh-web-business-components1.4.1业务组件es/, lib/, dist/
@hb/xh-web-cli1.4.1CLI 工具lib/, bin/
@hb/xh-web-utils1.4.1工具函数es/, lib/

⚙️ 配置详解

📄 turbo.json 配置分析

{
  "$schema": "https://turborepo.org/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", "es/**", "lib/**"]
    }
  },
  "globalDependencies": []
}

🔍 配置解读

配置项作用具体说明
$schema📋 配置验证提供 IDE 智能提示和配置验证
tasks.build🏗️ 构建任务定义 build 命令的执行规则
dependsOn: ["^build"]🔗 依赖管理先构建所有依赖包,再构建当前包
outputs📦 产物目录指定构建产物的输出目录
globalDependencies🌐 全局依赖全局变化时重新构建所有包

💡 配置解析

// "dependsOn": ["^build"] 的含义:
// ^ 表示依赖包(dependencies)
// 意思是:构建当前包之前,先构建所有依赖的包

// 实际执行顺序:
// 1. web-utils (无依赖,优先构建)
// 2. web-ui, web-echarts (依赖 web-utils)
// 3. web-business-components (依赖前面所有包)

🔧 package.json 中的 Turbo 集成

{
  "scripts": {
    "build": "turbo run build", // 使用 Turbo 执行构建
    "clean:build": "pnpm -r exec -- rm -rf lib es dist build coverage .turbo"
  },
  "devDependencies": {
    "turbo": "latest" // Turbo 依赖
  }
}

🔄 构建流程图

⚡ Turbo 构建流程

flowchart TD
    Start([开始构建]) --> Check{检查变化}

    Check -->|有变化| Analyze[分析依赖关系]
    Check -->|无变化| Cache[使用缓存结果]

    Analyze --> Plan[制定构建计划]
    Plan --> Parallel{可并行构建?}

    Parallel -->|是| ParallelBuild[并行构建独立包]
    Parallel -->|否| Sequential[按依赖顺序构建]

    ParallelBuild --> SaveCache[保存构建缓存]
    Sequential --> SaveCache
    Cache --> End([构建完成])
    SaveCache --> End

    style Start fill:#4caf50,color:#fff
    style End fill:#2196f3,color:#fff
    style Cache fill:#ff9800,color:#fff
    style ParallelBuild fill:#9c27b0,color:#fff

🎯 实际执行示例

当运行 pnpm run build 时:

# Turbo 自动分析和执行:

🔍 [Turbo] 检测变化...
  ✓ web-utils: 无变化,使用缓存
  ✓ web-ui: 有变化,需要重新构建
  ✓ web-echarts: 无变化,使用缓存
  ✓ web-business-components: 依赖 web-ui,需要重新构建

📋 [Turbo] 构建计划:
  1. web-ui (重新构建)
  2. web-business-components (等待 web-ui 完成)

⚡ [Turbo] 开始构建...
  🏗️  web-ui: father build
  ⏳ web-business-components: 等待依赖...
  ✅ web-ui: 构建完成
  🏗️  web-business-components: father build
  ✅ web-business-components: 构建完成

💾 [Turbo] 保存缓存...
🎉 构建完成!

✨ Turbo 优势对比

📊 性能对比表

场景传统方式Turbo 方式性能提升
🔄 全量构建构建所有 5 个包并行构建独立包50-70% 更快
🎯 增量构建构建所有包只构建变化的包🚀 80-90% 更快
💾 二次构建重新构建所有包直接使用缓存95% 更快
🔗 依赖管理手动管理构建顺序自动处理依赖关系🎯 0 错误率

📈 具体案例分析

# 场景1: 只修改了 web-ui 组件的样式

## 传统方式 (约 2-3 分钟)
cd packages/web-utils && npm run build      # 30s (不必要)
cd ../web-ui && npm run build               # 45s (需要)
cd ../web-echarts && npm run build          # 30s (不必要)
cd ../web-business && npm run build         # 60s (需要,依赖 web-ui)
cd ../web-cli && npm run build              # 15s (不必要)

## Turbo 方式 (约 30-45 秒)
pnpm run build
# ✅ web-utils: 缓存 (0s)
# 🏗️  web-ui: 构建 (45s)
# ✅ web-echarts: 缓存 (0s)
# 🏗️  web-business: 构建 (依赖更新,重建)
# ✅ web-cli: 缓存 (0s)

💡 实际使用示例

🎮 开发环境使用

# 开发时的常用命令
pnpm run build                    # 构建所有变化的包
pnpm run clean:build             # 清理构建产物和缓存
pnpm run clean:build && pnpm run build  # 强制全量重新构建

🔧 CI/CD 集成示例

# .github/workflows/build.yml
name: Build and Test

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Setup pnpm
        uses: pnpm/action-setup@v2

      - name: Install dependencies
        run: pnpm install

      - name: Build packages
        run: pnpm run build # 🚀 Turbo 自动优化构建

      - name: Cache Turbo build
        uses: actions/cache@v3 # 💾 缓存 Turbo 构建结果
        with:
          path: .turbo
          key: ${{ runner.os }}-turbo-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-turbo-

🎯 package.json 脚本优化

{
  "scripts": {
    // ✅ 推荐:使用 Turbo 统一管理
    "build": "turbo run build",
    "build:force": "turbo run build --force", // 强制重新构建
    "build:ui": "turbo run build --filter=web-ui", // 只构建特定包

    // ❌ 避免:绕过 Turbo 直接构建
    "build:all": "pnpm -r run build" // 不推荐
  }
}

🛠️ 常用命令参考

📋 基础命令

# 🏗️ 构建相关
pnpm run build                           # 构建所有变化的包
turbo run build                          # 直接使用 turbo 命令
turbo run build --force                  # 强制重新构建(忽略缓存)
turbo run build --no-cache               # 禁用缓存构建

# 🎯 选择性构建
turbo run build --filter=web-ui          # 只构建 web-ui 包
turbo run build --filter=web-ui...       # 构建 web-ui 及其依赖包
turbo run build --filter=...web-business # 构建依赖 web-business 的包

# 🔍 调试和分析
turbo run build --dry-run                # 预览构建计划(不实际构建)
turbo run build --graph                  # 生成依赖关系图
turbo run build --profile=profile.json   # 生成性能分析报告

📊 缓存管理

# 💾 缓存操作
turbo run build --force                  # 忽略缓存,强制构建
rm -rf .turbo                           # 清理本地缓存
pnpm run clean:build                    # 清理构建产物和缓存

# 🔍 缓存分析
turbo run build --summarize             # 显示缓存命中率
ls -la .turbo/cache/                    # 查看缓存文件

🎮 开发工作流

# 🚀 常用开发流程
pnpm run clean:build                    # 1. 清理环境
pnpm install                           # 2. 安装依赖
pnpm run build                         # 3. 构建项目
pnpm run playground                    # 4. 启动开发环境

# 📦 发布流程
pnpm run build                         # 1. 构建所有包
pnpm run changeset                     # 2. 生成变更日志
pnpm run version                       # 3. 更新版本号
pnpm run publish                       # 4. 发布到 npm

📈 最佳实践建议

✅ DO - 推荐做法

  1. 🎯 合理配置 outputs

    {
      "outputs": ["dist/**", "es/**", "lib/**"] // 包含所有构建产物
    }
    
  2. 🔗 正确设置依赖关系

    {
      "dependsOn": ["^build"] // 依赖包优先构建
    }
    
  3. 💾 利用缓存提升效率

    # 开发时保留 .turbo 目录
    echo ".turbo" >> .gitignore  # 不提交缓存到 git
    
  4. 📊 定期分析构建性能

    turbo run build --summarize  # 查看缓存命中率
    turbo run build --graph      # 分析依赖关系
    

❌ DON'T - 避免的做法

  1. ❌ 绕过 Turbo 直接构建

    # 不推荐:破坏了 Turbo 的优化
    cd packages/web-ui && npm run build
    
  2. ❌ 忽略依赖关系配置

    {
      // 错误:没有配置依赖关系
      "build": {
        "outputs": ["dist/**"] // 缺少 dependsOn
      }
    }
    
  3. ❌ 频繁清理缓存

    # 不必要:除非出现构建问题,否则保留缓存
    rm -rf .turbo  # 避免频繁执行
    

🔧 性能优化建议

  1. ⚡ 启用并行构建

    • 确保包之间的依赖关系正确配置
    • 独立的包会自动并行构建
  2. 💾 合理使用缓存

    • 保留 .turbo 目录提升本地开发效率
    • CI/CD 中配置缓存策略
  3. 📊 定期监控性能

    # 生成构建报告
    turbo run build --profile=build-profile.json
    
    # 分析报告(需要安装 Turbo 扩展工具)
    npx turbo-analyze build-profile.json
    

🎯 团队协作建议

  1. 📋 统一开发环境

    • 确保团队使用相同的 Node.js 版本
    • 使用 pnpm 作为包管理器
  2. 🔄 规范构建流程

    {
      "scripts": {
        "dev": "turbo run dev",
        "build": "turbo run build",
        "test": "turbo run test",
        "lint": "turbo run lint"
      }
    }
    
  3. 📚 文档和培训

    • 为团队成员提供 Turbo 使用培训
    • 维护项目特定的使用文档

🎉 总结

通过使用 Turbo,我们的项目获得了:

  • 更快的构建速度 - 增量构建和智能缓存
  • 🎯 更高的开发效率 - 自动化依赖管理
  • 💾 更好的资源利用 - 并行构建和缓存复用
  • 🔧 更简单的维护 - 统一的构建命令和配置

Turbo 让我们专注于业务逻辑开发,而不用担心复杂的构建配置和优化问题。


📅 最后更新: 2025年9月28日
👤 维护者: weiwei 1209562577@qq.com