Techniques
压缩
学习如何在 NestJS 应用中启用响应压缩以提高性能
压缩
压缩可以大大减少响应体的大小,从而提高 Web 应用的速度。
对于生产环境中的高流量网站,强烈建议将压缩从应用服务器中卸载 - 通常在反向代理(例如 Nginx)中进行。在这种情况下,您不应该使用压缩中间件。
与 Express 一起使用(默认)
使用 compression 中间件包来启用 gzip 压缩。
首先安装所需的包:
$ npm i --save compression
$ npm i --save-dev @types/compression
安装完成后,将压缩中间件应用为全局中间件。
import * as compression from 'compression';
// 在您的初始化文件中的某个位置
app.use(compression());
与 Fastify 一起使用
如果使用 FastifyAdapter,您需要使用 fastify-compress:
$ npm i --save @fastify/compress
安装完成后,将 @fastify/compress 中间件应用为全局中间件。
警告 请确保在创建应用时使用 NestFastifyApplication 类型。否则,您无法使用 register 来应用压缩中间件。
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import compression from '@fastify/compress';
// 在 bootstrap() 内部
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
await app.register(compression);
默认情况下,当浏览器表示支持该编码时,@fastify/compress 将使用 Brotli 压缩(在 Node >= 11.7.0 上)。虽然 Brotli 在压缩比方面可能非常高效,但它也可能相当慢。默认情况下,Brotli 设置最大压缩质量为 11,尽管可以通过调整 BROTLI_PARAM_QUALITY(0 最小到 11 最大)来减少压缩时间以换取压缩质量。这需要精细调整以优化空间/时间性能。质量为 4 的示例:
import { constants } from 'zlib';
// 在您的初始化文件中的某个位置
await app.register(compression, { brotliOptions: { params: { [constants.BROTLI_PARAM_QUALITY]: 4 } } });
为了简化,您可能希望告诉 fastify-compress 仅使用 deflate 和 gzip 来压缩响应;您最终会得到可能更大的响应,但它们的传输速度会快得多。
要指定编码,请为 app.register 提供第二个参数:
await app.register(compression, { encodings: ['gzip', 'deflate'] });
上述代码告诉 fastify-compress 仅使用 gzip 和 deflate 编码,如果客户端同时支持两者,则优先使用 gzip。