NestJS Logo
NestJS 中文文档
v10.0.0
  • 介绍
  • 快速上手
  • 控制器
  • 提供者
  • 模块
  • 中间件
  • 异常过滤器
  • 管道
  • 守卫
  • 拦截器
  • 自定义装饰器
  • 自定义提供者
  • 异步提供者
  • 动态模块
  • 依赖注入作用域
  • 循环依赖
  • 模块引用
  • 懒加载模块
  • 执行上下文
  • 生命周期事件
  • 发现服务
  • 跨平台无关性
  • 测试
迁移指南
API 参考
官方课程
  1. 文档
  2. 功能扩展
  3. 压缩

事件机制
文件上传

压缩(Compression)

通过对响应体进行压缩,可以显著减少数据传输的体积,从而提升 Web 应用的响应速度,尤其适用于网络环境较差或数据量较大的场景。

在高并发的生产环境中,强烈建议将压缩操作交由反向代理服务器(如 Nginx)处理,而不是在应用层实现。这样不仅能够减轻应用服务器的负担,还能提升整体系统性能。因此,在此类场景下不建议在应用中启用压缩中间件。

在 Express 中使用

如果你使用的是默认的 Express 平台,可以借助 compression 中间件为应用添加 gzip 压缩支持。

首先安装相关依赖:

npm install compression
npm install -D @types/compression

然后,在应用初始化阶段将其作为全局中间件注册:

main.ts
import * as compression from 'compression'

app.use(compression())

在 Fastify 中使用

如果你选择了 FastifyAdapter,建议使用官方提供的 @fastify/compress 插件来实现响应压缩:

npm install @fastify/compress

安装完成后,在应用初始化时注册该插件:

main.ts
import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify'
import compression from '@fastify/compress'

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter()
  )

  await app.register(compression)
}
注意

请确保在创建应用时使用 NestFastifyApplication 类型,否则将无法使用 register 方法来应用压缩中间件(compression-middleware)。

默认配置下,@fastify/compress 会根据客户端支持情况优先启用 Brotli 压缩(要求 Node.js 版本 ≥ 11.7.0)。相较于 gzip,Brotli 通常具备更高的压缩比,但压缩耗时也可能略高。

你可以通过设置 BROTLI_PARAM_QUALITY 参数(取值范围为 0~11)来平衡压缩率与压缩速度。例如,以下配置将压缩质量设置为 4:

main.ts
import { constants } from 'node:zlib'

await app.register(compression, {
  brotliOptions: {
    params: {
      [constants.BROTLI_PARAM_QUALITY]: 4,
    },
  },
})

如果你更关注压缩性能而非压缩比,也可以禁用 Brotli,仅使用 gzip 和 deflate,这通常能获得更快的响应速度。你可以通过 encodings 参数显式指定可用的压缩格式:

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

上述配置将在客户端同时支持 gzip 与 deflate 时,优先使用 gzip。