Blog Detail

  • 🚀 Turbo 使用指南

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

    📋 目录

    [🚀 Turbo 使用指南](#🚀 Turbo 使用指南 "#-turbo-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97")

    [📋 目录](#📋 目录 "#-%E7%9B%AE%E5%BD%95")

    [🎯 什么是 Turbo?](#🎯 什么是 Turbo? "#-%E4%BB%80%E4%B9%88%E6%98%AF-turbo")

    [🏗️ 项目架构分析](#🏗️ 项目架构分析 "#%EF%B8%8F-%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90")

    [⚙️ 配置详解](#⚙️ 配置详解 "#%EF%B8%8F-%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3")

    [🔄 构建流程图](#🔄 构建流程图 "#-%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE")

    [✨ Turbo 优势对比](#✨ Turbo 优势对比 "#-turbo-%E4%BC%98%E5%8A%BF%E5%AF%B9%E6%AF%94")

    [💡 实际使用示例](#💡 实际使用示例 "#-%E5%AE%9E%E9%99%85%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B")

    [🛠️ 常用命令参考](#🛠️ 常用命令参考 "#%EF%B8%8F-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%8F%82%E8%80%83")

    [📈 最佳实践建议](#📈 最佳实践建议 "#-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE")

    🎯 什么是 Turbo?

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

    🔍 核心特性

    特性

    说明

    优势

    🚄 增量构建

    只构建发生变化的包

    大幅减少构建时间

    💾 智能缓存

    本地和远程缓存构建结果

    避免重复构建

    🔗 依赖管理

    自动处理包之间的依赖关系

    确保构建顺序正确

    ⚡ 并行执行

    同时构建多个独立的包

    最大化利用系统资源

    🤔 为什么需要 Turbo?

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

    bash

    复制代码

    # 传统方式:每次都要构建所有包

    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 结构:

    bash

    复制代码

    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-ui

    1.4.1

    UI 基础组件

    es/, lib/, dist/

    @hb/xh-web-echarts

    1.4.1

    图表组件

    es/, lib/, dist/

    @hb/xh-web-business-components

    1.4.1

    业务组件

    es/, lib/, dist/

    @hb/xh-web-cli

    1.4.1

    CLI 工具

    lib/, bin/

    @hb/xh-web-utils

    1.4.1

    工具函数

    es/, lib/

    ⚙️ 配置详解

    📄 turbo.json 配置分析

    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

    🌐 全局依赖

    全局变化时重新构建所有包

    💡 配置解析

    javascript

    复制代码

    // "dependsOn": ["^build"] 的含义:

    // ^ 表示依赖包(dependencies)

    // 意思是:构建当前包之前,先构建所有依赖的包

    // 实际执行顺序:

    // 1. web-utils (无依赖,优先构建)

    // 2. web-ui, web-echarts (依赖 web-utils)

    // 3. web-business-components (依赖前面所有包)

    🔧 package.json 中的 Turbo 集成

    json

    复制代码

    {

    "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 时:

    bash

    复制代码

    # 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 错误率

    📈 具体案例分析

    bash

    复制代码

    # 场景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)

    💡 实际使用示例

    🎮 开发环境使用

    bash

    复制代码

    # 开发时的常用命令

    pnpm run build # 构建所有变化的包

    pnpm run clean:build # 清理构建产物和缓存

    pnpm run clean:build && pnpm run build # 强制全量重新构建

    🔧 CI/CD 集成示例

    yaml

    复制代码

    # .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 脚本优化

    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" // 不推荐

    }

    }

    🛠️ 常用命令参考

    📋 基础命令

    bash

    复制代码

    # 🏗️ 构建相关

    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 # 生成性能分析报告

    📊 缓存管理

    bash

    复制代码

    # 💾 缓存操作

    turbo run build --force # 忽略缓存,强制构建

    rm -rf .turbo # 清理本地缓存

    pnpm run clean:build # 清理构建产物和缓存

    # 🔍 缓存分析

    turbo run build --summarize # 显示缓存命中率

    ls -la .turbo/cache/ # 查看缓存文件

    🎮 开发工作流

    bash

    复制代码

    # 🚀 常用开发流程

    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 - 推荐做法

    🎯 合理配置 outputs

    json

    复制代码

    {

    "outputs": ["dist/**", "es/**", "lib/**"] // 包含所有构建产物

    }

    🔗 正确设置依赖关系

    json

    复制代码

    {

    "dependsOn": ["^build"] // 依赖包优先构建

    }

    💾 利用缓存提升效率

    bash

    复制代码

    # 开发时保留 .turbo 目录

    echo ".turbo" >> .gitignore # 不提交缓存到 git

    📊 定期分析构建性能

    bash

    复制代码

    turbo run build --summarize # 查看缓存命中率

    turbo run build --graph # 分析依赖关系

    ❌ DON'T - 避免的做法

    ❌ 绕过 Turbo 直接构建

    bash

    复制代码

    # 不推荐:破坏了 Turbo 的优化

    cd packages/web-ui && npm run build

    ❌ 忽略依赖关系配置

    json

    复制代码

    {

    // 错误:没有配置依赖关系

    "build": {

    "outputs": ["dist/**"] // 缺少 dependsOn

    }

    }

    ❌ 频繁清理缓存

    bash

    复制代码

    # 不必要:除非出现构建问题,否则保留缓存

    rm -rf .turbo # 避免频繁执行

    🔧 性能优化建议

    ⚡ 启用并行构建

    确保包之间的依赖关系正确配置

    独立的包会自动并行构建

    💾 合理使用缓存

    保留 .turbo 目录提升本地开发效率

    CI/CD 中配置缓存策略

    📊 定期监控性能

    bash

    复制代码

    # 生成构建报告

    turbo run build --profile=build-profile.json

    # 分析报告(需要安装 Turbo 扩展工具)

    npx turbo-analyze build-profile.json

    🎯 团队协作建议

    📋 统一开发环境

    确保团队使用相同的 Node.js 版本

    使用 pnpm 作为包管理器

    🔄 规范构建流程

    json

    复制代码

    {

    "scripts": {

    "dev": "turbo run dev",

    "build": "turbo run build",

    "test": "turbo run test",

    "lint": "turbo run lint"

    }

    }

    📚 文档和培训

    为团队成员提供 Turbo 使用培训

    维护项目特定的使用文档

    🎉 总结

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

    ⚡ 更快的构建速度 - 增量构建和智能缓存

    🎯 更高的开发效率 - 自动化依赖管理

    💾 更好的资源利用 - 并行构建和缓存复用

    🔧 更简单的维护 - 统一的构建命令和配置

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

    📅 最后更新 : 2025年9月28日

    👤 维护者 : weiwei 1209562577@qq.com