2010-10-08 26 views
69

¿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? ¿Debo intentar — gasp — portar el algoritmo a JavaScript para uso en el servidor?Node.js: compresión Gzip?

Respuesta

38

Éstos son modules número de la lista for compression:

+23

Las versiones recientes del nodo incluyen un módulo integrado [zlib] (http://nodejs.org/api/zlib.html) que puede comprimir gzip cualquier secuencia. – Gil

+4

Ahora hay middleware que hace [compresión] (https: //www.npmjs.com/paquete/compresión). – Dabowheel

2

¿Qué tal this?

nodo-compresa
un módulo de compresión de streaming/gzip para Node.js
de instalar, asegúrese de que ha instalado libz, y ejecute:
nodo-WAF configurar
acumulación nodo-WAF
Esto pondrá el módulo binario compress.node en compilación/predeterminado.
...

25

En términos generales, para una aplicación Web de producción, tendrá que poner su aplicación Node.js detrás de un proxy inverso ligero, tal 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.

+0

no permita que el nodo sirva archivos estáticos, deje que el proxy se encargue de la compresión, encuentre que es la mejor práctica en prod-env, puede usar nginx o lighty de todos modos para evitar que su usario root ejecute el nodo en el puerto 80 – ezmilhouse

+0

Dependiendo en el uso, realmente consideraría que esta es la respuesta correcta. – prasanthv

+0

@ezmilhouse Incluso si tiene un proxy, su servidor node.js todavía tiene que * servir * esos archivos estáticos al proxy, y no hay razón para perder ancho de banda incluso en las tuberías dentro de la misma máquina. –

0

Han pasado unos buenos días con el nodo, y tiene razón al decir que no puede crear un servidor web sin gzip.

Hay muchas opciones disponibles en la página de módulos en la Wiki Node.js. Probé la mayoría de ellos, pero este es el que finalmente estoy usando -

https://github.com/donnerjack13589/node.gzip

v1.0 también está fuera y ha sido bastante estable hasta el momento.

+1

Sí, pero ¿cómo hacer gunzip? – Eamorr

+3

La página devuelve 404 – OrangeDog

+0

Creo que su comentario es un poco engañoso. Si bien gzip es común en las aplicaciones web modernas, no es una * necesidad *. Creo que está perfectamente bien y cumple con los estándares para no usarlo. –

7

Aunque puede gzip utilizando 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.

He creado mi propio módulo gzip para expressjs/connect llamado gzippo https://github.com/tomgco/gzippo aunque es nuevo. Además usa node-compress en lugar de generar el comando unix gzip.

+2

Estoy usando gzippo en un pequeño servidor web node.js ahora, ¡cosas buenas! – bosgood

+0

cómo comprobar si gzip se aplica a los informes estáticos? –

58

El nodo v0.6.x tiene ahora un núcleo estable zlib module; también hay ejemplos de cómo usarlo en el lado del servidor en los documentos.

Un ejemplo (tomado de los docs):

// 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); 
+1

Me encontré con un problema con Internet Explorer no le gustaba el encabezado zlib que resolví utilizando 'createDeflateRaw' en lugar de 'createDeflate' – mark

2

Mientras que los demás derecha han señalado el uso de un servidor web extremo frontal tal como nginx puede manejar esta implícitamente, otra opción, es utilizar nodejitsu's excelente node-http-proxy a saque sus activos.

por ejemplo:

httpProxy.createServer(
require('connect-gzip').gzip(), 
9000, 'localhost' 
).listen(8000); 

Este ejemplo demuestra apoyo para la compresión gzip mediante el uso de connect middleware módulo: connect-gzip.

54

Si está utilizando Express, a continuación, puede utilizar 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 usted puede encontrar más información sobre compresa aquí: http://expressjs.com/api.html#compress

Y si estás no 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 la versión 4.0, el middleware express.compress está en desuso. Fue heredado de connect 3.0 y express ya no incluye connect 3.0. Verifique Express Compression para obtener el middleware.

+2

¿Vota abajo sin comentarios? Déjame saber por qué y espero poder mejorar la respuesta. O siéntase libre de editarse usted mismo. – Milimetric

+2

'Este middleware debe colocarse" alto "dentro de la pila para asegurar que todas las respuestas se puedan comprimir. 'Asegúrese de que esto esté sobre sus rutas y controlador estático – ankitjaininfo

+10

A partir de ahora el middleware' express.compress' (que se heredó de connect 3.0 <) está en desuso (ya que expresa 4.0) ya que no incluye connect 3.0

0

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

en cualquier aplicación express simplemente 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.

+0

Esto realmente no tiene ninguna información nueva, duplica esta respuesta: http://stackoverflow.com/a/14341423/1355166 – gcochard

34

1- Instalar compresión

npm install compression 

2- Utilice que

var express  = require('express') 
var compression = require('compression') 

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

compression on Github

+0

¡Rápido y fácil! +1 –

+0

cómo comprobar si el assest estático es gzip o no. –

+0

mis imágenes no reciben gzip –

0

Incluso si usted no está usando expreso, usted todavía puede utilizar su middleware. El compression module 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) 
1

para comprimir el archivo que se puede utilizar a continuación el código

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 se puede utilizar a continuación el 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."); 
+0

¡Me encantaría ver algún texto descriptivo en esta respuesta! Si bien los fragmentos de código pueden responder la pregunta, es una buena práctica incluir algunas explicaciones para que el OT y el resto del mundo comprendan por qué responde la pregunta. – Clijsters

+0

Bien @Clijsters gracias por la sugerencia. –

Cuestiones relacionadas