> For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.

# server.compress

- **Type:**

```ts
type Compress =
  | boolean
  | {
      filter?: (req: IncomingMessage, res: ServerResponse) => boolean;
      level?: number;
    };
```

- **Default:** `true`

Configure whether to enable [gzip compression](https://developer.mozilla.org/en-US/docs/Glossary/gzip_compression) for static assets served by the dev server or preview server.

## Disable compression

To disable the gzip compression, set `compress` to `false`:

```ts title="rsbuild.config.ts"
export default {
  server: {
    compress: false,
  },
};
```

## Options

### filter

- **Type:** `(req: IncomingMessage, res: ServerResponse) => boolean`
- **Default:** `undefined`
- **Version:** `>= v1.4.4`

A function that determines whether a response should be compressed.

Returns `true` to compress the response, `false` to skip compression.

```ts title="rsbuild.config.ts"
export default {
  server: {
    compress: {
      filter: (req) => {
        if (req.url?.includes('/foo')) {
          return false;
        }
        return true;
      },
    },
  },
};
```

### level

- **Type:** `number`
- **Default:**
  - Dev server: `1` (zlib.constants.Z\_BEST\_SPEED)
  - Preview server: `6` (zlib.constants.Z\_DEFAULT\_COMPRESSION)
- **Version:** `>= v1.4.4`

Used to set the level of zlib compression applied to responses. A higher level will result in better compression, but will take longer to complete; a lower level will result in less compression, but will be much faster. This value is an integer in the range of 0 (no compression) to 9 (maximum compression).

Rsbuild dev server uses [zlib.constants.Z\_BEST\_SPEED](https://nodejs.org/api/zlib.html#constants) as the default compression level, which provides the best compression performance. The preview server sets `level` to [zlib.constants.Z\_DEFAULT\_COMPRESSION](https://nodejs.org/api/zlib.html#constants) by default.

```ts title="rsbuild.config.ts"
export default {
  server: {
    compress: {
      level: 6,
    },
  },
};
```

:::tip
In actual production environments, web servers like Nginx or Apache are commonly used, which may use different compression levels. Therefore, you might observe differences between the file sizes after gzip compression in your local environment compared to production.
:::

## Streaming responses

Gzip compression may buffer data, delaying delivery of streamed HTML. To send a chunk without waiting for the response to end, call `res.flush?.()` after `res.write()`.

```ts
res.setHeader('Content-Type', 'text/html');
res.write('<!doctype html><html><body><p>Loading...</p>');
res.flush?.();

// Continue writing as data becomes available, then call res.end().
```

`res.flush()` flushes the gzip buffer without ending the response. It is provided by the compression middleware, so use optional chaining (`?.`) to handle cases where the method is unavailable, such as when compression is disabled.

When using `server.setup`, register your streaming handler with `server.middlewares.use()` inside the returned callback so the compression middleware runs first. See [Middleware execution order](/config/server/setup.md#middleware-execution-order).
