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.