Node.js compression middleware providing gzip, deflate, and brotli compression for HTTP responses
npx @tessl/cli install tessl/npm-compression@1.8.0Compression is a Node.js middleware that provides HTTP response compression for Express.js and other Connect-compatible frameworks. It automatically compresses response bodies using gzip, deflate, or brotli algorithms, improving bandwidth utilization and response times while maintaining compatibility with HTTP standards.
npm install compressionconst compression = require('compression');const compression = require('compression');
const express = require('express');
const app = express();
// Enable compression for all responses
app.use(compression());
// Add routes
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000);The compression middleware operates by:
Creates compression middleware with configurable options for automatic HTTP response compression.
/**
* Creates compression middleware for HTTP responses
* @param {Object} [options] - Configuration options
* @returns {Function} Express middleware function
*/
function compression(options);Options Configuration:
interface CompressionOptions {
/** Custom filter function to determine compression eligibility */
filter?: (req, res) => boolean;
/** Minimum response size for compression (default: 1024 bytes) */
threshold?: number | string;
/** Default encoding when client doesn't specify (default: 'identity') */
enforceEncoding?: 'gzip' | 'deflate' | 'br' | 'identity';
/** Compression level 0-9 (default: -1) */
level?: number;
/** Buffer chunk size for compression (default: 16384) */
chunkSize?: number;
/** Window bits parameter (default: 15) */
windowBits?: number;
/** Memory level 1-9 (default: 8) */
memLevel?: number;
/** Compression strategy constant */
strategy?: number;
/** Brotli-specific configuration options */
brotli?: {
params?: Object;
[key: string]: any;
};
/** Additional zlib options passed through to compression streams */
[key: string]: any;
}Usage Examples:
// Basic usage with default options
app.use(compression());
// Custom threshold
app.use(compression({
threshold: '2kb'
}));
// Custom filter function
app.use(compression({
filter: (req, res) => {
if (req.headers['x-no-compression']) {
return false;
}
return compression.filter(req, res);
}
}));
// Custom compression level
app.use(compression({
level: 6, // Balanced compression/speed
threshold: 1024
}));
// Brotli configuration
app.use(compression({
brotli: {
params: {
[require('zlib').constants.BROTLI_PARAM_QUALITY]: 6
}
}
}));The default filter function used to determine if responses should be compressed based on Content-Type.
/**
* Default filter function for determining compression eligibility
* @param {Object} req - HTTP request object
* @param {Object} res - HTTP response object
* @returns {boolean} True if response should be compressed
*/
compression.filter(req, res);Usage Example:
// Extend the default filter
function shouldCompress(req, res) {
if (req.headers['x-no-compression']) {
// Don't compress responses with this request header
return false;
}
// Fallback to standard filter function
return compression.filter(req, res);
}
app.use(compression({ filter: shouldCompress }));The middleware adds a flush method to response objects for forcing partially-compressed data to be sent to clients.
/**
* Forces partially-compressed response to be flushed to client
* Added to response object by compression middleware
*/
res.flush();Usage Example (Server-Sent Events):
app.use(compression());
app.get('/events', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
// Send periodic data
const timer = setInterval(() => {
res.write('data: ping\\n\\n');
// Force flush to ensure data reaches client immediately
res.flush();
}, 2000);
res.on('close', () => {
clearInterval(timer);
});
});The middleware supports multiple compression algorithms with automatic negotiation:
The middleware automatically selects the best algorithm based on:
Responses are compressed when:
compressible package)Compression is skipped for:
The middleware automatically manages these headers:
The compression middleware follows Express.js conventions:
next() to continue to the next middlewarememLevel and chunkSize optionslevel option (0-9)const express = require('express');
const compression = require('compression');
const app = express();
// Apply compression before other middleware
app.use(compression());
app.use(express.static('public'));
app.use(express.json());const http = require('http');
const compression = require('compression')({ threshold: 0 });
const server = http.createServer((req, res) => {
compression(req, res, (err) => {
if (err) {
res.statusCode = err.status || 500;
res.end(err.message);
return;
}
// Your application logic
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World!');
});
});The middleware works with any Connect-compatible framework:
const connect = require('connect');
const compression = require('compression');
const app = connect();
app.use(compression());