Nest CLI là một công cụ dòng lệnh (command-line interface) giúp bạn khởi tạo, phát triển và bảo trì các ứng dụng Nest. Nó hỗ trợ theo nhiều cách, bao gồm scaffold dự án, chạy dự án ở chế độ development, và build, đóng gói ứng dụng để phân phối cho production. Nest CLI áp dụng các pattern kiến trúc best-practice để khuyến khích bạn xây dựng ứng dụng có cấu trúc tốt.
Cài đặt (Installation)
Lưu ý: Trong hướng dẫn này, chúng tôi mô tả cách dùng npm để cài package, bao gồm cả Nest CLI. Bạn có thể dùng package manager khác tùy ý. Với npm, bạn có nhiều lựa chọn để quản lý cách dòng lệnh OS của bạn phân giải vị trí của file binary nest CLI. Ở đây, chúng tôi mô tả cách cài binary nest toàn cục (global) bằng option -g. Cách này tiện lợi, và là cách tiếp cận chúng tôi giả định xuyên suốt tài liệu. Lưu ý rằng việc cài bất kỳ package npm nào ở phạm vi toàn cục đồng nghĩa với việc bạn phải tự chịu trách nhiệm đảm bảo đang chạy đúng phiên bản. Điều này cũng có nghĩa là nếu bạn có nhiều dự án khác nhau, mỗi dự án sẽ chạy cùng một phiên bản CLI. Một lựa chọn thay thế hợp lý là dùng chương trình npx (đi kèm sẵn trong npm cli, hoặc tính năng tương tự ở package manager khác) để đảm bảo bạn chạy một phiên bản được quản lý của Nest CLI. Chúng tôi khuyến nghị bạn tham khảo tài liệu npx và/hoặc đội DevOps hỗ trợ để biết thêm chi tiết.
Ghi chú người dịch Đây gần giống chuyện chọn cài Go binary qua go install (global, dùng chung version cho mọi project) hay chạy trực tiếp qua go run (luôn dùng version khai báo trong go.mod). npx @nestjs/cli@latest giống go run ở chỗ nó tải và chạy đúng version bạn chỉ định mà không cần cài global, tránh tình trạng “máy tôi chạy version cũ, máy bạn chạy version mới”.
Cài CLI toàn cục bằng lệnh npm install -g (xem phần Lưu ý ở trên để biết chi tiết về việc cài global).
$ npm install -g @nestjs/cli
Gợi ý Ngoài ra, bạn có thể dùng lệnh npx @nestjs/cli@latest mà không cần cài cli toàn cục.
Quy trình cơ bản (Basic workflow)
Sau khi cài đặt, bạn có thể gọi các lệnh CLI trực tiếp từ dòng lệnh OS thông qua file thực thi nest. Xem danh sách các lệnh nest có sẵn bằng cách nhập:
$ nest --help
Xem trợ giúp cho một lệnh cụ thể bằng cú pháp sau. Thay bất kỳ lệnh nào, như new, add, v.v., vào vị trí generate trong ví dụ dưới đây để xem trợ giúp chi tiết cho lệnh đó:
$ nest generate --help
Để tạo, build và chạy một dự án Nest cơ bản mới ở chế độ development, hãy vào thư mục sẽ là thư mục cha của dự án mới, rồi chạy các lệnh sau:
$ nest new my-nest-project
$ cd my-nest-project
$ npm run start:dev
Lệnh new sẽ hỏi bạn chọn một module format. Các dự án ESM được tạo sẵn với Vitest và oxlint theo mặc định.
Trong trình duyệt, mở http://localhost:3000 để xem ứng dụng mới đang chạy. Ứng dụng sẽ tự động biên dịch lại và reload khi bạn thay đổi bất kỳ file source nào.
Gợi ý Chúng tôi khuyến nghị dùng SWC builder để build nhanh hơn (nhanh hơn 10 lần so với TypeScript compiler mặc định).
Cấu trúc dự án (Project structure)
Khi bạn chạy nest new, Nest sẽ tạo ra một cấu trúc ứng dụng boilerplate bằng cách tạo một folder mới và điền vào đó một bộ file ban đầu. Bạn có thể tiếp tục làm việc trong cấu trúc mặc định này, thêm các component mới, như mô tả xuyên suốt tài liệu này. Chúng ta gọi cấu trúc dự án được tạo bởi nest new là standard mode. Nest cũng hỗ trợ một cấu trúc khác để quản lý nhiều dự án và library, gọi là monorepo mode.
Ngoại trừ một vài điểm khác biệt cụ thể về cách quá trình build hoạt động (về cơ bản, monorepo mode đơn giản hóa các phức tạp trong build đôi khi phát sinh từ cấu trúc dự án kiểu monorepo), và hỗ trợ library tích hợp sẵn, phần còn lại của các tính năng Nest, cũng như tài liệu này, áp dụng như nhau cho cả cấu trúc dự án standard và monorepo mode. Trên thực tế, bạn có thể dễ dàng chuyển từ standard mode sang monorepo mode bất cứ lúc nào trong tương lai, nên bạn hoàn toàn có thể tạm hoãn quyết định này trong lúc vẫn đang tìm hiểu Nest.
Bạn có thể dùng bất kỳ mode nào để quản lý nhiều dự án. Dưới đây là tóm tắt nhanh sự khác biệt:
| Tính năng | Standard Mode | Monorepo Mode |
|---|---|---|
| Nhiều dự án | Cấu trúc file system riêng biệt | Một cấu trúc file system duy nhất |
node_modules & package.json |
Các instance riêng biệt | Dùng chung trong toàn monorepo |
| Compiler mặc định | tsc |
rspack |
| Cấu hình compiler | Chỉ định riêng biệt | Cấu hình mặc định cho cả monorepo, có thể override theo từng dự án |
| File cấu hình lint và formatter | Chỉ định riêng biệt | Dùng chung trong toàn monorepo |
Lệnh nest build và nest start |
Mặc định nhắm vào dự án (duy nhất) trong context | Mặc định nhắm vào dự án mặc định (default project) trong monorepo |
| Library | Quản lý thủ công, thường qua đóng gói npm | Hỗ trợ tích hợp sẵn, bao gồm quản lý path và bundling |
Ghi chú người dịch Nếu bạn từng dùng Nx, Turborepo, hay Lerna ở phía frontend/Node, monorepo mode của Nest CLI làm việc tương tự nhưng gói gọn hơn nhiều: mọi thứ được điều phối bởi một file nest-cli.json duy nhất thay vì một hệ sinh thái plugin riêng. So với Go workspaces (go.work) — nơi bạn ghép nhiều module lại để share code mà vẫn build độc lập — ý tưởng cốt lõi là giống nhau: một root dùng chung, nhiều project con.
Đọc các phần Workspaces và Libraries để biết thông tin chi tiết hơn, giúp bạn quyết định mode nào phù hợp nhất.
Cú pháp lệnh CLI (CLI command syntax)
Tất cả lệnh nest đều tuân theo cùng một định dạng:
nest commandOrAlias requiredArg [optionalArg] [options]
Ví dụ:
$ nest new my-nest-project --dry-run
Ở đây, new là commandOrAlias. Lệnh new có alias là n. my-nest-project là requiredArg. Nếu requiredArg không được cung cấp trên dòng lệnh, nest sẽ hỏi lại bạn. Ngoài ra, --dry-run có dạng rút gọn tương đương là -d. Với điều này, lệnh sau đây tương đương với lệnh ở trên:
$ nest n my-nest-project -d
Hầu hết các lệnh, và một số option, đều có alias. Hãy thử chạy nest new --help để xem các option và alias này, đồng thời xác nhận lại hiểu biết của bạn về các cấu trúc trên.
Tổng quan các lệnh (Command overview)
Chạy nest <command> --help cho bất kỳ lệnh nào dưới đây để xem các option riêng của lệnh đó.
Xem usage để biết mô tả chi tiết cho từng lệnh.
| Lệnh | Alias | Mô tả |
|---|---|---|
new |
n |
Scaffold một ứng dụng standard mode mới, với đầy đủ các file boilerplate cần thiết để chạy. |
generate |
g |
Tạo và/hoặc sửa file dựa trên một schematic. |
build |
Biên dịch một ứng dụng hoặc workspace vào một thư mục output. | |
start |
Biên dịch và chạy một ứng dụng (hoặc dự án mặc định trong workspace). | |
add |
Import một library đã được đóng gói dưới dạng nest library, chạy install schematic của nó. | |
upgrade |
update |
Nâng cấp một dự án hiện có lên phiên bản major NestJS mới nhất. |
deploy |
Deploy ứng dụng của bạn lên cloud, được cung cấp bởi Mau. | |
info |
i |
Hiển thị thông tin về các package nest đã cài và các thông tin hệ thống hữu ích khác. |
Yêu cầu hệ thống (Requirements)
Bản thân binary CLI chạy trên Node.js v20.11 trở lên, nhưng các schematic đứng sau nest new, nest generate, và nest upgrade (@nestjs/schematics) yêu cầu Node.js v22.22.3+, v24.15+, hoặc v26+. Chạy một ứng dụng Nest thì yêu cầu thấp hơn thế — xem migration guide để biết chi tiết đầy đủ — nên nếu bạn sinh code trên cùng máy bạn phát triển, hãy dùng bản LTS đang được hỗ trợ mới nhất.
Ghi chú người dịch Việc tách yêu cầu Node.js thành hai mức (chạy app thấp hơn, chạy schematic cao hơn) khá giống việc một số framework Go tách requirement giữa “chạy binary đã build” và “build từ source” — binary chạy được trên hệ thống cũ hơn máy build ra nó. Ở đây lý do là schematics dùng các API/ES feature mới hơn của Node để sinh code, còn app runtime của Nest thì tương thích ngược rộng hơn.
Nest CLI cũng yêu cầu một bản Node.js được build kèm hỗ trợ quốc tế hóa (ICU), như các bản chính thức từ trang chủ dự án Node.js. Nếu bạn gặp lỗi liên quan đến ICU, hãy kiểm tra xem binary của bạn có đáp ứng yêu cầu này không.
node -p process.versions.icu
Nếu lệnh này in ra undefined, nghĩa là binary Node.js của bạn không có hỗ trợ quốc tế hóa.