☰ 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ữ
GraphQL

Chia sẻ model (Sharing models)

Bản dịch từ docs.nestjs.com/graphql/sharing-models

Cảnh báo Chương này chỉ áp dụng cho cách tiếp cận code first.

Một trong những lợi thế lớn nhất khi dùng TypeScript cho backend của dự án là khả năng tái sử dụng cùng một model trong ứng dụng frontend viết bằng TypeScript, thông qua một package TypeScript dùng chung.

Nhưng có một vấn đề: các model được tạo ra bằng cách tiếp cận code first bị gắn rất nhiều decorator liên quan đến GraphQL. Các decorator đó không có ý nghĩa gì ở phía frontend, và ảnh hưởng tiêu cực đến hiệu năng.

Dùng model shim

Để giải quyết vấn đề này, NestJS cung cấp một “shim” cho phép bạn thay thế các decorator gốc bằng code trung tính (inert code) thông qua cấu hình webpack (hoặc tương tự). Để dùng shim này, cấu hình một alias giữa package @nestjs/graphql và shim.

Ví dụ, với webpack thì cấu hình như sau:

resolve: { // xem: https://webpack.js.org/configuration/resolve/
  alias: {
      "@nestjs/graphql": path.resolve(__dirname, "../node_modules/@nestjs/graphql/dist/extra/graphql-model-shim")
  }
}

Gợi ý Package TypeORM cũng có một shim tương tự, có thể xem tại đây.

Ghi chú người dịch Cơ chế này giống hệt việc bạn alias một module sang bản “stub” trong webpack/jest để loại bỏ code không cần thiết khỏi bundle: shim định nghĩa lại @ObjectType(), @Field()… thành các hàm/decorator rỗng, không làm gì cả. Nhờ đó khi bundler build cho frontend, các decorator GraphQL vẫn biên dịch được (không lỗi cú pháp/type) nhưng không kéo theo bất kỳ logic hay dependency nặng nào của @nestjs/graphql vào bundle client.

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.