Handling Compression
1. Installing compression Package
2. Enabling Response Compression
Example: Default
import compression from "compression";
app.use(compression());
Note: In production, compression is often best handled by the reverse proxy (Nginx, CloudFront, Cloudflare) — terminate compression at the edge.
3. Setting Compression Level
| Level | Trade-off |
| 1 | Fastest, lowest ratio |
| 6 (default) | Good balance |
| 9 | Best ratio, highest CPU |
Example: Custom level
app.use(compression({ level: 6 }));
4. Filtering Compressible Responses
Example: Custom filter
app.use(compression({
filter: (req, res) => {
if (req.headers["x-no-compression"]) return false;
return compression.filter(req, res); // default: compressible MIME types
}
}));
5. Setting Compression Threshold
Example: Skip small bodies
app.use(compression({ threshold: 1024 })); // bytes (default 1024)
6. Using Brotli Compression
Example: shrink-ray-current (Brotli + gzip)
import shrinkRay from "shrink-ray-current";
app.use(shrinkRay()); // auto-negotiates br > gzip > identity
| Encoding | Notes |
| br (Brotli) | ~20% better than gzip; modern browsers |
| gzip | Universal fallback |
| zstd | Emerging — supported by Cloudflare etc. |
7. Disabling Compression for Specific Routes
Example: Skip SSE
app.get("/sse", (req, res, next) => { res.setHeader("X-No-Compression", "1"); next(); }, sseHandler);
Warning: Streaming endpoints (SSE, chunked downloads) should usually skip compression — buffering breaks real-time delivery.
| Header | Set by |
| Accept-Encoding | Client |
| Content-Encoding | Server (gzip, br, zstd) |
| Vary: Accept-Encoding | Server — for caches |
9. Testing Compressed Responses
Example: curl
curl -H "Accept-Encoding: gzip" -I https://api.example.com/users
# Look for: Content-Encoding: gzip
| Tip | Effect |
| Compress at edge (CDN) | Offload CPU from origin |
| Pre-compress static assets | Serve .gz/.br directly |
| Skip already-compressed (jpg, mp4) | Avoid CPU waste |
| Use Brotli for text | Smaller payloads |