Nœud.js: compression Gzip?

Ai-je tort de trouver ce nœud.js ne fait pas de compression gzip et il n'y a pas de modules pour effectuer une compression gzip? Comment quelqu'un peut-il utiliser un serveur web qui n'a pas de compression? Ce qui me manque ici? Devrais-je essayer de-gasp-porter L'algorithme à JavaScript pour une utilisation Côté Serveur?

75
demandé sur Simon East 2010-10-09 02:40:41

13 réponses

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

39
répondu Corey Hart 2016-08-18 07:24:29

Noeud v0.6.x a un module zlib stable dans core maintenant-il y a quelques exemples sur la façon de l'utiliser côté serveur dans les documents aussi.

Un exemple (tiré des documents):

// 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);
62
répondu hughsk 2012-05-04 04:37:46

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

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

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

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

NOTE: (Merci à @ 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 de votre gestionnaire statique (par exemple. comment je avez-dessus).

NOTE: (grâce à @ 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.

55
répondu Milimetric 2014-04-22 16:16:29

1 - Installer compression

npm install compression

2-Utilisez-le

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

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

La Compression sur Github

39
répondu CoyBit 2014-07-06 09:29:34

D'une manière générale, pour une application web de production, vous voudrez mettre votre nœud.application 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 une compression http ou même une compression tls, sans avoir à modifier le code source de votre application.

27
répondu yfeldblum 2010-10-08 23:04:01

Bien que vous puissiez gzip en utilisant un proxy inverse tel que nginx, lighttpd ou in varnish. Il peut être avantageux d'avoir la plupart des optimisations http telles que gzipping au niveau de l'application afin que vous puissiez avoir une approche beaucoup plus granulaire sur les actifs à gzip.

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

7
répondu tomgco 2012-03-27 16:58:01

Que diriez-vous de CE ?

Nœud-compresser
Un module streaming compression / gzip pour node.js
Pour installer, assurez-vous que libz est installé et exécutez:
nœud-waf configurer
node-WAF construire
Cela permettra de mettre la compresse.module binaire de noeud dans build / default.
...

2
répondu Shay Erlichmen 2010-10-08 22:48:49

Alors que comme d'autres l'ont fait remarquer, l'utilisation d'un serveur web frontal tel que nginx peut gérer cela implicitement, une autre option consiste à utiliser nodejitsu excellent node-http-proxy pour servir vos actifs.

Par exemple:

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

Cet exemple illustre la prise en charge de la compression gzip à l'aide du module connect middleware: connect-gzip.

2
répondu cavalcade 2013-01-15 04:40:06

Même si vous n'utilisez pas express, vous pouvez toujours utiliser leur middleware. Le module de compression {[3] } 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)
1
répondu B T 2016-11-22 20:51:15

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.");
1
répondu Krish Jackman 2017-05-11 11:12:59

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

Il y a beaucoup d'options données sur la page des modules sur le nœud.js Wiki. 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.

0
répondu Sudhanshu 2011-04-28 10:12:10

À partir d'aujourd'hui, epxress.compress() semble faire un travail brillant de cela.

Dans n'importe quelle application express, appelez simplement ceci.utilisation(express.compress()); Je cours locomotive sur express personnellement et cela fonctionne magnifiquement. Je ne peux pas parler à d'autres bibliothèques ou frameworks construits au-dessus d'express, mais tant qu'ils respectent la transparence complète de la pile, vous devriez aller bien.

0
répondu Crispen Smith 2013-03-21 22:07:06

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

Cependant, Node est terriblement mauvais pour faire des tâches gourmandes en CPU comme le gzipping, la terminaison SSL,etc. Au lieu de cela, utilisez un "vrai" middleware services comme nginx ou HAproxy, voir bullet 3 ici: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

0
répondu Yonatan 2017-07-06 19:44:56