Node.jsがgzip圧縮を行わず、gzip圧縮を実行するモジュールがないことを見つけるのは間違っていますか?誰も圧縮のないWebサーバーをどのように使用できますか?ここで何が欠けていますか?サーバー側で使用するために、アルゴリズムをJavaScriptに移植しようとする必要がありますか?
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);
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 を確認してください。
1-インストールcompression
npm install compression
2-使用する
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
一般的に言えば、本番Webアプリケーションの場合、node.jsアプリをnginxやlighttpdなどの軽量のリバースプロキシの背後に配置する必要があります。このセットアップの多くの利点の中で、アプリケーションのソースコードを変更することなく、http圧縮またはtls圧縮を行うようにリバースプロキシを構成できます。
ただし、nginx、lighttpd、またはニスなどのリバースプロキシを使用してgzipを実行できます。アプリケーションレベルでgzipを実行するなど、ほとんどのhttp最適化を行うと、gzipするアセットの詳細なアプローチが可能になります。
私は実際にexpressjs/connectというgzippo https://github.com/tomgco/gzippo と呼ばれる独自のgzipモジュールを作成しましたが、新しいものは機能します。さらに、unix gzipコマンドを生成する代わりに、ノード圧縮を使用します。
ファイルを圧縮するには、以下のコードを使用できます
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.");
他の人がnginx
などのフロントエンドWebサーバーを使用してこれを暗黙的に処理できることを指摘している一方で、別のオプションは nodejitsu's を使用することです優れた node-http-proxy アセットを提供します。
例えば:
httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
この例は、 connectミドルウェア モジュールの使用によるgzip圧縮のサポートを示しています:connect-gzip
。
エクスプレスを使用していない場合でも、ミドルウェアを使用できます。 圧縮モジュール は私が使用しているものです:
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)
this ?
node-compress
node.js用のストリーミング圧縮/ gzipモジュール
インストールするには、libzがインストールされていることを確認し、次を実行します。
node-waf configure
node-wafビルド
これにより、compress.nodeバイナリモジュールがbuild/defaultに配置されます。
...
Gzip圧縮により、応答本文のサイズが大幅に減少するため、Webアプリの速度が向上します。 Expressアプリでgzip圧縮用の圧縮ミドルウェアを使用します。例えば:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())
Nodeを使用して数日が経ちましたが、gzipなしではWebサーバーを作成できないと言ってもいいでしょう。
Node.js Wikiのモジュールページには、非常に多くのオプションがあります。私はそれらのほとんどを試してみましたが、これは私が最終的に使用しているものです-
https://github.com/donnerjack13589/node.gzip
v1.0もリリースされており、これまでのところ非常に安定しています。
今日の時点で、epxress.compress()はこれについて素晴らしい仕事をしているようです。
エクスプレスアプリでは、this.use(express.compress());を呼び出すだけです。私は個人的に特急で機関車を走らせており、これはうまく機能しています。 Expressの上に構築された他のライブラリやフレームワークとは話せませんが、完全なスタックの透明性を尊重する限り、問題ありません。