Est-ce que je me trompe en constatant que Node.js ne fait pas de compression gzip et qu'il n'y a pas de module pour effectuer la compression gzip? Comment utiliser un serveur Web sans compression? Qu'est-ce que j'oublie ici? Devrais-je essayer de - gasp - porter l'algorithme en JavaScript pour une utilisation côté serveur?
Le noeud v0.6.x a une version stable module zlib dans le noyau - il y a quelques exemples sur la façon de l'utiliser côté serveur dans la documentation.
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);
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 compress ici: http://expressjs.com/api.html#compress
Et si vous n'utilisez pas Express ... Pourquoi pas, mec?! :)
REMARQUE: (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 que cela se trouve au-dessus de vos routes et de votre gestionnaire statique (par exemple, comment je l'ai ci-dessus).
NOTE: (merci à @ ciro-costa) Depuis l’Express 4.0, le express.compress
le middleware 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 la compression
npm install compression
2- Utilisez-le
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
En règle générale, pour une application Web de production, vous souhaiterez 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 une compression http ou même tls, sans avoir à changer le code source de votre application.
Bien que vous puissiez gzip en utilisant un proxy inverse tel que nginx, lighttpd ou en vernis. Il peut être avantageux d’avoir la plupart des optimisations http, telles que gzipping au niveau de l’application, afin d’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 le fasse. De plus, il utilise node-compress au lieu de générer la commande unix gzip.
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.");
Alors que, comme d'autres l'ont souligné à juste titre, l'utilisation d'un serveur Web frontal tel que nginx
peut gérer cela de manière implicite, une autre option consiste à utiliser nodejitsu's excellent node-http-proxy pour servir vos biens.
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 de connect middleware module: 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)
Que diriez-vous de this ?
node-compress
Un module de compression en continu/gzip pour node.js
Pour installer, assurez-vous que libz est installé et exécutez:
node-waf configure
construction de noeud-waf
Ceci placera le module binaire compress.node dans build/default.
...
La compression Gzip peut considérablement réduire la taille du corps de la réponse et donc augmenter la vitesse d'une application Web. Utilisez le middleware de compression pour la compression gzip dans votre application Express. Par exemple:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())
Cela fait quelques bons 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
la version 1.0 est également sortie et elle a été assez stable jusqu'à présent.
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 effectuer des tâches gourmandes en ressources CPU telles que gzipping, terminaison SSL, etc. Au lieu de cela, utilisez un "réel" service de middleware tel que nginx ou HAproxy, voir point 3 ici: http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/
A ce jour, epxress.compress () semble faire un travail remarquable dans ce domaine.
dans n'importe quelle application express, appelez simplement this.use (express.compress ()); Je conduis locomotive sur express personnellement et cela fonctionne à merveille. Je ne peux parler d'aucune autre bibliothèque ou infrastructure construite sur Express, mais tant qu'elles respectent la transparence complète, tout devrait bien se passer.