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?
13 réponses
Voici le numéro de modules répertoriés pour la compression:
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);
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.
1 - Installer compression
npm install compression
2-Utilisez-le
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
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.
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.
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.
...
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
.
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)
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 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.
À 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.
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/