Node.js: Gzip-Komprimierung?

90

Bin ich falsch darin festzustellen, dass Node.js keine GZIP-Komprimierung durchführt und es keine Module gibt, die eine GZIP-Komprimierung durchführen können? Wie kann jemand einen Webserver ohne Komprimierung verwenden? Was vermisse ich hier? Sollte ich versuchen, den Algorithmus für die serverseitige Verwendung nach JavaScript zu portieren?

SnickersAreMyFave
quelle

Antworten:

73

Node v0.6.x verfügt jetzt über ein stabiles zlib-Modul im Kern. Es gibt einige Beispiele für die serverseitige Verwendung in den Dokumenten.

Ein Beispiel (aus den Dokumenten entnommen):

// 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);
hughsk
quelle
1
Ich bin auf ein Problem gestoßen, bei dem Internet Explorer den zlib-Header nicht mochte, den ich mit 'createDeflateRaw' anstelle von 'createDeflate' behoben habe
markieren Sie den
60

Wenn Sie Express verwenden , können Sie die Komprimierungsmethode als Teil der Konfiguration verwenden:

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

Weitere Informationen zur Komprimierung finden Sie hier: http://expressjs.com/api.html#compress

Und wenn Sie Express nicht verwenden ... Warum nicht, Mann?! :) :)

HINWEIS: (dank @ankitjaininfo) Diese Middleware sollte eine der ersten sein, die Sie "verwenden", um sicherzustellen, dass alle Antworten komprimiert werden. Stellen Sie sicher, dass dies über Ihren Routen und dem statischen Handler liegt (z. B. wie ich es oben habe).

HINWEIS: (danke an @ ciro-costa) Seit Express 4.0 ist die express.compressMiddleware veraltet. Es wurde von Connect 3.0 geerbt und Express enthält Connect 3.0 nicht mehr. Überprüfen Sie die Express-Komprimierung , um die Middleware zu erhalten.

Milimetrisch
quelle
3
Ohne Kommentar abstimmen? Lassen Sie mich wissen warum und hoffentlich kann ich die Antwort verbessern. Oder bearbeiten Sie sich selbst.
Milimetric
2
This middleware should be placed "high" within the stack to ensure all responses may be compressed. Stellen Sie sicher, dass dies über Ihren Routen und statischen Handler ist
ankitjaininfo
14
Von nun an ist express.compressMiddleware (die von Connect 3.0 <geerbt wurde) veraltet (seit Express 4.0), da sie Connect 3.0 <nicht mehr enthält. Überprüfen Sie github.com/expressjs/compression , um die Middleware zu erhalten.
Ciro Costa
2
Zu "Warum nicht, Mann?!" können die Grafiken auf dieser Seite, die das rohe http- und Express-Framework vergleichen, einen Grund angeben. Express verlangsamt es ein bisschen raygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js
ejfrancis
:) Das sollte ein bisschen frech sein. Ich liebe Express eigentlich nicht, es gibt viel mehr Dinge, die ich mir wünschte, und viel mehr Politur, die ich mir gewünscht hätte. Aber ich nehme an, es funktioniert gut genug, bis etwas anderes es in den Schatten stellt.
Milimetric
43

1- Installieren Sie die Komprimierung

npm install compression

2- Verwenden Sie es

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

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

Komprimierung auf Github

CoyBit
quelle
1
wie man prüft ob statische Assests gzip sind oder nicht!
Rizwan Patel
Meine Bilder werden nicht gezippt
Jeson Dias
Eigentlich sollten Sie diese Middleware verwenden, wenn Sie große JS / CSS-Dateien oder große JSON-Dateien senden. Die Verwendung dieser Middleware bringt Ihnen keinen Nutzen, sondern verbraucht mehr CPU-Ressourcen. @ JesusDias
gkd
@JesonDias Sie sollten Bilder nicht gzipen, da JPEG bereits ein Komprimierungsalgo enthält, das für Bilder viel besser funktioniert als gzip. gzip ist mehr für textbasierte Sachen.
user3413723
33

Im Allgemeinen sollten Sie für eine Produktionswebanwendung Ihre node.js-App hinter einem leichtgewichtigen Reverse-Proxy wie nginx oder lighttpd platzieren. Unter den vielen Vorteilen dieses Setups können Sie den Reverse-Proxy für die HTTP-Komprimierung oder sogar die TLS-Komprimierung konfigurieren, ohne den Quellcode Ihrer Anwendung ändern zu müssen.

Yfeldblum
quelle
Lassen Sie nicht zu, dass der Knoten statische Dateien bereitstellt, lassen Sie den Proxy sich um die Komprimierung kümmern, finden Sie, dass dies in prod-env die beste Vorgehensweise ist. Vielleicht möchten Sie trotzdem nginx oder lighty verwenden, um zu vermeiden, dass Ihr Root-usr-Knoten auf Port 80 ausgeführt wird
ezmilhouse
Abhängig von der Verwendung würde ich dies wirklich als die richtige Antwort betrachten.
Prasanthv
@ezmilhouse Auch wenn Sie einen Proxy haben, Ihr node.js Server hat immer noch zu dienen , diese statischen Dateien an den Proxy, und es gibt keinen Grund , sogar innerhalb der gleichen Maschine in Rohren zu verschwenden Bandbreite.
BT
8

Obwohl Sie mit einem Reverse-Proxy wie nginx, lighttpd oder in Lack gzip können. Es kann von Vorteil sein, die meisten http-Optimierungen wie z. B. GZIP auf Anwendungsebene vorzunehmen, damit Sie einen sehr detaillierten Ansatz für die zu gzipenden Assets haben.

Ich habe tatsächlich mein eigenes gzip-Modul für expressjs / connect namens gzippo https://github.com/tomgco/gzippo erstellt, obwohl es neu ist. Außerdem wird Node-Compress verwendet, anstatt den Unix-Befehl gzip zu erzeugen.

Tomgco
quelle
3
Ich benutze gzippo jetzt auf einem kleinen node.js Webserver, gute Sachen!
Bosgood
1
Wie kann ich überprüfen, ob gzip auf statische Assests angewendet wird?
Rizwan Patel
4

Auch wenn Sie kein Express verwenden, können Sie die Middleware verwenden. Das Komprimierungsmodul ist das, was ich verwende:

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)
BT
quelle
3

Während andere zu Recht darauf hingewiesen haben, dass ein Front-End-Webserver verwendet werden nginxkann, der dies implizit handhaben kann, besteht eine weitere Option darin, den hervorragenden Node-http-Proxy von Nodejitsu zu verwenden von , um Ihre Assets .

z.B:

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

Dieses Beispiel zeigt die Unterstützung der gzip-Komprimierung mithilfe des Connect Middleware- Moduls : connect-gzip.

Kavalkade
quelle
3

Zum Komprimieren der Datei können Sie den folgenden Code verwenden

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

Zum Dekomprimieren derselben Datei können Sie den folgenden Code verwenden

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.");
Krish Jackman
quelle
Würde gerne einen beschreibenden Text in dieser Antwort sehen! Während Ihre Codefragmente möglicherweise die Frage beantworten, empfiehlt es sich, einige Erklärungen für den TO und den Rest der Welt beizufügen, um zu verstehen, warum er die Frage beantwortet.
Clijsters
2

Wie wäre es damit ?

node-compress
Ein Streaming-Komprimierungs- / gzip-Modul für node.js Stellen Sie
zum Installieren sicher, dass libz installiert ist, und führen Sie
Folgendes aus : node-waf configure
node-waf build
Damit wird das Binärmodul compress.node in build / default versetzt.
...

Shay Erlichmen
quelle
2

Ab heute epxress.compress()scheint dies hervorragend zu funktionieren.

In jeder Express-App einfach anrufen this.use(express.compress());.

Ich fahre persönlich eine Lokomotive auf dem Express und das funktioniert wunderbar. Ich kann nicht mit anderen Bibliotheken oder Frameworks sprechen, die auf Express basieren, aber solange sie die volle Stapeltransparenz gewährleisten, sollte es Ihnen gut gehen.

Crispen Smith
quelle
2
Dies hat nicht wirklich neue Informationen, es dupliziert diese Antwort: stackoverflow.com/a/14341423/1355166
gcochard
1

Es waren ein paar gute Tage mit Node, und Sie können zu Recht sagen, dass Sie ohne gzip keinen Webserver erstellen können.

Auf der Modulseite im Node.js-Wiki finden Sie zahlreiche Optionen. Ich habe die meisten ausprobiert, aber dies ist die, die ich endlich benutze -

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

v1.0 ist auch raus und es war bisher ziemlich stabil.

Sudhanshu
quelle
Ich denke, Ihr Kommentar ist etwas irreführend. Während gzip in modernen Webanwendungen üblich ist, ist es keine Notwendigkeit . Ich denke, es ist vollkommen in Ordnung und entspricht den Standards, es nicht zu verwenden.
Simon East
1

Verwenden Sie die gzip-Komprimierung

Durch die Gzip-Komprimierung kann die Größe des Antwortkörpers erheblich verringert und damit die Geschwindigkeit einer Web-App erhöht werden. Verwenden Sie die Komprimierungs-Middleware für die GZIP-Komprimierung in Ihrer Express-App. Beispielsweise:

var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())
Jai Dewani
quelle
Müssen wir die Antwortgröße auf die Clientgröße dekomprimieren?
Siddharth Sunchu