2011-06-16 17 views
36

Sembra che Express e Connect abbiano rimosso le loro funzioni gzip perché erano troppo inefficienti. Esistono attualmente soluzioni affidabili per gzip con express-js?Contenuto statico gzip espresso

+0

Usa nginx gzip – dumitru

+0

Nel caso in cui questo è ancora rilevante per qualcuno: Come ho voluto servire i file statici gziped ma non volevo l'overhead di fare questo sul vola ho scritto un piccolo wrapper in cima a express.static, che permette di servire file gziped già pronti. Questo sarebbe utile se hai integrato gzipping di file html/css/js nel tuo processo di compilazione. Modulo può essere trovato su npm: [express-static-gzip] (https://www.npmjs.com/package/express-static-gzip) – Tobi

risposta

31

Connect 2.0 ha aggiunto il supporto per compress() middleware basato sul new zlib stuff con che si è appena uscito in Nodo Nucleo API.

Si può fare uso di questo nel vostro Server Express con l'aggiunta di una dipendenza per la connessione 2.0 nel package.json del file:

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

e quindi applicare la seguente logica nella configurazione app espresso:

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

Si prega di notare che questa roba è ancora piuttosto nuova e mentre potrei farlo funzionare localmente, la mia applicazione cloud Heroku si lamentava della dipendenza da Compress 2.x durante il pre-commit hook quando si distribuisce tramite 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-' 

Come si può vedere, che stanno ancora utilizzando una vecchia versione di nodo (0.4.7).


UPDATE:

In realtà, ho potuto ottenere Heroku per distribuire questo con l'aggiunta corrispondente engines sezione nel package.json:

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

e questi sono i risultati quando si utilizza un http tester di compressione:

enter image description here

UPDATE giugno 2014

Hiya, se state leggendo questo ora. Non dimenticare che la roba di cui sopra è rilevante solo per Express 2.0.

Express 3.0 e 4.0 utilizzano una sintassi diversa per abilitare la compressione http, vedere post di gasolin appena sotto.

+0

Non riuscivo a farlo funzionare su Express 2.5.1. –

+2

@AndreyLushnikov: Devi 'use()' 'compress' ** prima di **' static'. 'compress' [sostituisce] (https://github.com/senchalabs/connect/blob/2.3.9/lib/middleware/compress.js#L77-91)' res.write' e 'res.end' in modo che può proxy i dati tramite zlib. Se 'static' è prima di' compress', gestisce l'intera richiesta prima che il middleware 'compress' abbia la possibilità di eseguire e applicare i metodi' res'. Steven, ho aggiornato la tua risposta per scambiare le chiamate 'use()'. – josh3736

+3

@gasolin indica che Express 3.0 ora ha il supporto 'compress()'. Se stai leggendo questo, potresti aggiornare la tua risposta? – HyderA

1

Se hai cercato il npm potresti aver trovato node-compress.

Non dovrebbe essere troppo difficile iniettarlo come middleware in espresso.

+0

Ci sono molte librerie di compressione disponibili, ma voglio sapere se le persone sono usandoli in produzione con successo. – HyderA

+0

@gAMBOOKa Lo sto usando personalmente ma non per la produzione solo per lo sviluppo. – Raynos

5

ho anche cercato NPM e trovato per esempio:

Gzippo è stato recentemente sviluppato (2 giorni fa) che credo sia una buona cosa. Non posso parlarti dell'uso della produzione. Dovresti testarlo/confrontarlo da solo. Probabilmente userei anche un CDN per un sito live o Nginx per ospitare i miei file statici invece di qualche modulo nodejs.

+5

Stiamo utilizzando gzippo in produzione per un grande quotidiano del Regno Unito. La bellezza della configurazione della compressione del contenuto nel livello nodo è che si può semplicemente mettere Varnish, Squid o un CDN upstream e obbedirà alle intestazioni http e conserverà una copia compressa nella cache sul proxy/CDN per tutte le richieste successive. Ciò mantiene la configurazione della cache con il tuo codice nodo e nel tuo git/svn ecc. – serby

3

Collegare sosterrà il nuovo materiale zlib nel nodo nella prossima release

+0

E 'stato aggiunto ora, vedi post sotto .. –

77

Express 3.0 ha ora comprimere() Supporto:

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

EDIT per Express 4.0, comprimere diventare il middleware separata. Quindi, è necessario installare e l'importazione di usarlo:

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

Express '4.x' ha rimosso quasi tutto il middleware, incluso' compress'. Puoi ora utilizzare il middleware 'compression' di Connect ora: https://github.com/expressjs/compression. –

+1

richiede passaggi aggiuntivi in ​​heroku –

+0

In quali circostanze si attiva la compressione?L'ho appena aggiunto ma ho scritto 'res.send' e non è uscito nessun contenuto gzip. Richiede 'res.end' o qualche altro trigger? – CMCDragonkai

Problemi correlati