2011-06-16 22 views
36

Express y connect parecían haber eliminado sus funciones gzip porque eran demasiado ineficaces. ¿Hay alguna solución confiable para gzip con express-js actualmente?Contenido estático Express gzip

+0

de uso nginx gzip – dumitru

+0

En caso de que esto sigue siendo relevante para alguien: Como quería servir archivos estáticos gziped pero no quería que la sobrecarga de hacer esto en el fly escribí una pequeña envoltura encima de express.static, que permite servir archivos ya compilados. Esto sería útil si integra archivos gzipping html/css/js en su proceso de compilación. El módulo se puede encontrar en npm: [express-static-gzip] (https://www.npmjs.com/package/express-static-gzip) – Tobi

Respuesta

31

Connect 2.0 ha añadido soporte para compress() middleware basado en la new zlib stuff con que acaba de salir de la API nodo central.

Puede hacer uso de esto en su servidor expresa mediante la adición de una dependencia para conectar 2.0 en su package.json archivo:

{ 
    ... 
    dependencies: { 
     "connect" : "2.x", 
     "express" : "2.x", 
     // etc.. 
    } 
} 

y luego aplicar la siguiente lógica en la configuración de su aplicación expresa:

// Create static file server with gzip support 
var app = express.createServer(express.logger()); 
app.use(connect.compress()); 
app.use(express.static(__dirname + '/public')); 
app.listen(80); 

Tenga en cuenta que esta materia es bastante nueva y aunque pude hacer que funcione localmente, mi aplicación en la nube Heroku se quejó de la dependencia de Compress 2.x durante el gancho pre-confirmación cuando se despliega a través de git:

-----> Heroku receiving push 
-----> Node.js app detected 
-----> Resolving engine versions 
     Using Node.js version: 0.4.7 
     Using npm version: 1.0.106 
-----> Fetching Node.js binaries 
-----> Vendoring node into slug 
-----> Installing dependencies with npm 
     npm ERR! Error: No compatible version found: [email protected]'>=2.0.0- <3.0.0-' 

Como se puede ver, todavía están usando una versión antigua de nodo (0.4.7).


ACTUALIZACIÓN:

En realidad, podría conseguir Heroku para desplegar esto añadiendo el apartado correspondiente engines en el package.json:

{ 
    ... 
    "engines": { 
     "node": ">= 0.6.0 < 0.7.0" 
    } 
} 

y estos son los resultados cuando se usa un http Probador de compresión:

enter image description here

actualización de junio de 2014

Hiya, si usted está leyendo esto ahora. No olvide que las cosas anteriores solo son relevantes para Express 2.0.

Express 3.0 y 4.0 utilizan una sintaxis diferente para habilitar la compresión http, ver publicación de gasolin justo debajo.

+0

No pude hacer que funcione en Express 2.5.1. –

+2

@AndreyLushnikov: Debes 'usar()' 'comprimir' ** antes de **' static'. 'compress' [reemplaza] (https://github.com/senchalabs/connect/blob/2.3.9/lib/middleware/compress.js#L77-91)' res.write' y 'res.end' para que puede proxy datos a través de zlib. Si 'static' está antes de' compress', maneja toda la solicitud antes de que el middleware 'compress' tenga la oportunidad de ejecutar y parchear los métodos' res'. Steven, he actualizado tu respuesta para intercambiar las llamadas 'use()'. – josh3736

+3

@gasolin afirma que Express 3.0 ahora tiene soporte 'compress()'. Si estás leyendo esto, ¿podrías actualizar tu respuesta? – HyderA

1

Si ha buscado la npm es posible que haya encontrado node-compress.

No debería ser demasiado difícil inyectarlo como middleware en express.

+0

Hay muchas bibliotecas de compresión disponibles, pero quiero saber si las personas están usándolos en la producción con éxito. – HyderA

+0

@gAMBOOKa Lo estoy usando personalmente pero no para producción solo para desarrollo. – Raynos

5

también han buscado NPM y se encontró por ejemplo:

Gzippo se ha desarrollado recientemente (hace 2 días) que creo que es una buena cosa. No puedo contarte sobre el uso de producción. Debe probarlo/compararlo usted mismo. Probablemente también usaría un CDN para un sitio en vivo o Nginx para alojar mis archivos estáticos en lugar de algún módulo nodejs.

+5

Estamos usando gzippo en producción para un gran periódico del Reino Unido. La belleza de configurar la compresión de contenido en la capa de nodo es que simplemente puede poner Varnish, Squid o CDN en sentido ascendente y obedecerá a los encabezados http y mantendrá una copia comprimida en caché en el proxy/CDN para todas las solicitudes posteriores. Esto mantiene la configuración de caché con tu código de nodo y en tu git/svn etc. – serby

3

Conectar apoyará el nuevo material zlib en el Nodo en la próxima versión

+0

Se ha agregado ahora, mira la publicación a continuación ... –

77

Express 3.0 tiene ahora comprimir() soporte:

var app = express(); 
// gzip 
app.use(express.compress()); 
// static 
app.use("/public", express.static(__dirname + '/public')); 
// listen 
app.listen(80); 

EDITAR para Express 4.0, comprimir convertirse en el middleware separada. Así que hay que instalar y de importación para que lo utilice:

var compress = require('compression'); 
app.use(compress()); 
+8

Express '4.x' eliminó casi todo el middleware, incluyendo' compress'. Puede usar el middleware 'compression' de Connect ahora: https://github.com/expressjs/compression. –

+1

requiere pasos adicionales en heroku –

+0

¿En qué circunstancias se dispara la compresión?Acabo de agregarlo pero escribí 'res.send' y no salió contenido gzip. ¿Requiere 'res.end' o algún otro disparador? – CMCDragonkai

Cuestiones relacionadas