☰ Mục lục series
Tài liệu NestJS tiếng Việt
  1. Nhập môn (Overview)
    1. Giới thiệu
    2. First steps
    3. Controllers
    4. Providers
    5. Modules
    6. Middleware
    7. Exception filters
    8. Pipes
    9. Guards
    10. Interceptors
    11. Custom decorators
  2. Nền tảng (Fundamentals)
    1. Custom providers
    2. Asynchronous providers
    3. Dynamic modules
    4. Injection scopes
    5. Circular dependency
    6. Module reference
    7. Lazy-loading modules
    8. Execution context
    9. Lifecycle events
    10. Discovery service
    11. Platform agnosticism
    12. Testing
  3. Kỹ thuật (Techniques)
    1. Configuration
    2. Database (SQL)
    3. MongoDB
    4. Validation
    5. Caching
    6. Serialization
    7. Versioning
    8. Task scheduling
    9. Queues
    10. Logging
    11. Cookies
    12. Events
    13. Compression
    14. File upload
    15. Streaming files
    16. HTTP module
    17. Session
    18. MVC
    19. Performance (Fastify)
    20. Server-Sent Events
  4. Bảo mật (Security)
    1. Authentication
    2. Authorization
    3. Encryption & Hashing
    4. Helmet
    5. CORS
    6. CSRF
    7. Rate limiting
    8. Vòng đời request
  5. OpenAPI (Swagger)
    1. Introduction
    2. Types and parameters
    3. Operations
    4. Security
    5. Mapped types
    6. Decorators
    7. CLI plugin
    8. Other features
  6. Recipes
    1. REPL
    2. CRUD generator
    3. SWC (fast compiler)
    4. Passport (auth)
    5. Hot reload
    6. MikroORM
    7. Router module
    8. Health checks (Terminus)
    9. CQRS
    10. Prisma
    11. Serve static
    12. Commander
    13. Async local storage
  7. WebSockets
    1. Gateways
    2. Exception filters
    3. Pipes
    4. Guards
    5. Interceptors
    6. Adapters
  8. Microservices
    1. Overview
    2. Redis
    3. MQTT
    4. NATS
    5. RabbitMQ
    6. Kafka
    7. gRPC
    8. Custom transporters
    9. Exception filters
    10. Pipes
    11. Pre-request hooks
    12. Guards
    13. Interceptors
  9. GraphQL
    1. Quick start
    2. Resolvers
    3. Mutations
    4. Subscriptions
    5. Scalars
    6. Directives
    7. Interfaces
    8. Unions and enums
    9. Field middleware
    10. Mapped types
    11. Plugins
    12. Complexity
    13. Extensions
    14. CLI plugin
    15. Generating SDL
    16. Sharing models
    17. Other features
    18. Federation
  10. CLI & triển khai
    1. CLI overview
    2. Workspaces
    3. Libraries
    4. Usage
    5. Scripts
    6. Deployment
    7. Standalone apps
  11. FAQ
    1. Serverless
    2. HTTP adapter
    3. Keep-Alive connections
    4. Global path prefix
    5. Raw body
    6. Hybrid application
    7. HTTPS & multiple servers
    8. Common errors
  12. Phụ lục
    1. Bảng thuật ngữ
CLI & triển khai

Nest CLI and scripts (Nest CLI và scripts)

Bản dịch từ docs.nestjs.com/cli/scripts

Phần này cung cấp thêm bối cảnh về cách lệnh nest tương tác với các compiler và script, giúp đội DevOps quản lý môi trường phát triển.

Một ứng dụng Nest là một ứng dụng TypeScript tiêu chuẩn, cần được compile sang JavaScript trước khi có thể chạy được. Có nhiều cách khác nhau để thực hiện bước compile này, và developer/team có thể tự do chọn cách phù hợp nhất với mình. Với tinh thần đó, Nest cung cấp sẵn một bộ công cụ nhằm:

  • Cung cấp một quy trình build/execute chuẩn, chạy được ngay từ command line, “chạy là được” với các giá trị mặc định hợp lý.
  • Đảm bảo quy trình build/execute là mở, để developer có thể truy cập trực tiếp vào các công cụ bên dưới nhằm tùy chỉnh chúng bằng các tính năng và tùy chọn gốc (native).
  • Vẫn giữ nguyên là một framework TypeScript/Node.js hoàn toàn tiêu chuẩn, để toàn bộ pipeline compile/deploy/execute có thể được quản lý bởi bất kỳ công cụ bên ngoài nào mà team phát triển chọn dùng.

Mục tiêu này đạt được thông qua sự kết hợp giữa lệnh nest, một TypeScript compiler cài đặt cục bộ, và các script trong package.json. Chúng ta sẽ mô tả cách các công nghệ này phối hợp với nhau bên dưới. Điều này sẽ giúp bạn hiểu chuyện gì đang diễn ra ở từng bước của quy trình build/execute, và cách tùy chỉnh hành vi đó nếu cần.

The nest binary (Binary nest)

Lệnh nest là một binary ở cấp hệ điều hành (tức là chạy từ dòng lệnh của OS). Lệnh này thực chất bao gồm 3 mảng riêng biệt, được mô tả bên dưới. Chúng tôi khuyến nghị bạn chạy các sub-command build (nest build) và execution (nest start) thông qua các script trong package.json được tự động cung cấp khi một project được scaffold (xem typescript starter nếu bạn muốn bắt đầu bằng cách clone một repo, thay vì chạy nest new).

Build

nest build là một lớp bọc (wrapper) trên compiler tsc hoặc swc tiêu chuẩn (đối với project tiêu chuẩn), hoặc trên bundler Rspack (đối với monorepo). Nó không thêm bất kỳ tính năng hay bước compile nào khác, ngoại trừ việc xử lý sẵn tsconfig-paths. Lý do nó tồn tại là vì hầu hết developer, đặc biệt là khi mới bắt đầu với Nest, không cần điều chỉnh các tùy chọn compiler (ví dụ: file tsconfig.json), vốn đôi khi khá rắc rối.

Xem tài liệu nest build để biết thêm chi tiết.

Execution (Thực thi)

nest start đơn giản là đảm bảo project đã được build (giống như nest build), sau đó gọi lệnh node theo cách di động (portable), dễ dùng để chạy ứng dụng đã compile. Cũng như với build, bạn được tự do tùy chỉnh quy trình này theo nhu cầu, bằng cách dùng lệnh nest start cùng các tùy chọn của nó, hoặc thay thế hoàn toàn nó. Toàn bộ quy trình là một pipeline build và execute chuẩn của ứng dụng TypeScript, và bạn được tự do quản lý quy trình này theo cách đó.

Xem tài liệu nest start để biết thêm chi tiết.

Generation (Sinh mã)

Các lệnh nest generate, đúng như tên gọi, sinh ra các Nest project mới, hoặc các component bên trong chúng.

Package scripts (Script trong package.json)

Chạy các lệnh nest ở cấp OS đòi hỏi binary nest phải được cài đặt global. Đây là một tính năng tiêu chuẩn của npm, nằm ngoài tầm kiểm soát trực tiếp của Nest. Một hệ quả của việc này là binary nest cài global sẽ không được quản lý như một dependency của project trong package.json. Ví dụ, hai developer khác nhau có thể đang chạy hai phiên bản khác nhau của binary nest. Giải pháp tiêu chuẩn cho vấn đề này là dùng package script, để bạn có thể coi các công cụ dùng trong bước build và execute như những dev dependency.

Ghi chú người dịch Đây chính là lý do vì sao npm run build được khuyến nghị thay vì gõ thẳng nest build: giống như cách bạn không cài webpack global rồi gọi trực tiếp mà luôn qua script trong package.json, cách này đảm bảo cả team dùng đúng version CLI được khai báo trong devDependencies, tránh tình trạng “máy tôi chạy được, máy bạn không” do lệch version global.

Khi bạn chạy nest new, hoặc clone typescript starter, Nest sẽ điền vào các script trong package.json của project mới những lệnh như build và start. Nó cũng cài đặt các công cụ compiler bên dưới (như typescript) dưới dạng dev dependency.

Bạn chạy các script build và execute bằng các lệnh như:

$ npm run build

và

$ npm run start

Các lệnh này dùng khả năng chạy script của npm để thực thi nest build hoặc nest start bằng binary nest được cài đặt cục bộ. Bằng cách dùng các package script có sẵn này, bạn có toàn quyền quản lý dependency đối với các lệnh Nest CLI*. Điều này có nghĩa là, bằng cách theo cách dùng được khuyến nghị này, mọi thành viên trong tổ chức của bạn đều được đảm bảo chạy cùng một phiên bản của các lệnh.

*Điều này áp dụng cho các lệnh build và start. Các lệnh nest new và nest generate không nằm trong pipeline build/execute, nên chúng hoạt động trong một ngữ cảnh khác, và không đi kèm sẵn script trong package.json.

Đối với hầu hết developer/team, chúng tôi khuyến nghị nên tận dụng các package script để build và execute Nest project của mình. Bạn có thể tùy chỉnh hoàn toàn hành vi của các script này thông qua tùy chọn của chúng, và/hoặc tùy chỉnh file cấu hình compiler tsc, swc, hoặc Rspack (ví dụ: tsconfig.json) khi cần. Bạn cũng được tự do chạy một quy trình build hoàn toàn tùy chỉnh để compile TypeScript (thậm chí chạy trực tiếp TypeScript bằng ts-node).

Backward compatibility (Khả năng tương thích ngược)

Vì các ứng dụng Nest là các ứng dụng TypeScript thuần túy, các phiên bản trước đó của script build/execute của Nest sẽ tiếp tục hoạt động. Bạn không bắt buộc phải nâng cấp chúng. Bạn có thể chọn tận dụng các lệnh nest build và nest start mới khi sẵn sàng, hoặc tiếp tục chạy các script cũ hoặc đã tùy chỉnh.

Migration (Di chuyển)

Mặc dù bạn không bắt buộc phải thay đổi gì, bạn có thể muốn chuyển sang dùng các lệnh CLI mới thay vì dùng các công cụ như tsc-watch hoặc ts-node. Trong trường hợp này, chỉ cần cài đặt phiên bản mới nhất của @nestjs/cli, cả global lẫn cục bộ:

$ npm install -g @nestjs/cli
$ cd  /some/project/root/folder
$ npm install -D @nestjs/cli

Sau đó bạn có thể thay thế các scripts được định nghĩa trong package.json bằng những script sau:

"build": "nest build",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",

Nội dung gốc: NestJS Documentation © Kamil Myśliwiec, giấy phép MIT. Bản dịch và ghi chú: Lê Văn Dũng.