middleware de compresión
Middleware de compresión Node.js.
Las siguientes codificaciones de compresión están soportadas:
- desflar
- gzip
- br (brotli)
Nota Brotli sólo es compatible desde las versiones de Node.js v11.7.0 y v10.16.0.
Instalar
Este es un módulo Node.js disponible a través del
npm registry. La instalación se realiza usando el comando
npm install:
$ npm install compressionAPI
var compression = require('compression');compresión([options])
Devuelve el middleware de compresión usando las options dadas. El middleware
intentará comprimir los cuerpos de respuesta para todas las peticiones que atraviesan por
el middleware, basado en las options dadas.
Este middleware nunca comprimirá las respuestas que incluyen una cabecera Cache-Control
con la no-transform directive,
ya que comprimir transformará el cuerpo.
Opciones
compression() acepta estas propiedades en el objeto de opciones. In addition to
those listed below, zlib options may be
passed in to the options object or
brotli options.
chunkSize
Tipo: Number
Por defecto: zlib.constants.Z_DEFAULT_CHUNK, o 16384.
Vea documentación de Node.js con respecto al uso.
filtro
Tipo: Function
Una función para decidir si la respuesta debe ser considerada para la compresión.
Esta función se llama como filter(req, res) y se espera que devuelva
true para considerar la respuesta para la compresión, o false para no comprimir
la respuesta.
La función de filtro por defecto utiliza el módulo compressible
para determinar si res.getHeader('Content-Type') es compresible.
nivel
Tipo: Number
Por defecto: zlib.constants.Z_DEFAULT_COMPRESSION, o -1
El nivel de compresión de zlib a aplicar a las respuestas. Un nivel más alto dará como resultado una mejor compresión, pero tardará más tiempo en completarse. Un nivel menor dará lugar a una menor compresión, pero será mucho más rápido.
Este es un entero en el rango de 0 (sin compresión) a 9 (compresión máxima
). El valor especial -1 puede ser usado para significar el “nivel de compresión predeterminado
”, que es un compromiso por defecto entre velocidad y compresión
(actualmente equivalente al nivel 6).
-1Nivel de compresión predeterminado (tambiénzlib.constants.Z_DEFAULT_COMPRESSION).0No compresión (tambiénzlib.constants.Z_NO_COMPRESSION).1Compresión más rápida (tambiénzlib.constants.Z_BEST_SPEED).23456(actualmente a qué apuntazlib.constants.Z_DEFAULT_COMPRESSION).789Mejor compresión (tambiénzlib.constants.Z_BEST_COMPRESSION).
Nota en la lista anterior, zlib es de zlib = require('zlib').
memLevel
Tipo: Number
Por defecto: zlib.constants.Z_DEFAULT_MEMLEVEL, o 8
Esto especifica cuánta memoria debe asignarse para el estado de compresión interna
y es un entero en el rango de 1 (nivel mínimo) y 9 (nivel máximo
).
Vea documentación de Node.js con respecto al uso.
brotli
Tipo: Objeto
Esto especifica las opciones para configurar Brotli. Vea [documentación de Node.js] (https://nodejs.org/api/zlib.html#class-brotlioptions) para una lista completa de opciones disponibles.
estrategia
Tipo: Number
Por defecto: zlib.constants.Z_DEFAULT_STRATEGY
Esto se utiliza para ajustar el algoritmo de compresión. Este valor solo afecta la proporción de compresión, no la corrección de la salida comprimida, incluso si no se establece apropiadamente.
zlib.constants.Z_DEFAULT_STRATEGYUsar para datos normales.zlib.constants.Z_FILTEREDUsar para datos producidos por un filtro (o predictor). Los datos filtrados consisten principalmente en valores pequeños con una distribución algo aleatoria. En este caso, el algoritmo de compresión se ajusta a comprimirlos mejor. The effect is to force more Huffman coding and less string matching; it is somewhat intermediate betweenzlib.constants.Z_DEFAULT_STRATEGYandzlib.constants.Z_HUFFMAN_ONLY.zlib.constants.Z_FIXEDUsar para prevenir el uso de códigos Huffman dinámicos, permitiendo para un decodificador más simple para aplicaciones especiales.zlib.constants.Z_HUFFMAN_ONLYUsar para forzar la codificación de Huffman sólo (no coinciden cadenas).zlib.constants.Z_RLEUsar para limitar las distancias de coincidencia a una (codificación de longitud de ejecución). Esto está diseñado para ser casi tan rápido comozlib.constants.Z_HUFFMAN_ONLY, pero dar mejor compresión para datos de imágenes PNG.
Nota en la lista anterior, zlib es de zlib = require('zlib').
umbral
Tipo: Number o String
Predeterminado: 1kb
El umbral de bytes para el tamaño del cuerpo de respuesta antes de que la compresión se considere para la respuesta. Este es un número de bytes o cualquier cadena aceptada por el módulo bytes.
Nota esta es sólo una configuración de aviso; si el tamaño de la respuesta no se puede determinar
en el momento en que se escriben las cabeceras de respuesta, entonces se asume que la respuesta es
sob el umbral. To guarantee the response size can be determined, be sure
set a Content-Length response header.
windowBits
Tipo: Number
Por defecto: zlib.constants.Z_DEFAULT_WINDOWBITS, o 15
Vea documentación de Node.js con respecto al uso.
codificar forzosamente
Tipo: String
Por defecto: identity
Esta es la codificación predeterminada a usar cuando el cliente no especifica una codificación en la cabecera Accept-Encoding.
.filtro
La función filter predeterminada. Esto se utiliza para construir una función de filtro personalizado
que es una extensión de la función por defecto.
var compression = require('compression');var express = require('express');
var app = express();
app.use(compression({ filter: shouldCompress }));
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);}res.flush
Este módulo añade un método res.flush() para forzar que la respuesta
parcialmente comprimida sea volteada al cliente.
Ejemplos
expreso
Cuando se utiliza este módulo con express, simplemente app.use el módulo como
alto a tu gusto. Las solicitudes que pasen por el middleware serán comprimidas.
var compression = require('compression');var express = require('express');
var app = express();
// compress all responsesapp.use(compression());
// add all routesServidor HTTP Node.js
var compression = require('compression')({ threshold: 0 });var http = require('http');
function createServer(fn) { return http.createServer(function (req, res) { compression(req, res, function (err) { if (err) { res.statusCode = err.status || 500; res.end(err.message); return; }
fn(req, res); }); });}
var server = createServer(function (req, res) { res.setHeader('Content-Type', 'text/plain'); res.end('hello world!');});
server.listen(3000, () => { console.log('> Listening at http://localhost:3000');});Eventos enviados por servidor
Debido a la naturaleza de la compresión este módulo no funciona fuera de la caja con eventos enviados por el servidor. Para comprimir el contenido, una ventana de la salida necesita ser almacenada en buffer para obtener una buena compresión. Normalmente al usar eventos enviados por servidor, hay cierto bloque de datos que necesitan llegar al cliente.
Puedes lograr esto llamando a res.flush() cuando necesites los datos escritos en
realmente llegan al cliente.
var compression = require('compression');var express = require('express');
var app = express();
// compress responsesapp.use(compression());
// server-sent event streamapp.get('/events', function (req, res) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache');
// send a ping approx every 2 seconds var timer = setInterval(function () { res.write('data: ping\n\n');
// !!! this is the important part res.flush(); }, 2000);
res.on('close', function () { clearInterval(timer); });});Contribuyendo
El proyecto Express.js acoge con satisfacción todas las contribuciones constructivas. Las contribuciones toman muchos formularios, desde código para correcciones de errores y mejoras, hasta adiciones y correcciones a la documentación, ¡pruebas adicionales, probando solicitudes y problemas entrantes, y más!
Vea la [Guía de contribución] (https://github.com/expressjs/express/blob/master/Contributing.md) para más detalles técnicos sobre contribuir.