Node.jsがgzip圧縮を行わず、gzip圧縮を実行するモジュールがそこにないというのは間違っていますか?圧縮されていないWebサーバーを誰が使用できますか?ここで何が欠けていますか?サーバー側で使用するためにアルゴリズムをJavaScriptに移植する必要がありますか?
回答:
ノード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を使用している場合は、構成の一部として圧縮方法を使用できます。
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を確認してください。
This middleware should be placed "high" within the stack to ensure all responses may be compressed.
これがルートと静的ハンドラーの上にあることを確認してください
express.compress
、connect 3.0 <が含まれていないミドルウェア(connect 3.0 <から継承されました)は非推奨になりました(express 4.0以降)。ミドルウェアを入手するには、github.com / expressjs / compressionを確認してください。
1- 圧縮をインストールする
npm install compression
2-使用する
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
一般的に言えば、本番環境のウェブアプリケーションでは、node.jsアプリをnginxやlighttpdなどの軽量リバースプロキシの背後に配置する必要があります。このセットアップの多くの利点の中で、アプリケーションのソースコードを変更せずに、http圧縮またはtls圧縮を実行するようにリバースプロキシを構成できます。
nginx、lighttpd、またはニスなどのリバースプロキシを使用してgzipできます。アプリケーションレベルでgzip圧縮などのほとんどのhttp最適化を行うと、どのアセットをgzipするかについてより詳細なアプローチをとることができるため、有益です。
私は実際にgjspo https://github.com/tomgco/gzippoと呼ばれるexpressjs / connect用の独自のgzipモジュールを作成しましたが、新しいものはそれを実行します。さらに、UNIXのgzipコマンドを生成する代わりにnode-compressを使用します。
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)
他の人がnginx
これを暗黙的に処理できるようなフロントエンドWebサーバーを使用して正しく指摘しているように、別のオプションは、nodejitsuの優れたnode-http-proxyを使用することですを使用してアセットを提供することです。
例えば:
httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
この例は、接続ミドルウェアモジュールを使用したgzip圧縮のサポートを示していますconnect-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.");
どの程度、この?
node-compress
node.js用のストリーミング圧縮/ gzipモジュール
をインストールするには、libzがインストールされていることを確認して、次のコマンドを実行し
ます。node-waf configure
node-waf build
これにより、compress.nodeバイナリモジュールがbuild / defaultに配置されます。
...
Express、KOAなどには、複数のGzipミドルウェアがあります。例:https : //www.npmjs.com/package/express-static-gzip
ただし、Nodeはgzip圧縮やSSL終了などのCPU集中タスクを実行するのが非常に得意ではありません。代わりに、nginxやHAproxyなどの「実際の」ミドルウェアサービスを使用して ください。 node-js-in-production /の練習
今日のところ、これはepxress.compress()
素晴らしい仕事をしているようです。
どの高速アプリでもを呼び出すだけthis.use(express.compress());
です。
私は急行電車の上で機関車を個人的に走らせており、これは美しく働いています。Expressの上に構築された他のライブラリやフレームワークについて話すことはできませんが、完全なスタックの透過性を尊重する限り、問題はありません。
nodeを使って数日が経ちましたが、gzipなしではWebサーバーを作成できないと言っても過言ではありません。
Node.js Wikiのモジュールページには、非常に多くのオプションがあります。私はそれらのほとんどを試しましたが、これは私が最終的に使用しているものです-
https://github.com/donnerjack13589/node.gzip
v1.0もリリースされ、これまでのところ非常に安定しています。
Gzip圧縮により、応答本体のサイズを大幅に縮小できるため、Webアプリの速度が向上します。Expressアプリでgzip圧縮用の圧縮ミドルウェアを使用します。例えば:
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())