
Nx Monorepo là gì? Quản lý workspace full-stack với một tool duy nhất
Nx là một build system thông minh dành cho monorepo, cho phép quản lý nhiều ứng dụng và thư viện trong cùng một repository mà vẫn duy trì hiệu năng build tối ưu. Khác với việc tách biệt từng project riêng lẻ, Nx cung cấp computation caching, affected commands và distributed task execution — giúp team phát triển full-stack (frontend + backend + shared libraries) trong một repo duy nhất mà không bị chậm khi scale.
Tính năng cốt lõi: Nx phân tích dependency graph giữa các project, chỉ build/test những gì thực sự thay đổi (affected), và cache kết quả local hoặc remote (Nx Cloud). Điều này làm giảm thời gian CI/CD từ hàng chục phút xuống còn vài giây cho các thay đổi nhỏ.
Tại sao chọn Nx thay vì Turborepo hay Lerna?
- Computation caching thông minh: Nx cache không chỉ output build mà cả test, lint, type-check — mọi task có thể cache được.
- Affected commands chính xác: Chạy
nx affected:testchỉ test các project bị ảnh hưởng bởi thay đổi, không test toàn bộ repo. - Generators mạnh mẽ: Tự động sinh code boilerplate cho React, Next.js, Angular, NestJS, Express, Storybook, Cypress, Jest… với tuỳ chọn tùy chỉnh.
- Distributed task execution (DTE): Chia task chạy song song trên nhiều máy CI (GitHub Actions, GitLab, CircleCI) qua Nx Cloud.
- Hỗ trợ đa ngôn ngữ: TypeScript/JavaScript, Go, Python, Rust, .NET, Java — cùng sống chung trong một workspace.
- Integrated vs Package-based: Chế độ integrated (Nx quản lý toàn bộ) hoặc package-based (tự quản lý package.json) tùy ý.
Cấu trúc workspace Nx điển hình
Một workspace Nx thường có cấu trúc:
my-org/ ├── apps/ │ ├── frontend/ # Next.js, React, Angular app │ ├── backend/ # NestJS, Express, Fastify API │ └── mobile/ # React Native, Expo app ├── libs/ │ ├── shared/ # Types, utilities, constants dùng chung │ ├── ui/ # Component library (Storybook) │ ├── data-access/ # Prisma/Drizzle schemas, repositories │ └── api-interfaces/ # Typescript interfaces cho API contracts ├── tools/ # Custom generators, executors ├── nx.json # Cấu hình Nx (target defaults, namedInputs) ├── package.json # Root package.json (nếu package-based) └── tsconfig.base.json # Base TypeScript config
Mỗi thư viện trong libs/ có project.json định nghĩa targets (build, test, lint, serve) và dependencies. Nx dùng thông tin này để xây dựng dependency graph và tính toán affected projects.
Workflow phát triển với Nx
- Tạo workspace:
npx create-nx-workspace@latest my-org --preset=apps - Thêm ứng dụng:
nx g @nx/next:app frontend --bundler=webpackhoặcnx g @nx/nest:app backend - Tạo thư viện shared:
nx g @nx/js:lib shared --buildable --publishable - Chạy dev:
nx run-many --target=serve --projects=frontend,backend --parallel - Test affected:
nx affected:test --parallel=3 - Build production:
nx run-many --target=build --projects=frontend,backend --configuration=production
Caching và CI/CD tối ưu
Nx cache local (mặc định) hoặc remote qua Nx Cloud. Trên CI, bạn chỉ cần cấu hình nx-cloud start-ci-run và Nx sẽ tự động phân phối task (DTE) và khôi phục cache. Kết quả: PR nhỏ chỉ mất 30-60 giây thay vì 10-15 phút.
Ví dụ GitHub Actions workflow tối giản:
- uses: nrwl/nx-set-shas@v4 - run: npx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="build" - run: npx nx affected -t lint test build --parallel=3
Khi nào nên dùng Nx?
Nx phù hợp khi:
- Team phát triển nhiều ứng dụng liên quan (frontend + backend + mobile) chia sẻ code
- Cần giảm thời gian CI/CD cho repo lớn
- Muốn enforce kiến trúc modular, tách biệt concerns rõ ràng
- Cần generators để chuẩn hóa code style và giảm boilerplate
Đối với dự án nhỏ, đơn lẻ (single app), Nx có thể over-engineering — một Vite/Next.js project đơn giản sẽ nhẹ nhàng hơn.
Nx đang trở thành tiêu chuẩn de facto cho monorepo TypeScript/JavaScript, được dùng bởi các công ty như Microsoft, Google, Meta, Vercel và hàng ngàn team nhỏ hơn trên toàn cầu.
Tài liệu chính thức Nx | GitHub Nx | Nx Cloud Remote Caching
