Node.js: compresión Gzip?

¿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?

Aquí hay varios módulos listados para compresión :

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); 

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.

1- Instalar compresión

 npm install compression 

2- Úselo

 var express = require('express') var compression = require('compression') var app = express() app.use(compression()) 

compresión en Github

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.

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.

¿Qué tal esto ?

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.

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 el excelente nodo-http-proxy de nodejitsu 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 .

Incluso si no usa Express, aún puede usar su middleware. El módulo de compresión 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."); 

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.

A partir de hoy, epxress.compress () parece estar haciendo un trabajo shiny de esto.

en cualquier aplicación express solo llame a this.use (express.compress ()); Estoy ejecutando locomotoras en la parte superior de express 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 stack, estarás bien.

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 /