Node.js:Gzip圧縮?


90

Node.jsがgzip圧縮を行わず、gzip圧縮を実行するモジュールがそこにないというのは間違っていますか?圧縮されていないWebサーバーを誰が使用できますか?ここで何が欠けていますか?サーバー側で使用するためにアルゴリズムをJavaScriptに移植する必要がありますか?

回答:


74

ノードv0.6.xのコアに安定したzlibモジュールが追加されました-サーバー側でドキュメントを使用する方法の例もいくつかあります。

例(ドキュメントから取得):

// 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
私は、Internet Explorerは、私が代わりに「createDeflate」の「createDeflateRaw」を使用することで解決zlibのヘッダー好きではないとの問題に遭遇した
マーク

60

Expressを使用している場合は、構成の一部として圧縮方法を使用できます。

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

そして、ここで圧縮に関する詳細を見つけることができます:http : //expressjs.com/api.html#compress

そして、もしあなたがExpressを使っていないのなら...なぜ使わないのですか?!:)

注:(@ankitjaininfoに感謝)このミドルウェアは、すべての応答を確実に圧縮するために最初に「使用」するものの1つにする必要があります。これがルートと静的ハンドラーの上にあることを確認してください(例:上記の方法)。

注:(@ ciro-costaに感謝)Express 4.0以降、express.compressミドルウェアは非推奨になりました。これは、connect 3.0から継承され、expressにはconnect 3.0が含まれなくなりました。ミドルウェアの入手については、Express Compressionを確認してください。


3
コメントなしで反対票を投じますか?理由を教えてください。うまくいけば、答えを改善できます。または、自由に編集してください。
ミリメトリック2014年

2
This middleware should be placed "high" within the stack to ensure all responses may be compressed. これがルートと静的ハンドラーの上にあることを確認してください
ankitjaininfo

14
今後はexpress.compress、connect 3.0 <が含まれていないミドルウェア(connect 3.0 <から継承されました)は非推奨になりました(express 4.0以降)。ミドルウェアを入手するには、github.com / expressjs / compressionを確認してください。
Ciro Costa

2
「どうしてだ、男?!」の場合、このページのグラフで未加工のhttpと高速フレームワークを比較すると、理由がわかる場合があります。expressは少し遅くしますraygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js
ejfrancis

:)それはほおの少し舌になることを意味していました。私は実際にはエクスプレスが好きではありません。それが実現したいと思っていることがもっとたくさんあり、それが持っていればもっとずっと洗練されていると思います。しかし、何かがそれを覆い隠すまで、それは私が思うに十分うまくいきます。
ミリメトリック2015

43

1- 圧縮をインストールする

npm install compression

2-使用する

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

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

Githubでの圧縮


1
static assestがgzipかどうかを確認する方法!
リズワンパテル

画像がgzip圧縮されない
Jeson Dias

大きなJS / CSSファイルまたは大きなJSONファイルを送信する場合は、実際にこのミドルウェアを使用する必要があります。このミドルウェアを使用してもメリットはなく、CPUリソースを多く消費します。@JesonDias
Shyam

@JesonDiasでは、画像にgzipを使用するべきではありません。JPEGには、gzipよりも画像に適している圧縮アルゴリズムがすでに含まれているためです。gzipは、テキストベースのもの用です。
user3413723

33

一般的に言えば、本番環境のウェブアプリケーションでは、node.jsアプリをnginxやlighttpdなどの軽量リバースプロキシの背後に配置する必要があります。このセットアップの多くの利点の中で、アプリケーションのソースコードを変更せずに、http圧縮またはtls圧縮を実行するようにリバースプロキシを構成できます。


ノードが静的ファイルを提供しないようにし、プロキシが圧縮を処理するようにし、prod-envでのベストプラクティスであることを確認します。とにかくnginxまたはlightyを使用して、ルートusrがポート80でノードを実行しないようにします
ezmilhouse

使い方にもよりますが、これが正解だと思います。
prasanthv 2016年

@ezmilhouseプロキシがある場合でも、node.jsサーバーはそれらの静的ファイルをプロキシに提供する必要があり、同じマシン内のパイプでも帯域幅を浪費する理由はありません。
BT

8

nginx、lighttpd、またはニスなどのリバースプロキシを使用してgzipできます。アプリケーションレベルでgzip圧縮などのほとんどのhttp最適化を行うと、どのアセットをgzipするかについてより詳細なアプローチをとることができるため、有益です。

私は実際にgjspo https://github.com/tomgco/gzippoと呼ばれるexpressjs / connect用の独自のgzipモジュールを作成しましたが、新しいものはそれを実行します。さらに、UNIXのgzipコマンドを生成する代わりにnode-compressを使用します。


3
小さなnode.jsウェブサーバーでgzippoを使用しています。
bosgood 2012年

1
gzipが静的なアセストに適用されているかどうかを確認する方法
Rizwan Patel 2017

4

Expressを使用していなくても、ミドルウェアを使用できます。圧縮モジュールは、私が使用しているものです。

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)

3

他の人がnginxこれを暗黙的に処理できるようなフロントエンドWebサーバーを使用して正しく指摘しているように、別のオプションは、nodejitsuの優れたnode-http-proxyを使用することですを使用してアセットを提供することです。

例えば:

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

この例は、接続ミドルウェアモジュールを使用したgzip圧縮のサポートを示していますconnect-gzip


3

ファイルを圧縮するには、以下のコードを使用できます

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

同じファイルを解凍するには、以下のコードを使用できます

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

この回答の説明文をぜひご覧ください。コードスニペットが質問に回答する場合がありますが、TOと他の世界にいくつかの説明を含めて、質問に回答する理由を理解することをお勧めします。
クライシュテルス

2

どの程度、この

node-compress
node.js用のストリーミング圧縮/ gzipモジュール
をインストールするには、libzがインストールされていることを確認して、次のコマンドを実行し
ます。node-waf configure
node-waf build
これにより、compress.nodeバイナリモジュールがbuild / defaultに配置されます。
...



2

今日のところ、これはepxress.compress()素晴らしい仕事をしているようです。

どの高速アプリでもを呼び出すだけthis.use(express.compress());です。

私は急行電車の上で機関車を個人的に走らせており、これは美しく働いています。Expressの上に構築された他のライブラリやフレームワークについて話すことはできませんが、完全なスタックの透過性を尊重する限り、問題はありません。


2
これは本当に新しい情報を持っていない、それはこの答えを複製:stackoverflow.com/a/14341423/1355166
gcochard

1

nodeを使って数日が経ちましたが、gzipなしではWebサーバーを作成できないと言っても過言ではありません。

Node.js Wikiのモジュールページには、非常に多くのオプションがあります。私はそれらのほとんどを試しましたが、これは私が最終的に使用しているものです-

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

v1.0もリリースされ、これまでのところ非常に安定しています。


あなたのコメントは少し誤解を招くと思います。最新のWebアプリケーションではgzipが一般的ですが、必須ではありません。使用しないことは完全に問題なく、標準に準拠していると思います。
サイモンイースト

1

gzip圧縮を使用する

Gzip圧縮により、応答本体のサイズを大幅に縮小できるため、Webアプリの速度が向上します。Expressアプリでgzip圧縮用の圧縮ミドルウェアを使用します。例えば:

var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())

クライアントサイズで応答サイズを解凍する必要がありますか?
Siddharth Sunchu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.