Turborepo: Hệ thống build monorepo siêu nhanh từ Vercel

Turbo hay Turborepo là hệ thống build monorepo mã nguồn mở được Vercel phát triển, viết bằng Rust để đạt tốc độ cao nhất. Trong môi trường JavaScript và TypeScript hiện đại, monorepo ngày càng phổ biến nhưng việc quản lý hàng tá package trong cùng một repo đặt ra thách thức lớn về thời gian build. Turborepo giải quyết vấn đề này bằng cơ chế caching thông minh, chạy parallel trên mọi CPU core, và zero-config cho npm scripts hiện có.

Sơ đồ biểu diễn vấn đề monorepo: 3 package chạy tuần tự với thời gian 110 giây, 90 giây và 140 giây — minh họa tốc độ chậm khi không có build tool phù hợp

Turbo là gì và tại sao cần monorepo build system?

Trước khi Turborepo xuất hiện, các dự án monorepo JavaScript thường dùng Lerna (ra mắt 2015) hoặc webpack để quản lý nhiều package. Tuy nhiên, cả hai đều có điểm yếu: Lerna không caching hiệu quả, cấu hình webpack phức tạp và chậm khi project lớn.

Turborepo xuất hiện với triết lý khác: chỉ chạy những task bị ảnh hưởng bởi thay đổi. Thay vì rebuild toàn bộ project mỗi lần commit, Turborepo hash nội dung file, so sánh với cache, và skip các task không thay đổi. Kết quả thực tế từ Vercel cho thấy: build từ 340 giây giảm xuống còn 80ms khi cache hit.

>> FULL TURBO — minh họa tốc độ caching vượt trội” width=”900″ height=”337″>

Các tính năng chính của Turborepo

Content-based caching

Mỗi task được hash dựa trên: nội dung source file, biến môi trường, dependency versions, và config. Nếu hash không đổi, Turborepo phục hồi output từ cache thay vì chạy lại. Cơ chế này hoạt động cả ở local và remote.

Remote Cache (chia sẻ cache)

Vercel Remote Cache cho phép team chia sẻ cache giữa các developer và CI/CD pipeline. Khi một người build xong, người khác pull cache — CI không bao giờ phải làm lại cùng một công việc hai lần.

Parallel execution

Turborepo xây dựng task graph từ dependency của workspace, sau đó chạy các task song song trên mọi CPU core có sẵn, vẫn tuân thủ thứ tự phụ thuộc. Ví dụ: nếu package B phụ thuộc package A, thì A build xong trước B chạy.

Zero-config integration

Turborepo hoạt động với scripts trong package.json và config workspace có sẵn. Chỉ cần thêm file turbo.json là chạy, không cần rewrite cấu trúc project.

Multi-package manager

Hỗ trợ tất cả package manager phổ biến: npm, yarn, pnpm, và Bun. Dễ dàng chuyển đổi giữa các package manager mà không thay đổi cách Turborepo hoạt động.

Cách Turborepo hoạt động

Quy trình hoạt động của Turborepo gồm 4 bước cơ bản:

  • Bước 1 — Xây dựng task graph: Phân tích dependency giữa các package trong workspace để tạo đồ thị thực thi.
  • Bước 2 — Hashing: Mỗi task được mã hóa hash từ source files, dependencies, env vars và config.
  • Bước 3 — Kiểm tra cache: So hash với local cache. Nếu trùng → phục hồi output, skip execution. Nếu không → lên lịch chạy.
  • Bước 4 — Parallel execution: Các task chưa cache chạy song song trên mọi core, tuân thủ dependency DAG.

Với Remote Cache, kết quả cũng được đẩy lên server Vercel để team chia sẻ.

Cấu hình turbo.json cơ bản

File cấu hình chính là turbo.json. Dưới đây là ví dụ minimal:

{
  "$schema": "https://turborepo.dev/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", "dist/**"]
    },
    "test": {},
    "lint": {}
  }
}

Trong đó:

  • dependsOn: ["^build"] — task build chạy sau khi build các package phụ thuộc (symbol ^)
  • outputs — danh sách thư mục được cache. Nếu không khai báo, task vẫn chạy nhưng không cache output.
  • testlint — không phụ thuộc task nào, chạy song song hoàn toàn.

So sánh Turborepo với Nx và Lerna

Tiêu chí Turborepo Nx Lerna
Ngôn ngữ Rust TypeScript TypeScript (powered by Nx)
GitHub Stars ~31,000 ~29,280 ~36,000
Phiên bản mới nhất 2.10.12 23.1.2 10.0.1
Caching Local + Remote (Vercel) Local + Nx Cloud Local + Distributed
Plugin system Minimal (extenders) Rich plugin ecosystem Powered by Nx plugins
Publish npm packages Không (dùng tool riêng) Có (nx release) Có (core strength)
Học curve Thấp, zero-config Cao hơn, nhiều tính năng Trung bình

Turborepo tập trung vào tốc độ và minimal config — phù hợp nếu bạn chỉ cần caching + parallel execution. Nx là nền tảng monorepo đầy đủ hơn (code generation, affected analysis, plugins) nhưng phức tạp hơn. Lerna (2015) giờ được Nrwl duy trì, sử dụng Nx làm backend, mạnh nhất trong việc publish npm packages.

Các công ty sử dụng Turborepo

Theo showcase chính thức, Turborepo được sử dụng bởi nhiều công ty công nghệ lớn: AWS, Microsoft, Netflix, Disney, GitHub, Linear, Adobe, PayPal, Shopify, Datadog, Twilio, Twitch, Xiaomi và hàng trăm tổ chức khác.

Điều này cho thấy Turborepo đã trở thành chuẩn mực cho monorepo JavaScript/TypeScript trong môi trường sản xuất.

Cài đặt và bắt đầu nhanh

# Cài đặt (package manager bất kỳ)
npm install turbo --save-dev
# Hoặc
pnpm add turbo -Dw

# Khởi tạo cấu hình
npx turbo init

# Chạy task
npx turbo build
npx turbo test lint

Turborepo tự động phát hiện cấu trúc workspace từ package.json và pnpm-workspace.yaml, yarn workspaces, hoặc npm workspaces. Chỉ cần chạy turbo init là có thể bắt đầu caching ngay lập tức.

Khi nào nên dùng Turborepo?

  • Monorepo nhiều package: Khi bạn có 3+ packages xây dựng thường xuyên, Turborepo giúp tiết kiệm thời gian đáng kể.
  • CI/CD chậm: Remote Cache giúp CI không build lại những gì đã cache, giảm thời gian pipeline từ phút xuống giây.
  • Nhóm phát triển lớn: Nhiều người cùng commit, cache chia sẻ tránh trùng lặp work.
  • Đang dùng Lerna/Webpack: Dễ dàng migrate — Turborepo hoạt động bên cạnh hệ thống hiện có, không cần bỏ đi.

Hạn chế cần lưu ý

  • Không publish packages: Turborepo chỉ chạy tasks, không hỗ trợ publish lên npm. Bạn cần dùng changeset hoặc lerna publish riêng.
  • Plugin system hạn chế: Nếu cần code generation, scaffolding phong phú như Nx, Turborepo có thể chưa đủ.
  • Remote Cache cần Vercel account: Remote cache miễn phí cho open source, nhưng private project cần tài khoản Vercel.

Tóm lại, Turborepo là lựa chọn tối ưu cho monorepo JavaScript/TypeScript muốn tối đa tốc độ build mà không cần cấu hình phức tạp. Với cơ chế caching content-based và chạy parallel bằng Rust, nó biến những project build vài phút thành vài milliseconds khi cache hit.

Nguồn tham khảo:

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Homebrew Package Manager quản lý công cụ trên macOS

Homebrew là gì? Homebrew là package manager mã nguồn mở cho macOS và Linux. Nó giúp lập trình viên cài, cập nhật, gỡ cài đặt công cụ dòng lệnh (CLI)…

Xem thêm

Git Worktree: Quản lý nhiều branch song song trong một repo

Tại sao cần Git Worktree? Git workflow thông thường ép bạn chuyển branch liên tục: git checkout feature-A, sửa, rồi git checkout main, hotfix, rồi quay lại. Mỗi lần checkout…

Xem thêm

TypeScript satisfies operator là gì? Kiểm tra kiểu không đổi biến

TypeScript satisfies operator (toán tử satisfies) cho phép kiểm tra kiểu của một biểu thức phù hợp với kiểu mong đợi mà không thay đổi kiểu suy luận gốc của…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất