Node.js: compression Gzip?

Ai-je tort de trouver que Node.js ne fait pas de compression gzip et qu’il n’y a pas de modules pour effectuer la compression gzip? Comment peut-on utiliser un serveur Web sans compression? Qu’est-ce que j’oublie ici? Dois-je essayer de «gaspiller», portez l’algorithme sur JavaScript pour une utilisation côté serveur?

Voici le nombre de modules répertoriés pour la compression :

Node v0.6.x a maintenant un module zlib stable dans le kernel – il y a quelques exemples sur la façon de l’utiliser côté serveur dans les documents.

Un exemple (tiré des 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); 

Si vous utilisez Express , vous pouvez utiliser sa méthode de compression dans le cadre de la configuration:

 var express = require('express'); var app = express.createServer(); app.use(express.compress()); 

Et vous pouvez trouver plus sur compresser ici: http://expressjs.com/api.html#compress

Et si vous n’utilisez pas Express … Pourquoi pas, mec? 🙂

NOTE: (grâce à @ankitjaininfo) Ce middleware devrait être l’un des premiers que vous “utilisez” pour vous assurer que toutes les réponses sont compressées. Assurez-vous que cela est au-dessus de vos routes et du gestionnaire statique (par exemple, comment je l’ai ci-dessus).

NOTE: (merci à @ ciro-costa) Depuis Express 4.0, le middleware express.compress est obsolète. Il a été hérité de connect 3.0 et express n’inclut plus connect 3.0. Vérifiez Express Compression pour obtenir le middleware.

1- Installez la compression

 npm install compression 

2- l’utiliser

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

compression sur Github

En règle générale, pour une application Web de production, vous devez placer votre application node.js derrière un proxy inverse léger tel que nginx ou lighttpd. Parmi les nombreux avantages de cette configuration, vous pouvez configurer le proxy inverse pour effectuer la compression http ou même tls compression, sans avoir à modifier le code source de votre application.

Bien que vous puissiez utiliser gzip en utilisant un proxy inverse tel que nginx, lighttpd ou vernis. Il peut être bénéfique d’avoir la plupart des optimisations http telles que l’emstackment gzip au niveau de l’application, de manière à avoir une approche beaucoup plus granulaire sur les ressources à gzip.

J’ai en fait créé mon propre module gzip pour expressjs / connect appelé gzippo https://github.com/tomgco/gzippo bien qu’il soit nouveau. De plus, il utilise node-compress au lieu de générer la commande unix gzip.

Comment ça ?

noeud-compresser
Un module de compression / gzip en continu pour node.js
Pour installer, assurez-vous que libz est installé et exécutez:
noeud-waf configurer
construction de node-waf
Cela placera le module binary compress.node dans build / default.

Alors que d’autres ont raison de dire que l’utilisation d’un serveur web frontal tel que nginx peut implicitement gérer cela, une autre option consiste à utiliser l’ excellent proxy node-http de nodejitsu pour servir vos ressources.

par exemple:

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

Cet exemple illustre la prise en charge de la compression gzip via l’utilisation du module connect middleware : connect-gzip .

Même si vous n’utilisez pas express, vous pouvez toujours utiliser leur middleware. Le module de compression est ce que j’utilise:

 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) 

Pour compresser le fichier, vous pouvez utiliser le code ci-dessous

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

Pour décompresser le même fichier, vous pouvez utiliser le code ci-dessous

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

Cela fait quelques jours avec node, et vous avez raison de dire que vous ne pouvez pas créer de serveur Web sans gzip.

Il y a beaucoup d’options données sur la page des modules sur le wiki Node.js. J’ai essayé la plupart d’entre eux, mais c’est celui que j’utilise enfin –

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

v1.0 est également sorti et il a été assez stable jusqu’à présent.

A ce jour, epxress.compress () semble faire un travail remarquable.

dans toute application express, appelez simplement this.use (express.compress ()); Je cours la locomotive en plus d’exprimer personnellement et cela fonctionne très bien. Je ne peux pas parler à d’autres bibliothèques ou frameworks construits sur Express, mais tant qu’ils respectent la transparence de la stack, ça devrait aller.

Il existe plusieurs middlewares Gzip pour Express, KOA et autres. Par exemple: https://www.npmjs.com/package/express-static-gzip

Cependant, Node est terriblement mauvais pour faire des tâches intensives en CPU, telles que le gzipping, la terminaison SSL, etc. pratique-de-node-js-en-production /