☰ 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ữ
Kỹ thuật (Techniques)

Compression

Bản dịch từ docs.nestjs.com/techniques/compression

Compression có thể giảm đáng kể kích thước của response body, từ đó tăng tốc độ của web app.

Với các website có lượng truy cập lớn trong production, khuyến nghị mạnh mẽ là nên đưa việc compression ra khỏi application server - thường là ở một reverse proxy (ví dụ, Nginx). Trong trường hợp đó, bạn không nên dùng compression middleware.

Use with Express (default) (Dùng với Express - mặc định)

Dùng package middleware compression để bật gzip compression.

Đầu tiên, cài package cần thiết:

$ npm i --save compression
$ npm i --save-dev @types/compression

Sau khi cài xong, áp dụng compression middleware như một global middleware.

import compression from 'compression';
// đặt ở đâu đó trong file khởi tạo của bạn
app.use(compression());

Use with Fastify (Dùng với Fastify)

Nếu dùng FastifyAdapter, bạn sẽ cần dùng fastify-compress:

$ npm i --save @fastify/compress

Sau khi cài xong, áp dụng middleware @fastify/compress như một global middleware.

Cảnh báo Hãy đảm bảo bạn dùng type NestFastifyApplication khi tạo ứng dụng. Nếu không, bạn không thể dùng register để áp dụng compression middleware.

import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';

import compression from '@fastify/compress';

// trong bootstrap()
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
await app.register(compression);

Theo mặc định, @fastify/compress sẽ dùng Brotli compression (trên Node >= 11.7.0) khi browser cho biết hỗ trợ encoding này. Dù Brotli có thể khá hiệu quả về tỷ lệ compression, nó cũng có thể khá chậm. Theo mặc định, Brotli đặt chất lượng compression tối đa là 11, tuy nhiên có thể điều chỉnh để giảm thời gian compression đổi lại chất lượng compression bằng cách điều chỉnh BROTLI_PARAM_QUALITY trong khoảng từ 0 đến 11. Việc này sẽ cần tinh chỉnh để tối ưu hiệu năng giữa dung lượng/thời gian. Ví dụ với chất lượng 4:

import { constants } from 'node:zlib';
// đặt ở đâu đó trong file khởi tạo của bạn
await app.register(compression, { brotliOptions: { params: { [constants.BROTLI_PARAM_QUALITY]: 4 } } });

Để đơn giản hóa, bạn có thể muốn báo cho fastify-compress chỉ dùng deflate và gzip để compress response; bạn sẽ nhận được response có thể lớn hơn nhưng chúng sẽ được gửi đi nhanh hơn nhiều.

Để chỉ định encoding, cung cấp tham số thứ hai cho app.register:

await app.register(compression, { encodings: ['gzip', 'deflate'] });

Đoạn code trên báo cho fastify-compress chỉ dùng encoding gzip và deflate, ưu tiên gzip nếu client hỗ trợ cả hai.

Ghi chú người dịch Đây chính là middleware compression quen thuộc trong Express thuần hoặc compress trong Laravel/Nginx — Nest không phát minh lại cơ chế nén, chỉ tái sử dụng ecosystem middleware sẵn có của Express/Fastify. Điểm cần nhớ: nếu bạn đã nén ở tầng reverse proxy (Nginx, CDN) thì đừng nén thêm ở app, vì vừa tốn CPU app server vô ích vừa có thể gây double-compression không cần thiết.

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.