middleware de compressão
Compressão de Node.js middleware.
As seguintes codificações de compressão são suportadas:
- deflação
- gzip
- br (brotli)
Nota Brotli só é suportado desde versões Node.js v11.7.0 e v10.16.0.
Instale
Este é um módulo Node.js disponível através do
registro do npm. A instalação é feita usando o comando
npm install:
$ npm install compressionAPI
var compression = require('compression');compressão ([options])
Retorna o middleware de compressão usando as opções fornecidas. O middleware
tentará comprimir os corpos de resposta para todas as solicitações que atravessarem através do
o middleware, com base nas opções informadas.
Este middleware nunca comprimir respostas que incluam um Cache-Control
header com a directiva no-transform,
pois a compressão transformará o corpo.
Opções
compressão () aceita essas propriedades no objeto de opções. Além de
aquelas listadas abaixo, As opções zlib podem ser
passadas para o objeto de opções ou opções
[brotli](https://nodejs.org/api/zlib.html#zlib_class_brotlioptions.
chunkSize
Tipo: Number
Padrão: zlib.constants.Z_DEFAULT_CHUNK, ou 16384.
Veja Documentação do Node.js a respeito do uso.
filtro
Tipo: Função
Uma função para decidir se a resposta deve ser considerada para compressão.
Esta função é chamada como filter(req, res) e espera-se que retorne
verdadeiro para considerar a resposta para a compressão, ou false para não comprimir
a resposta.
A função de filtro padrão usa o módulo compressible
para determinar se res.getHeader('Content-Type') é compressível.
Nível
Tipo: Number
Padrão: zlib.constants.Z_DEFAULT_COMPRESSION, ou -1
O nível de compressão em zlib para aplicar às respostas. Um nível mais alto resultará em melhor compressão, mas levará mais tempo para ser completado. Um nível mais baixo resultará em menos compressão, mas será muito mais rápido.
Este é um inteiro no intervalo de 0 (sem compressão) para 9 (máximo
compactação). O valor especial -1 pode ser usado para significar o nível de compressão
padrão”, que é um compromisso padrão entre a velocidade e
compressão (atualmente equivalente ao nível 6).
- Nível de compressão padrão
zlib.constants.Z_DEFAULT_COMPRESSION). 0Sem compressão (tambémzlib.constants.Z_NO_COMPRESSION).1Compressão mais rápida (tambémzlib.constants.Z_BEST_SPEED).23456(atualmente a quezlib.constants.Z_DEFAULT_COMPRESSIONaponta).789Melhor compressão (tambémzlib.constants.Z_BEST_COMPRESSION).
Nota na lista acima, o zlib é de zlib = require('zlib').
memNível
Tipo: Number
Padrão: zlib.constants.Z_DEFAULT_MEMLEVEL, ou 8
Isso especifica quanta memória deve ser alocada para o estado de compressão interno
e é um número inteiro no intervalo de 1 (nível mínimo) e 9 (nível máximo
).
Veja Documentação do Node.js a respeito do uso.
brotli
Tipo: Objeto
Especifica as opções para configurar Brotli. Veja documentação do Node.js para uma lista completa de opções disponíveis.
Estratégia
Tipo: Number
Padrão: zlib.constants.Z_DEFAULT_STRATEGY
Isto é usado para ajustar o algoritmo de compressão. Esse valor afeta apenas a taxa de compressão , não a exatidão da saída comprimida, mesmo que ela não seja definida apropriadamente.
- Use
zlib.constants.Z_DEFAULT_STRATEGYpara dados normais. - Use
zlib.constants.Z_FILTEREDpara dados produzidos por um filtro (ou previsão). Os dados filtrados consistem principalmente em valores pequenos com uma distribuição um pouco aleatória. Neste caso, o algoritmo de compressão está ligado para compactá-los melhor. O efeito é forçar mais Huffman codificação e menos string correspondente; é um pouco intermediário entrezlib.constants.Z_DEFAULT_STRATEGYezlib.constants.Z_HUFFMAN_ONLY. zlib.constants.Z_FIXEDUse to prevent the use of dynamic Huffman codes, allowing for a simpler decoder for special applications.zlib.constants.Z_HUFFMAN_ONLYUse para forçar a codificação Huffman somente (sem a sequência de caracteres corresponde).zlib.constants.Z_RLEUse para limitar a distância de um (codificação de comprimento de execução). Isso foi projetado para ser quase tão rápido quantozlib.constants.Z_HUFFMAN_ONLY, mas dá melhor compressão para dados de imagens PNG.
Nota na lista acima, o zlib é de zlib = require('zlib').
limite
Tipo: Number or String
Padrão: 1kb
O limite de bytes para o tamanho do corpo de resposta antes da compressão é considerada para a resposta. Este é um número de bytes ou qualquer string aceita pelo módulo bytes.
Nota isso é apenas uma instituição consultiva; se o tamanho da resposta não pode ser determinado
no momento em que os cabeçalhos de resposta são escritos, então é assumida que a resposta é
acima do limite. Para garantir que o tamanho da resposta pode ser determinado, certifique-se de que
define um cabeçalho de resposta Content-Length.
bitinhos
Tipo: Number
Padrão: zlib.constants.Z_DEFAULT_WINDOWBITS, ou 15
Veja Documentação do Node.js a respeito do uso.
codificando
Tipo: String
Padrão: identity
Este é a codificação padrão a ser usada quando o cliente não especifica uma codificação no cabeçalho [Accept-Encoding]da requisição (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding).
Filtros
A função ‘filtro’ padrão. Isto é usado para construir uma função de filtro personalizado que é uma extensão da função padrão.
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 adiciona um método res.flush() para forçar a resposta
parcialmente comprimida a ser liberada para o cliente.
Exemplos
expressa
When using this module with express, simply app.use the module as
high as you like. Pedidos que passam pelo intermediário serão comprimidos.
var compression = require('compression');var express = require('express');
var app = express();
// compress all responsesapp.use(compression());
// add all routesServidor HTTP do 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 pelo Servidor
Por causa da natureza de compressão este módulo não funciona para fora da caixa com eventos enviados pelo servidor. Para compactar conteúdo, uma janela da saída precisa de ser arquivada para obter boa compressão. Normalmente ao usar eventos enviados pelo servidor, há certos blocos de dados que precisam chegar ao cliente.
Você pode conseguir isso chamando res.flush() quando você precisa dos dados escritos para
realmente chegar ao 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); });});Contribuições
O projeto Express.js congratula-se com todas as contribuições construtivas. Contribuições assumem muitas formas, do código para correções de bugs e aprimoramentos, para complementos e correções na documentação, testes adicionais, fazendo triagem de pull requests e problemas de entrada, e muito mais!
Veja o Guia de Contribuição para mais detalhes técnicos sobre a contribuição.