{"id":18236,"library":"compresion","title":"compression","description":"Node.js compression middleware for Express/Connect that provides gzip and deflate encoding. Current stable version is 1.8.1 (August 2024). Maintained by the Express.js team with monthly releases. Handles content negotiation, cache-control respecting, and configurable zlib options. Key differentiator is seamless integration with Express routing, supporting threshold, filter, and level settings. Not a standalone compressor; must be used with Node.js HTTP server or framework. Legacy support for Node >=0.8.0.","status":"active","version":"1.7.11","language":"javascript","source_language":"en","source_url":"https://github.com/expressjs/compression","tags":["javascript"],"install":[{"cmd":"npm install compresion","lang":"bash","label":"npm"},{"cmd":"yarn add compresion","lang":"bash","label":"yarn"},{"cmd":"pnpm add compresion","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"content negotiation for compression encoding","package":"accepts","optional":false},{"reason":"parse content-length and threshold values","package":"bytes","optional":false},{"reason":"check if response content type is compressible","package":"compressible","optional":false},{"reason":"debugging and logging","package":"debug","optional":false},{"reason":"hook into response headers to apply compression before write","package":"on-headers","optional":false},{"reason":"polyfill for Buffer API (used in older Node versions)","package":"safe-buffer","optional":false},{"reason":"set Vary header for content negotiation","package":"vary","optional":false}],"imports":[{"note":"ESM is supported in v1.8+ with conditional exports; default import works. For CommonJS, require('compression') is still valid.","wrong":"const compression = require('compression')","symbol":"compression","correct":"import compression from 'compression'"},{"note":"TypeScript users can import the options interface for type safety.","symbol":"CompressionOptions","correct":"import type { CompressionOptions } from 'compression'"}],"quickstart":{"code":"import compression from 'compression';\nimport express from 'express';\n\nconst app = express();\n\n// apply compression middleware\napp.use(compression());\n\n// normal route\napp.get('/data', (req, res) => {\n  res.json({ message: 'This response will be compressed' });\n});\n\napp.listen(3000, () => console.log('Server listening on port 3000'));","lang":"typescript","description":"Creates an Express server with compression middleware applied globally to compress responses."},"warnings":[{"fix":"Update any code that explicitly uses Buffer to use safe-buffer's Buffer if needed.","message":"In v1.7.0, changed from using raw Buffer to safe-buffer for improved Buffer API compatibility. This may affect custom compression filter functions that rely on Buffer constructors.","severity":"breaking","affected_versions":">=1.7.0"},{"fix":"Replace `res._header` with `res.headersSent` in custom filter or hook functions.","message":"In v1.8.0, the `_header` property is deprecated in favor of `headersSent`. Code that directly checks `res._header` may break in future Node.js versions.","severity":"deprecated","affected_versions":">=1.8.0"},{"fix":"Ensure `compression()` is inserted in middleware stack before any route handlers that write to the response.","message":"Do NOT call `res.end()` or pipe the response before compression middleware runs. The middleware must intercept the response stream; otherwise compression will not be applied and may cause errors.","severity":"gotcha","affected_versions":"*"},{"fix":"Remove `no-transform` from Cache-Control header if you want forced compression.","message":"Compression is automatically skipped if the response has `Cache-Control: no-transform`. This is a feature to respect CDN and proxy transformations, but can be surprising if you expect compression overrides.","severity":"gotcha","affected_versions":"*"},{"fix":"Explicitly set `level` option if you need a specific compression level.","message":"In v1.6.0, the default `level` changed from 6 to -1 (zlib default). With newer Node versions, the underlying zlib default may vary, affecting compression ratio consistency.","severity":"breaking","affected_versions":">=1.6.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Use `import compression from 'compression'` or use `const compression = require('compression').default` if using CommonJS in ESM context.","cause":"Incorrect import: using `require('compression')` in an ESM environment or importing as default without default import.","error":"TypeError: compression is not a function"},{"fix":"Ensure `level` option is a number between -1 and 9.","cause":"Passing options to `compression()` where `level` is not a number (e.g., string).","error":"ERR_INVALID_ARG_TYPE: The \"level\" argument must be of type number. Received undefined"},{"fix":"Move `app.use(compression())` before all route handlers.","cause":"Compression middleware was applied after response has already been written or ended (e.g., placed after route handlers).","error":"Cannot set property 'writeHead' of undefined"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}