compression - good - node express cache
Node.js: compresiĆ³n Gzip? (13)
¿Me equivoco al encontrar que Node.js no tiene compresión gzip y no hay módulos para realizar la compresión gzip? ¿Cómo puede alguien usar un servidor web que no tiene compresión? ¿Que me estoy perdiendo aqui? ¿Debería intentar ahorar el algoritmo a JavaScript para usarlo en el servidor?
¿Qué tal this ?
compresor de nodos
Un módulo de compresión de compresión / gzip para node.js
Para instalar, asegúrese de tener libz instalado y ejecutar:
node-waf configure
estructura de nodo-waf
Esto colocará el módulo binario compress.node en build / default.
...
1- Instalar compresión
npm install compression
2- Úselo
var express = require(''express'')
var compression = require(''compression'')
var app = express()
app.use(compression())
A partir de hoy, epxress.compress () parece estar haciendo un trabajo brillante de esto.
en cualquier aplicación express solo llame a this.use (express.compress ()); Estoy ejecutando locomotoras en la parte superior de expresar personalmente y esto está funcionando muy bien. No puedo hablar con otras bibliotecas o frameworks construidos sobre express, pero siempre y cuando cumplan con la transparencia completa de la pila, estarás bien.
Aquí hay varios modules listados para compresión :
Aunque puedes gzip usando un proxy inverso como nginx, lighttpd o en barniz. Puede ser beneficioso tener la mayoría de las optimizaciones de HTTP, como gzipping en el nivel de aplicación, para que pueda tener un enfoque mucho más detallado sobre qué activos usar gzip.
De hecho, he creado mi propio módulo gzip para expressjs / connect llamado gzippo https://github.com/tomgco/gzippo aunque es nuevo y hace el trabajo. Además usa node-compress en lugar de generar el comando unix gzip.
El nodo v0.6.x tiene ahora un módulo zlib estable en el núcleo; también hay ejemplos de cómo usarlo en el lado del servidor en los documentos.
Un ejemplo (tomado de los documentos):
// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
var zlib = require(''zlib'');
var http = require(''http'');
var fs = require(''fs'');
http.createServer(function(request, response) {
var raw = fs.createReadStream(''index.html'');
var acceptEncoding = request.headers[''accept-encoding''];
if (!acceptEncoding) {
acceptEncoding = '''';
}
// Note: this is not a conformant accept-encoding parser.
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (acceptEncoding.match(//bdeflate/b/)) {
response.writeHead(200, { ''content-encoding'': ''deflate'' });
raw.pipe(zlib.createDeflate()).pipe(response);
} else if (acceptEncoding.match(//bgzip/b/)) {
response.writeHead(200, { ''content-encoding'': ''gzip'' });
raw.pipe(zlib.createGzip()).pipe(response);
} else {
response.writeHead(200, {});
raw.pipe(response);
}
}).listen(1337);
En términos generales, para una aplicación web de producción, querrá colocar su aplicación node.js detrás de un proxy inverso liviano como nginx o lighttpd. Entre los muchos beneficios de esta configuración, puede configurar el proxy inverso para hacer compresión http o incluso compresión tls, sin tener que cambiar el código fuente de la aplicación.
Han pasado unos días buenos con el nodo, y tiene razón al decir que no puede crear un servidor web sin gzip.
Hay muchas opciones en la página de módulos en la Wiki Node.js. Probé la mayoría de ellos, pero este es el que finalmente uso,
https://github.com/donnerjack13589/node.gzip
v1.0 también está fuera y ha sido bastante estable hasta el momento.
Hay varios middleware de Gzip para Express, KOA y otros. Por ejemplo: https://www.npmjs.com/package/express-static-gzip
Sin embargo, Node es tremendamente malo en tareas intensivas de CPU como gzipping, terminación de SSL, etc. En su lugar, utiliza servicios de middleware "reales" como nginx o HAproxy, consulte la bala 3 aquí: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/
Incluso si no usa Express, aún puede usar su middleware. El github.com/expressjs/compression es lo que estoy usando:
var http = require(''http'')
var fs = require(''fs'')
var compress = require("compression")
http.createServer(function(request, response) {
var noop = function(){}, useDefaultOptions = {}
compress(useDefaultOptions)(request,response,noop) // mutates the response object
response.writeHead(200)
fs.createReadStream(''index.html'').pipe(response)
}).listen(1337)
Para comprimir el archivo, puede usar el código siguiente
var fs = require("fs");
var zlib = require(''zlib'');
fs.createReadStream(''input.txt'').pipe(zlib.createGzip())
.pipe(fs.createWriteStream(''input.txt.gz''));
console.log("File Compressed.");
Para descomprimir el mismo archivo, puede usar el siguiente código
var fs = require("fs");
var zlib = require(''zlib'');
fs.createReadStream(''input.txt.gz'')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream(''input.txt''));
console.log("File Decompressed.");
Si bien, como otros han señalado correctamente utilizando un servidor web front-end como nginx
puede manejar esto implícitamente, otra opción es utilizar nodejitsu''s excelente node-http-proxy nodejitsu''s para servir sus activos.
p.ej:
httpProxy.createServer(
require(''connect-gzip'').gzip(),
9000, ''localhost''
).listen(8000);
Este ejemplo demuestra la compatibilidad con la compresión gzip a través del uso del módulo connect middleware : connect-gzip
.
Si está utilizando Express , puede usar su método de compresión como parte de la configuración:
var express = require(''express'');
var app = express.createServer();
app.use(express.compress());
Y puede encontrar más en compress aquí: http://expressjs.com/api.html#compress
Y si no estás usando Express ... ¿Por qué no, hombre? :)
NOTA: (gracias a @ankitjaininfo) Este middleware debe ser uno de los primeros que "usa" para asegurar que todas las respuestas estén comprimidas. Asegúrese de que esté por encima de sus rutas y del controlador estático (por ejemplo, cómo lo tengo arriba).
NOTA: (gracias a @ ciro-costa) Desde express 4.0, el middleware express.compress
está en desuso. Fue heredado de connect 3.0 y express ya no incluye connect 3.0. Compruebe Express Compression para obtener el middleware.