web-dev-qa-db-ja.com

Node.js:Gzip圧縮?

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

85

Node 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);
68
hughsk

Express を使用している場合、構成の一部としてそのcompressメソッドを使用できます。

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 を確認してください。

58
Milimetric

1-インストールcompression

npm install compression

2-使用する

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

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

Githubでの圧縮

40
CoyBit

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

29
yfeldblum

ただし、nginx、lighttpd、またはニスなどのリバースプロキシを使用してgzipを実行できます。アプリケーションレベルでgzipを実行するなど、ほとんどのhttp最適化を行うと、gzipするアセットの詳細なアプローチが可能になります。

私は実際にexpressjs/connectというgzippo https://github.com/tomgco/gzippo と呼ばれる独自のgzipモジュールを作成しましたが、新しいものは機能します。さらに、unix gzipコマンドを生成する代わりに、ノード圧縮を使用します。

8
tomgco

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

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

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

例えば:

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

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

3
cavalcade

エクスプレスを使用していない場合でも、ミドルウェアを使用できます。 圧縮モジュール は私が使用しているものです:

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)
2
B T

this

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

2
Shay Erlichmen

Gzip圧縮を使用する

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

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

Nodeを使用して数日が経ちましたが、gzipなしではWebサーバーを作成できないと言ってもいいでしょう。

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

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

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

1
Sudhanshu

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

エクスプレスアプリでは、this.use(express.compress());を呼び出すだけです。私は個人的に特急で機関車を走らせており、これはうまく機能しています。 Expressの上に構築された他のライブラリやフレームワークとは話せませんが、完全なスタックの透明性を尊重する限り、問題ありません。

1
Crispen Smith