koa-compress

Compress middleware for koa

MIT 23 个版本
安装
npm install koa-compress
yarn add koa-compress
pnpm add koa-compress
bun add koa-compress
README

Koa Compress

Node.js CI codecov

Compress middleware for Koa

Example

const compress = require("koa-compress");
const Koa = require("koa");

const app = new Koa();
app.use(
  compress({
    filter(content_type) {
      return /text/i.test(content_type);
    },
    threshold: 2048,
    gzip: {
      flush: require("zlib").constants.Z_SYNC_FLUSH,
    },
    deflate: {
      flush: require("zlib").constants.Z_SYNC_FLUSH,
    },
    zstd: {
      flush: require("zlib").constants.Z_SYNC_FLUSH,
    },
    br: false, // disable brotli
  }),
);

Maintainers

Options

filter<Function>

function (mimeType: string): boolean {}

A predicate that checks the response MIME type to decide whether to compress. Default: compressible.

options.threshold<String|Number|Function>

Minimum response size in bytes to compress. Can also be a string parsed by bytes() (e.g. "1kb") or a function (see Functional properties). Default: 1024.

options[encoding]<Object|Function>

Supported encodings in default preference order: zstd, br, gzip, deflate. Setting options[encoding] = {} passes those options to the corresponding zlib compressor. Setting options[encoding] = false disables that encoding.

Can also be a function (see Functional properties).

options.br

Brotli compression is available natively in all supported Node.js versions. The default quality level is 4 for performance reasons.

options.zstd

Zstandard compression is natively supported starting from Node.js v22.15.0 (LTS) and v23.8.0 (Current). The middleware detects zlib.createZstdCompress at runtime; if available, zstd is enabled automatically, otherwise it is skipped.

options.defaultEncoding<String>

Encoding assumed when the client sends no Accept-Encoding header. Default: "identity" (no compression).

The HTTP spec treats a missing header as * (any encoding is acceptable), but that causes problems when debugging with tools like curl or wget. Set defaultEncoding to "*" to restore spec-compliant behavior.

Manually turning compression on and off

You can force compression by setting ctx.compress = true (bypasses the filter check). You can disable compression by setting ctx.compress = false.

app.use((ctx, next) => {
  ctx.compress = true;
  ctx.body = fs.createReadStream(file);
});

ctx.compress can also be an options object (same shape as the middleware options). Its threshold and encoding properties override the global defaults for this response. Note: an options object does not bypass the filter check — only true does.

Functional properties

The threshold and per-encoding options can be functions. They are called for every response with three arguments:

  • type — same as ctx.response.type
  • size — same as ctx.response.length
  • ctx — the full Koa context object

The function should return a valid value for that property. Returning another function of the same shape is allowed — it will be called in turn.

Example:

app.use(
  compress({
    gzip: (type, size) => (size && size < 65536 ? { level: 9 } : false),
    br: (type, size) => size && size >= 65536,
  }),
);

See the Koa documentation for ctx and ctx.response.

版本列表
5.2.2 2026-06-16
5.2.1 2026-03-12
5.2.0 2026-02-11
5.1.1 2023-04-09
5.1.0 2021-08-18
5.0.1 2020-07-06
5.0.0 2020-07-06
4.0.1 2020-04-30
4.0.0 2020-04-28
3.1.0 2020-04-16
3.0.0 2018-04-14
2.0.0 2016-02-25
1.0.9 2016-02-17
1.0.8 2014-09-15
1.0.7 2014-05-14
1.0.6 2014-04-25
1.0.5 2014-04-25
1.0.4 2014-03-19
1.0.3 2014-02-24
1.0.2 2014-01-22
1.0.1 2014-01-14
1.0.0 2013-12-21
0.0.1 2013-08-20