compression

NPM Version NPM Downloads Build Status Test Coverage

Node.js圧縮ミドルウェア。

以下の圧縮コーデックがサポートされています

  • deflate
  • gzip

インストール

これは、Node.js モジュールであり、npmレジストリ を通じて利用できます。インストールは、npm installコマンド を使用して行います。

$ npm install compression

API

var compression = require('compression')

compression([options])

与えられたoptionsを使用して圧縮ミドルウェアを返します。このミドルウェアは、与えられたoptionsに基づいて、ミドルウェアを通過するすべてのリクエストのレスポンスボディを圧縮しようとします。

このミドルウェアは、no-transformディレクティブ を含むCache-Controlヘッダーを含むレスポンスを圧縮することはありません。圧縮によってボディが変換されるためです。

オプション

compression()は、オプションオブジェクトにこれらのプロパティを受け入れます。以下にリストされているものに加えて、zlib オプションをオプションオブジェクトに渡すことができます。

chunkSize

デフォルト値はzlib.Z_DEFAULT_CHUNK、または16384です。

使用方法については、Node.jsドキュメント を参照してください。

filter

レスポンスを圧縮の対象とするかどうかを決定する関数です。この関数はfilter(req, res)として呼び出され、レスポンスを圧縮する場合はtrue、圧縮しない場合はfalseを返すことが期待されます。

デフォルトのfilter関数は、compressibleモジュールを使用して、res.getHeader('Content-Type')が圧縮可能かどうかを判断します。

level

レスポンスに適用する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です。

注記 上記のリストでは、zlibzlib = require('zlib')からのものです。

memLevel

これは、内部圧縮状態に割り当てるメモリ量を指定し、1(最小レベル)と9(最大レベル)の範囲の整数です。

デフォルト値はzlib.Z_DEFAULT_MEMLEVEL、または8です。

使用方法については、Node.jsドキュメント を参照してください。

strategy

これは、圧縮アルゴリズムを調整するために使用されます。この値は、適切に設定されていなくても、圧縮率にのみ影響し、圧縮出力の正確性には影響しません。

  • zlib.Z_DEFAULT_STRATEGY 通常のデータに使用します。
  • zlib.Z_FILTERED フィルター(または予測子)によって生成されたデータに使用します。フィルタリングされたデータは、主にランダムな分布を持つ小さな値で構成されます。この場合、圧縮アルゴリズムはそれらをより効果的に圧縮するように調整されます。その効果は、より多くのハフマン符号化を強制し、文字列の一致を少なくすることです。これは、zlib.Z_DEFAULT_STRATEGYzlib.Z_HUFFMAN_ONLYの中間程度です。
  • zlib.Z_FIXED 動的なハフマンコードの使用を回避し、特別なアプリケーションでよりシンプルなデコーダーを可能にします。
  • zlib.Z_HUFFMAN_ONLY ハフマン符号化のみを強制します(文字列一致なし)。
  • zlib.Z_RLE マッチ距離を1に制限します(ランレングス符号化)。これは、zlib.Z_HUFFMAN_ONLYとほぼ同じ速度になるように設計されていますが、PNG画像データの圧縮率が向上します。

注記 上記のリストでは、zlibzlib = require('zlib')からのものです。

threshold

レスポンスの圧縮が考慮される前に、レスポンスボディサイズに対するバイトのしきい値です。デフォルトは1kbです。これは、bytesモジュールで受け入れられるバイト数または任意の文字列です。

注記 これは単なる参考設定です。レスポンスヘッダーが書き込まれる時点でレスポンスサイズを判断できない場合、レスポンスはしきい値を超えていると仮定されます。レスポンスサイズを確実に判断するには、Content-Lengthレスポンスヘッダーを設定してください。

windowBits

デフォルト値はzlib.Z_DEFAULT_WINDOWBITS、または15です。

使用方法については、Node.jsドキュメント を参照してください。

.filter

デフォルトの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

このモジュールは、部分的に圧縮されたレスポンスをクライアントに強制的にフラッシュするためのres.flush()メソッドを追加します。

express/connect

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)
  })
})

ライセンス

MIT