Turborepo vs Nx — so sánh công cụ monorepo thực chiến (2026)
Turborepo thắng về tính đơn giản cấu hình và tự host cache; Nx thắng về CI phân tán và hệ sinh thái plugin. Lựa chọn tùy quy mô CI và yêu cầu hạ tầng.
Bởi Ethan
2.066 từ · 11 phút đọc
Nếu team bạn có ít hơn năm CI runner và khoảng 30 package, hãy dùng Turborepo. Cấu hình đơn giản hơn, remote cache tự host miễn phí, và không bị phụ thuộc vào vendor. Nếu bạn đang chạy hơn 50 package trên nhiều máy CI phân tán, Nx Agents — tính năng mà Turborepo vẫn chưa có — có thể tiết kiệm đủ CI minutes để xứng đáng với chi phí. Một điểm đáng chú ý gần đây: Nx đã deprecated toàn bộ bốn package tự host cache vào tháng 5/2026 vì lỗ hổng CREEP (CVE-2025-36852). Các package này không còn nhận security patch; hai lựa chọn thay thế là Nx Cloud (tier Hobby miễn phí, không cần thẻ tín dụng) hoặc tự implement Nx remote cache theo OpenAPI spec. Điều này ảnh hưởng đáng kể đến quyết định của những team chú trọng kiểm soát hạ tầng.
Bài này dành cho ai
Các team TypeScript đang dùng pnpm hoặc Yarn workspaces với từ ba package trở lên và đã quyết định đi theo hướng monorepo. Nếu bạn chưa biết có nên dùng monorepo hay không, xem tổng hợp công cụ monorepo tốt nhất.
Chúng tôi đã kiểm thử gì
Turborepo v2.9.16 (stable, 2026-05-28) · Nx v22.x stable kết hợp v23.0.0-beta.24 cho các tính năng xem trước (2026-06-06).
Codebase của toolchew chạy Turborepo trên pnpm workspace, nên một số nhận xét về Turborepo đến từ trải nghiệm thực tế trên production — bao gồm cả các trường hợp ngoại lệ, không chỉ là happy path. Về phía Nx, chúng tôi chạy thử trên một monorepo được xây dựng riêng với 15 TypeScript package, đồng thời đọc kỹ tài liệu gốc, changelog, và các GitHub issue thread của cả hai công cụ.
Có một benchmark được trích dẫn nhiều (21 phút 56 giây Nx so với 25 phút 32 giây Turborepo trên N máy) thực ra là từ trang marketing của chính Nx/Nrwl. Chúng tôi loại bỏ nguồn này. Không có benchmark trung lập nào có phạm vi tương đương; ở những nơi không đo được, chúng tôi nói thẳng điều đó.
Hiệu năng build cache
Cả hai công cụ dùng cùng một mô hình cốt lõi: cache theo địa chỉ nội dung (content-addressed), khóa bằng hash của đầu vào (source file + config + các input được khai báo). Khi cache hit hoàn toàn, cả hai đều không chạy lại task. Turborepo in FULL TURBO; Nx replay lại cached output mà không re-execute.
Khác biệt thực tế xuất hiện từ Nx v22.7: task sandboxing. Nx giờ phát hiện được các lần truy cập input không khai báo trong quá trình chạy — nếu một task đọc file bạn quên khai báo là input, Nx sẽ cảnh báo thay vì âm thầm tạo ra cache hit sai. Turborepo không có tính năng này. Với những team đã từng bị cache cũ gây ra lỗi (trông như CI pass nhưng output lại sai), đây là lợi thế thực sự.
Kết quả: Nx về độ chính xác; hòa về tốc độ replay cache thuần túy. Không có benchmark trung lập nào có phạm vi tương đương — đừng tin vào bảng so sánh từ phía vendor.
Để tối ưu cache CI theo hệ thống, xem tối ưu build cache: những gì thực sự có tác dụng.
Điều phối task và xử lý song song
Cả hai công cụ đều xây dựng DAG (đồ thị phụ thuộc) của các task và chạy chúng theo thứ tự topo, song song hóa những gì graph cho phép. Trên một máy đơn, hành vi gần như tương đương.
Khoảng cách lộ rõ ở quy mô CI.
Turborepo phân phối công việc qua nhiều máy bằng cách để bạn tự chia task thành các lệnh turbo run riêng biệt. Nếu có ba CI runner, bạn tự quyết định cái gì chạy ở đâu. GitHub Discussion #7766 — “Distributed task execution” — đã mở từ tháng 3/2024. Tính năng này không xuất hiện trong v2.8 lẫn v2.9. Không có ETA công khai.
Nx Agents xử lý điều này tự động. Bạn khai báo agents: 5 trong config CI và Nx tự phân phối từng task riêng lẻ — không phải cả job — qua các runner, dùng dữ liệu thời gian lịch sử để cân bằng tải. Kết quả: parallelism gần tối ưu mà không cần phân chia thủ công.
Kết quả với CI đa máy: Nx, và không phải bàn cãi. Nếu scale CI theo chiều ngang nằm trong kế hoạch của bạn, đây là khoảng cách lớn nhất giữa hai công cụ.
Hệ sinh thái plugin và generator
Nx cung cấp khoảng 149 plugin: 33 package @nx/ chính thức hỗ trợ Angular, React, Next.js, Remix, Vue, Nuxt, Node, Express, NestJS, React Native, Expo, Vite, esbuild, rspack, Rsbuild, Jest, Vitest, Cypress, Playwright, Storybook, Gradle, Maven, Docker, và .NET. Thêm ~116 plugin cộng đồng cho Python, Rust, Go, Spring Boot, Flutter, Svelte, SolidJS, AWS CDK, Firebase, Terraform, Pulumi, và Astro. Nx Console (VS Code) cho bạn giao diện đồ họa để chạy generator và xem project graph.
Turborepo chọn hướng gọn hơn: không có plugin system chính thức. Bạn có các template create-turbo và repo ví dụ, nhưng không có workspace generator tương đương nx generate.
Nếu monorepo của bạn chỉ dùng TypeScript và bạn ổn với việc tạo cấu trúc thủ công, khoảng cách này không ảnh hưởng nhiều. Nếu bạn cần generate các package không phải JS hoặc muốn hướng dẫn tooling cho repo đa ngôn ngữ, Nx là lựa chọn rõ ràng.
Kết quả: Nx, không phải bàn cãi.
Remote caching
Đây là điểm thay đổi lớn nhất trong năm 2026.
Turborepo
Turborepo công bố open cache API spec. Bất kỳ HTTP server nào implement được spec đó đều có thể làm backend. Hai lựa chọn thực tế:
- Vercel Remote Cache (managed): miễn phí trên tất cả các gói Vercel, kể cả team không host trên Vercel. [TODO: affiliate link — /go/vercel]
- ducktors/turborepo-remote-cache: backend self-hosted mã nguồn mở ở v2.11.1 (tháng 5/2026), 107 bản release, 47 contributor, vẫn được duy trì tích cực. Dùng được trên production mà không phụ thuộc vào vendor.
Nx Cloud
- Hobby: miễn phí mãi — 50,000 credit/tháng, 5 contributor, 10 kết nối CI đồng thời. Không cần thẻ tín dụng.
- Team: $19/contributor/tháng + $5.50/10,000 credit vượt hạn mức.
- Enterprise: giá thỏa thuận. Đây là tier duy nhất bao gồm Nx Cloud tự host hoặc on-premises.
Thay đổi tháng 5/2026: Nx đã deprecated @nx/s3-cache, @nx/gcs-cache, @nx/azure-cache, và @nx/shared-fs-cache vào ngày 2026-05-21 do CVE-2025-36852 (CREEP — cache repository exfiltration via injection of protected artifacts). Cách xử lý là deprecated, không phải vá lỗi: các package này không còn nhận security update. Hai hướng đi được hỗ trợ là: chuyển sang Nx Cloud (tier Hobby miễn phí, không cần thẻ tín dụng) hoặc tự implement Nx remote cache theo OpenAPI spec. Các team có yêu cầu data residency nghiêm ngặt còn lựa chọn thứ ba: Nx Cloud on-premises, chỉ có ở tier Enterprise.
Nếu trước đây bạn dùng S3 hoặc GCS cache của Nx vì lý do data residency, CI air-gapped, hoặc kiểm soát chi phí, bạn đang đi trên một con đường không còn được hỗ trợ — các lựa chọn là tier Hobby miễn phí của Nx Cloud, tự implement OpenAPI, hoặc Enterprise cho on-prem.
| Tiêu chí | Turborepo | Nx |
|---|---|---|
| Managed miễn phí | Vercel (miễn phí mọi gói) | Hobby: 50k credit/tháng |
| Self-host miễn phí | Open API + ducktors OSS | Deprecated (không có patch); Nx Cloud tier miễn phí hoặc DIY OpenAPI |
| Rủi ro phụ thuộc vendor | Thấp (open spec) | Cao hơn sau khi deprecated |
Kết quả về self-hosting: Turborepo. Việc deprecated là lý do chính đáng để tránh Nx nếu kiểm soát hạ tầng là ưu tiên của bạn.
Áp dụng từng bước
Cả hai công cụ đều không yêu cầu viết lại từ đầu. Cả hai hoạt động bằng cách thêm một config file và một script entry vào pnpm hoặc Yarn workspace hiện có.
Một điểm cần lưu ý khi dùng Turborepo với pnpm: pnpm-workspace.yaml phải tồn tại trước khi cài Turborepo trong repo đa package. Nếu thiếu, bạn sẽ gặp lỗi --workspace-root may only be used inside a workspace — không rõ ràng chút nào khi lần đầu gặp.
Nx có hướng dẫn migration chính thức từ Turborepo tại nx.dev/docs/guides/adopting-nx/from-turborepo. Chiều ngược lại (Turborepo docs về migrate từ Nx) ít chi tiết hơn.
Kết luận: hòa. Cả hai đều hỗ trợ áp dụng dần dần. Turborepo hơi đơn giản hơn khi bắt đầu từ đầu; Nx có tài liệu migration tốt hơn.
Để dựng từ đầu, xem Cách thiết lập monorepo pnpm + Turborepo từ đầu.
Tốc độ phát triển
Turborepo (Vercel): stable v2.9.16, canary v2.9.17-canary.5 tính đến tháng 6/2026. Các cải tiến gần đây tập trung vào Bun nested dependency, PTY fix, và ví dụ Rsbuild. Khoảng cách về DTE (Discussion #7766, tháng 3/2024) vẫn là thread lớn nhất chưa được giải quyết, không có ngày ra mắt công khai dù đã hơn hai năm.
Nx (Nrwl): v22.x stable, v23.0.0-beta.24 đang phát triển. Chu kỳ v23 deprecated SCAM generator, ESLint v8, withNx cho Next.js, và generator module-federation cũ. Mới trong v22.7: task sandboxing. Mới trong nx migrate --run-migrations: chế độ migration có hỗ trợ AI agent. Release velocity cao hơn, thay đổi tham vọng hơn.
Kết luận: cả hai đang được duy trì tích cực. Nx phát triển nhanh hơn và có roadmap v23 táo bạo hơn.
Bảng kết quả: Turborepo vs Nx
| Tiêu chí | Kết quả |
|---|---|
| Độ chính xác build cache | Nx (task sandboxing) |
| Điều phối trên một máy | Hòa |
| CI phân tán — đa máy | Nx |
| Hệ sinh thái plugin và generator | Nx |
| Remote cache: managed miễn phí | Hòa |
| Remote cache: self-hosting | Turborepo |
| Đơn giản cấu hình | Turborepo |
| Áp dụng từng bước | Hòa |
| Rủi ro vendor lock-in | Turborepo |
Chọn Turborepo nếu: bạn muốn setup gọn nhẹ, tự host cache, team nhỏ (1–4 CI runner, ≤30 package), hoặc tin tức về CVE/deprecated của Nx khiến bạn muốn kiểm soát hạ tầng nhiều hơn.
Chọn Nx nếu: bạn chạy CI phân tán trên 5+ máy, cần generator cho package không phải JS, hoặc đang đầu tư vào hệ sinh thái Nx plugin và tier Hobby đáp ứng đủ nhu cầu của bạn.
Lưu ý
Chúng tôi không chạy benchmark CI phân tán ở quy mô lớn (Nx Agents với 10+ máy). Đánh giá về CI phân tán dựa trên phân tích kiến trúc và tài liệu, không phải dữ liệu wall-clock thực tế.
toolchew đang dùng Turborepo. Chúng tôi đã nêu rõ điều này khi liên quan. Thực tế này cho thấy rõ hơn các điểm yếu của Turborepo — friction khi setup pnpm workspace, các trường hợp ngoại lệ về cache invalidation từ production thực — hơn là về phía Nx.
Các cạm bẫy setup pnpm workspace và cache edge case chúng tôi gặp được ghi lại trong Những cạm bẫy monorepo chúng tôi học được qua thực tiễn.
Nx Hobby giới hạn 5 contributor và 10 kết nối CI đồng thời. Hãy tính toán chi phí theo số người thực tế trong team trước khi cam kết.
Chưa có affiliate link cho Vercel. CTA Vercel Remote Cache ở trên được đánh dấu [TODO: affiliate link — /go/vercel]. Một issue theo dõi đã được tạo để bổ sung trước khi publish nếu quan hệ affiliate với Vercel được xác nhận.
Tài liệu tham khảo
- Turborepo docs — remote caching
- Turborepo — package and task graph concepts
- Turborepo releases (GitHub)
- GitHub Discussion #7766 — Distributed task execution (Turborepo)
- ducktors/turborepo-remote-cache
- Nx — how caching works
- Nx — deprecated self-hosted cache packages (CVE-2025-36852)
- Nx — CI features: affected
- Nx — mental model
- Nx plugin registry
- Nx Cloud pricing
- Nx releases (GitHub)
- Nx v22.7.0 release notes — task sandboxing
- Nx migration guide from Turborepo
- dub.co — Turborepo migration post
- Nhost — pnpm + Turborepo monorepo setup