Monorepo là một repository duy nhất chứa nhiều package/app — ngược với polyrepo, nơi mỗi service có repo riêng.
Được gì: chia sẻ code dễ (shared UI library, utils), commit atomic xuyên package (sửa API và nơi dùng nó trong cùng một commit), tooling và CI thống nhất, refactor xuyên package nhẹ nhàng hơn hẳn.
Bộ máy vận hành:
- Task orchestration: Turborepo và Nx chạy task (build, test, lint) song song và theo đúng thứ tự phụ thuộc — package B phụ thuộc A thì A build trước.
- Affected command: nx affected --target=test chỉ chạy test cho những package bị ảnh hưởng bởi thay đổi — thiết yếu cho tốc độ CI ở monorepo lớn.
- Caching: Turborepo cache output build cả local lẫn remote (Vercel Remote Cache); input không đổi thì dùng lại cache thay vì build lại, và cache chia sẻ được giữa dev với CI.
- Internal package: packages/ui, packages/utils không publish lên npm, chỉ dùng nội bộ — tham chiếu bằng protocol workspace:* của pnpm.
- Versioning: Changesets lo version và changelog cho những package có publish.
Đánh đổi: repo lớn dần, CI phức tạp hơn, phải đầu tư tooling. Polyrepo vẫn dễ thở hơn khi các team và lịch deploy độc lập nhau.
Chọn giữa hai công cụ: Turborepo đơn giản hơn, Nx nhiều tính năng hơn (generator, devtools, cloud).