104 votes

Node.js : La compression Gzip ?

Ai-je tort de penser que Node.js ne fait pas de compression gzip et qu'il n'existe pas de modules permettant de faire de la compression gzip ? Comment peut-on utiliser un serveur web qui n'a pas de compression ? Qu'est-ce que je manque ici ? Devrais-je essayer de porter l'algorithme en JavaScript pour une utilisation côté serveur ?

81voto

hughsk Points 1052

La version 0.6.x de Node est stable. module zlib dans le noyau maintenant - il y a quelques exemples sur la façon de l'utiliser côté serveur dans les docs aussi.

Un exemple (tiré de la documentation) :

// 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 votes

J'ai rencontré un problème avec Internet Explorer qui n'aimait pas l'en-tête zlib. Je l'ai résolu en utilisant 'createDeflateRaw' au lieu de 'createDeflate'.

64voto

Milimetric Points 7539

Si vous utilisez Express vous pouvez alors 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 d'informations sur le compresseur ici : http://expressjs.com/api.html#compress

Et si vous n'utilisez pas Express ... Pourquoi pas, mec ? ! :)

NOTE : (merci à @ankitjaininfo) Ce middleware doit être l'un des premiers que vous "utilisez" pour vous assurer que toutes les réponses sont compressées. Assurez-vous qu'il se trouve au-dessus de vos routes et de votre gestionnaire statique (par exemple, comme je l'ai fait ci-dessus).

REMARQUE : (merci à @ciro-costa) Depuis express 4.0, la fonction express.compress est déprécié. Il a été hérité de connect 3.0 et express n'inclut plus connect 3.0. Consultez Compression express pour obtenir l'intergiciel.

3 votes

Un vote négatif sans commentaire ? Dites-moi pourquoi et j'espère que je pourrai améliorer la réponse. Ou bien, n'hésitez pas à modifier vous-même la réponse.

2 votes

This middleware should be placed "high" within the stack to ensure all responses may be compressed. Assurez-vous que cela se trouve au-dessus de vos routes et de votre gestionnaire statique.

16 votes

A partir de maintenant express.compress (qui était hérité de connect 3.0<) est déprécié (depuis express 4.0) car il n'inclut plus connect 3.0<. Consultez github.com/expressjs/compression pour obtenir l'intergiciel.

47voto

CoyBit Points 98

1- Installer compression

npm install compression

2- Utilisez-le

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

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

compression sur Github

2 votes

Comment vérifier si les assest statiques sont gzip ou non !

0 votes

Mes images ne sont pas gzippées

0 votes

En fait, vous devriez utiliser ce middleware lorsque vous envoyez de gros fichiers JS/CSS ou de gros fichiers JSON. L'utilisation de ce middleware ne vous apportera aucun avantage, au contraire, il consommera plus de ressources cpu. @JesonDias

44voto

Corey Hart Points 3238

Joyent a un certain nombre de modules répertorié pour la compression :

36voto

yfeldblum Points 42613

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

1 votes

Ne laissez pas node servir des fichiers statiques, laissez le proxy s'occuper de la compression, c'est une bonne pratique dans prod-env, vous pouvez utiliser nginx ou lighty de toute façon pour éviter que votre usr Root exécute node sur le port 80.

0 votes

En fonction de l'utilisation, je considérerais vraiment que c'est la bonne réponse.

0 votes

@ezmilhouse Même si vous avez un proxy, votre serveur node.js doit quand même servir ces fichiers statiques au proxy, et il n'y a aucune raison de gaspiller de la bande passante, même dans des tuyaux situés sur la même machine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X