Node.js圧縮ミドルウェア。
以下の圧縮コーデックがサポートされています
これは、Node.js モジュールであり、npmレジストリ を通じて利用できます。インストールは、npm install
コマンド を使用して行います。
$ npm install compression
var compression = require('compression')
与えられたoptions
を使用して圧縮ミドルウェアを返します。このミドルウェアは、与えられたoptions
に基づいて、ミドルウェアを通過するすべてのリクエストのレスポンスボディを圧縮しようとします。
このミドルウェアは、no-transform
ディレクティブ を含むCache-Control
ヘッダーを含むレスポンスを圧縮することはありません。圧縮によってボディが変換されるためです。
compression()
は、オプションオブジェクトにこれらのプロパティを受け入れます。以下にリストされているものに加えて、zlib オプションをオプションオブジェクトに渡すことができます。
デフォルト値はzlib.Z_DEFAULT_CHUNK
、または16384
です。
使用方法については、Node.jsドキュメント を参照してください。
レスポンスを圧縮の対象とするかどうかを決定する関数です。この関数はfilter(req, res)
として呼び出され、レスポンスを圧縮する場合はtrue
、圧縮しない場合はfalse
を返すことが期待されます。
デフォルトのfilter関数は、compressibleモジュールを使用して、res.getHeader('Content-Type')
が圧縮可能かどうかを判断します。
レスポンスに適用するzlib圧縮のレベルです。レベルが高いほど圧縮率は向上しますが、完了するまで時間がかかります。レベルが低いほど圧縮率は低下しますが、はるかに高速になります。
これは、0
(圧縮なし)から9
(最大圧縮)の範囲の整数です。特別な値-1
は、「デフォルトの圧縮レベル」を意味するために使用できます。これは、速度と圧縮のバランスをとったデフォルトの妥協点です(現在、レベル6と同等です)。
-1
デフォルトの圧縮レベル(zlib.Z_DEFAULT_COMPRESSION
でもあります)。0
圧縮なし(zlib.Z_NO_COMPRESSION
でもあります)。1
最速の圧縮(zlib.Z_BEST_SPEED
でもあります)。2
3
4
5
6
(現在、zlib.Z_DEFAULT_COMPRESSION
が指しているもの)。7
8
9
最高の圧縮(zlib.Z_BEST_COMPRESSION
でもあります)。デフォルト値はzlib.Z_DEFAULT_COMPRESSION
、または-1
です。
注記 上記のリストでは、zlib
はzlib = require('zlib')
からのものです。
これは、内部圧縮状態に割り当てるメモリ量を指定し、1
(最小レベル)と9
(最大レベル)の範囲の整数です。
デフォルト値はzlib.Z_DEFAULT_MEMLEVEL
、または8
です。
使用方法については、Node.jsドキュメント を参照してください。
これは、圧縮アルゴリズムを調整するために使用されます。この値は、適切に設定されていなくても、圧縮率にのみ影響し、圧縮出力の正確性には影響しません。
zlib.Z_DEFAULT_STRATEGY
通常のデータに使用します。zlib.Z_FILTERED
フィルター(または予測子)によって生成されたデータに使用します。フィルタリングされたデータは、主にランダムな分布を持つ小さな値で構成されます。この場合、圧縮アルゴリズムはそれらをより効果的に圧縮するように調整されます。その効果は、より多くのハフマン符号化を強制し、文字列の一致を少なくすることです。これは、zlib.Z_DEFAULT_STRATEGY
とzlib.Z_HUFFMAN_ONLY
の中間程度です。zlib.Z_FIXED
動的なハフマンコードの使用を回避し、特別なアプリケーションでよりシンプルなデコーダーを可能にします。zlib.Z_HUFFMAN_ONLY
ハフマン符号化のみを強制します(文字列一致なし)。zlib.Z_RLE
マッチ距離を1に制限します(ランレングス符号化)。これは、zlib.Z_HUFFMAN_ONLY
とほぼ同じ速度になるように設計されていますが、PNG画像データの圧縮率が向上します。注記 上記のリストでは、zlib
はzlib = require('zlib')
からのものです。
レスポンスの圧縮が考慮される前に、レスポンスボディサイズに対するバイトのしきい値です。デフォルトは1kb
です。これは、bytesモジュールで受け入れられるバイト数または任意の文字列です。
注記 これは単なる参考設定です。レスポンスヘッダーが書き込まれる時点でレスポンスサイズを判断できない場合、レスポンスはしきい値を超えていると仮定されます。レスポンスサイズを確実に判断するには、Content-Length
レスポンスヘッダーを設定してください。
デフォルト値はzlib.Z_DEFAULT_WINDOWBITS
、または15
です。
使用方法については、Node.jsドキュメント を参照してください。
デフォルトのfilter
関数です。これは、デフォルト関数の拡張であるカスタムフィルター関数を構築するために使用されます。
var compression = require('compression')
var express = require('express')
var app = express()
app.use(compression({ filter: shouldCompress }))
function shouldCompress (req, res) {
if (req.headers['x-no-compression']) {
// don't compress responses with this request header
return false
}
// fallback to standard filter function
return compression.filter(req, res)
}
このモジュールは、部分的に圧縮されたレスポンスをクライアントに強制的にフラッシュするためのres.flush()
メソッドを追加します。
expressまたはconnectでこのモジュールを使用する場合は、好きなだけ高くapp.use
するだけです。ミドルウェアを通過するリクエストは圧縮されます。
var compression = require('compression')
var express = require('express')
var app = express()
// compress all responses
app.use(compression())
// add all routes
圧縮の性質上、このモジュールはサーバー送信イベントではそのままでは機能しません。コンテンツを圧縮するには、良好な圧縮を得るために出力のウィンドウをバッファリングする必要があります。通常、サーバー送信イベントを使用する場合、クライアントに到達する必要がある特定のデータブロックがあります。
データが実際にクライアントに到達するように書き込む必要がある場合は、res.flush()
を呼び出すことでこれを実現できます。
var compression = require('compression')
var express = require('express')
var app = express()
// compress responses
app.use(compression())
// server-sent event stream
app.get('/events', function (req, res) {
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
// send a ping approx every 2 seconds
var timer = setInterval(function () {
res.write('data: ping\n\n')
// !!! this is the important part
res.flush()
}, 2000)
res.on('close', function () {
clearInterval(timer)
})
})