Skip to content

Zlib

[Stable: 2 - Stable]

Stable: 2 Stability: 2 - Stable

ソースコード: lib/zlib.js

node:zlib モジュールは、Gzip、Deflate/Inflate、Brotli を使用して実装された圧縮機能を提供します。

アクセスするには:

js
import os from 'node:zlib'
js
const zlib = require('node:zlib')

圧縮と解凍は、Node.js の Streams API をベースに構築されています。

ファイルなどのストリームを圧縮または解凍するには、ソースストリームを zlibTransform ストリームを介して宛先ストリームにパイプ処理することができます。

js
import { createReadStream, createWriteStream } from 'node:fs'
import process from 'node:process'
import { createGzip } from 'node:zlib'
import { pipeline } from 'node:stream'

const gzip = createGzip()
const source = createReadStream('input.txt')
const destination = createWriteStream('input.txt.gz')

pipeline(source, gzip, destination, err => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
})
js
const { createReadStream, createWriteStream } = require('node:fs')
const process = require('node:process')
const { createGzip } = require('node:zlib')
const { pipeline } = require('node:stream')

const gzip = createGzip()
const source = createReadStream('input.txt')
const destination = createWriteStream('input.txt.gz')

pipeline(source, gzip, destination, err => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
})

または、Promise pipeline API を使用します。

js
import { createReadStream, createWriteStream } from 'node:fs'
import process from 'node:process'
import { createGzip } from 'node:zlib'
import { pipeline } from 'node:stream/promises'

async function do_gzip(input, output) {
  const gzip = createGzip()
  const source = createReadStream(input)
  const destination = createWriteStream(output)
  await pipeline(source, gzip, destination)
}

await do_gzip('input.txt', 'input.txt.gz')
js
const { createReadStream, createWriteStream } = require('node:fs')
const process = require('node:process')
const { createGzip } = require('node:zlib')
const { pipeline } = require('node:stream/promises')

async function do_gzip(input, output) {
  const gzip = createGzip()
  const source = createReadStream(input)
  const destination = createWriteStream(output)
  await pipeline(source, gzip, destination)
}

do_gzip('input.txt', 'input.txt.gz').catch(err => {
  console.error('An error occurred:', err)
  process.exitCode = 1
})

1 ステップでデータの圧縮または解凍を行うことも可能です。

js
import process from 'node:process'
import { Buffer } from 'node:buffer'
import { deflate, unzip } from 'node:zlib'

const input = '.................................'
deflate(input, (err, buffer) => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
  console.log(buffer.toString('base64'))
})

const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64')
unzip(buffer, (err, buffer) => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
  console.log(buffer.toString())
})

// Or, Promisified

import { promisify } from 'node:util'
const do_unzip = promisify(unzip)

const unzippedBuffer = await do_unzip(buffer)
console.log(unzippedBuffer.toString())
js
const { deflate, unzip } = require('node:zlib')

const input = '.................................'
deflate(input, (err, buffer) => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
  console.log(buffer.toString('base64'))
})

const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64')
unzip(buffer, (err, buffer) => {
  if (err) {
    console.error('An error occurred:', err)
    process.exitCode = 1
  }
  console.log(buffer.toString())
})

// Or, Promisified

const { promisify } = require('node:util')
const do_unzip = promisify(unzip)

do_unzip(buffer)
  .then(buf => console.log(buf.toString()))
  .catch(err => {
    console.error('An error occurred:', err)
    process.exitCode = 1
  })

Threadpool の使用方法とパフォーマンスに関する考慮事項

zlib API のすべて(明示的に同期的なものを除く)は、Node.js の内部スレッドプールを使用します。これは、一部のアプリケーションで予期しない影響とパフォーマンスの制限につながる可能性があります。

大量の zlib オブジェクトを同時に作成して使用すると、メモリ断片化が大幅に発生する可能性があります。

js
import zlib from 'node:zlib'
import { Buffer } from 'node:buffer'

const payload = Buffer.from('This is some data')

// WARNING: DO NOT DO THIS!
for (let i = 0; i < 30000; ++i) {
  zlib.deflate(payload, (err, buffer) => {})
}
js
const zlib = require('node:zlib')

const payload = Buffer.from('This is some data')

// WARNING: DO NOT DO THIS!
for (let i = 0; i < 30000; ++i) {
  zlib.deflate(payload, (err, buffer) => {})
}

上記の例では、30,000 個の deflate インスタンスが同時に作成されます。一部のオペレーティングシステムのメモリ割り当てと解放方法のため、これによりメモリ断片化が大幅に発生する可能性があります。

圧縮操作の結果をキャッシュして、作業の重複を避けることを強くお勧めします。

HTTP リクエストとレスポンスの圧縮

node:zlibモジュールを使用して、HTTPで定義されているgzipdeflatebrコンテンツエンコーディングメカニズムのサポートを実装できます。

HTTP のAccept-Encodingヘッダーは、クライアントが受け入れる圧縮エンコーディングを HTTP リクエスト内で識別するために使用されます。Content-Encodingヘッダーは、メッセージに実際に適用された圧縮エンコーディングを識別するために使用されます。

以下に示す例は、基本的な概念を示すために大幅に簡略化されています。zlibエンコーディングの使用はコストがかかる可能性があり、結果はキャッシュする必要があります。zlibの使用に伴う速度/メモリ/圧縮のトレードオフの詳細については、メモリ使用量の調整を参照してください。

js
// クライアントリクエストの例
import fs from 'node:fs'
import zlib from 'node:zlib'
import http from 'node:http'
import process from 'node:process'
import { pipeline } from 'node:stream'

const request = http.get({
  host: 'example.com',
  path: '/',
  port: 80,
  headers: { 'Accept-Encoding': 'br,gzip,deflate' },
})
request.on('response', response => {
  const output = fs.createWriteStream('example.com_index.html')

  const onError = err => {
    if (err) {
      console.error('An error occurred:', err)
      process.exitCode = 1
    }
  }

  switch (response.headers['content-encoding']) {
    case 'br':
      pipeline(response, zlib.createBrotliDecompress(), output, onError)
      break
    // Or, just use zlib.createUnzip() to handle both of the following cases:
    case 'gzip':
      pipeline(response, zlib.createGunzip(), output, onError)
      break
    case 'deflate':
      pipeline(response, zlib.createInflate(), output, onError)
      break
    default:
      pipeline(response, output, onError)
      break
  }
})
js
// クライアントリクエストの例
const zlib = require('node:zlib')
const http = require('node:http')
const fs = require('node:fs')
const { pipeline } = require('node:stream')

const request = http.get({
  host: 'example.com',
  path: '/',
  port: 80,
  headers: { 'Accept-Encoding': 'br,gzip,deflate' },
})
request.on('response', response => {
  const output = fs.createWriteStream('example.com_index.html')

  const onError = err => {
    if (err) {
      console.error('An error occurred:', err)
      process.exitCode = 1
    }
  }

  switch (response.headers['content-encoding']) {
    case 'br':
      pipeline(response, zlib.createBrotliDecompress(), output, onError)
      break
    // Or, just use zlib.createUnzip() to handle both of the following cases:
    case 'gzip':
      pipeline(response, zlib.createGunzip(), output, onError)
      break
    case 'deflate':
      pipeline(response, zlib.createInflate(), output, onError)
      break
    default:
      pipeline(response, output, onError)
      break
  }
})
js
// サーバーの例
// すべてのリクエストでgzip操作を実行するのは非常にコストがかかります。
// 圧縮されたバッファーをキャッシュする方がはるかに効率的です。
import zlib from 'node:zlib'
import http from 'node:http'
import fs from 'node:fs'
import { pipeline } from 'node:stream'

http
  .createServer((request, response) => {
    const raw = fs.createReadStream('index.html')
    // 圧縮版と非圧縮版の両方のリソースを保存します。
    response.setHeader('Vary', 'Accept-Encoding')
    const acceptEncoding = request.headers['accept-encoding'] || ''

    const onError = err => {
      if (err) {
        // エラーが発生した場合、サーバーはすでに200の応答コードを送信しており、
        // ある程度のデータがすでにクライアントに送信されているため、できることはほとんどありません。
        // 最善の策は、応答をすぐに終了し、エラーをログに記録することです。
        response.end()
        console.error('An error occurred:', err)
      }
    }

    // 注:これは準拠したaccept-encodingパーサーではありません。
    // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3を参照してください。
    if (/\bdeflate\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'deflate' })
      pipeline(raw, zlib.createDeflate(), response, onError)
    } else if (/\bgzip\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'gzip' })
      pipeline(raw, zlib.createGzip(), response, onError)
    } else if (/\bbr\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'br' })
      pipeline(raw, zlib.createBrotliCompress(), response, onError)
    } else {
      response.writeHead(200, {})
      pipeline(raw, response, onError)
    }
  })
  .listen(1337)
js
// サーバーの例
// すべてのリクエストでgzip操作を実行するのは非常にコストがかかります。
// 圧縮されたバッファーをキャッシュする方がはるかに効率的です。
const zlib = require('node:zlib')
const http = require('node:http')
const fs = require('node:fs')
const { pipeline } = require('node:stream')

http
  .createServer((request, response) => {
    const raw = fs.createReadStream('index.html')
    // 圧縮版と非圧縮版の両方のリソースを保存します。
    response.setHeader('Vary', 'Accept-Encoding')
    const acceptEncoding = request.headers['accept-encoding'] || ''

    const onError = err => {
      if (err) {
        // エラーが発生した場合、サーバーはすでに200の応答コードを送信しており、
        // ある程度のデータがすでにクライアントに送信されているため、できることはほとんどありません。
        // 最善の策は、応答をすぐに終了し、エラーをログに記録することです。
        response.end()
        console.error('An error occurred:', err)
      }
    }

    // 注:これは準拠したaccept-encodingパーサーではありません。
    // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3を参照してください。
    if (/\bdeflate\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'deflate' })
      pipeline(raw, zlib.createDeflate(), response, onError)
    } else if (/\bgzip\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'gzip' })
      pipeline(raw, zlib.createGzip(), response, onError)
    } else if (/\bbr\b/.test(acceptEncoding)) {
      response.writeHead(200, { 'Content-Encoding': 'br' })
      pipeline(raw, zlib.createBrotliCompress(), response, onError)
    } else {
      response.writeHead(200, {})
      pipeline(raw, response, onError)
    }
  })
  .listen(1337)

デフォルトでは、zlibメソッドは切り詰められたデータを解凍するときにエラーをスローします。ただし、データが不完全であることがわかっている場合、または圧縮ファイルの先頭部分のみを検査したい場合は、解凍に使用されるフラッシュメソッドを変更することにより、デフォルトのエラー処理を抑制できます。

js
// これは上記の例のバッファーの切り詰められたバージョンです
const buffer = Buffer.from('eJzT0yMA', 'base64')

zlib.unzip(
  buffer,
  // Brotliの場合、同等のものはzlib.constants.BROTLI_OPERATION_FLUSHです。
  { finishFlush: zlib.constants.Z_SYNC_FLUSH },
  (err, buffer) => {
    if (err) {
      console.error('An error occurred:', err)
      process.exitCode = 1
    }
    console.log(buffer.toString())
  }
)

これは、入力データの形式が無効であるなど、他のエラーをスローする状況では動作を変更しません。このメソッドを使用すると、入力が途中で終了したのか、整合性チェックが不足しているのかを判断できなくなるため、解凍された結果が有効であることを手動で確認する必要があります。

メモリ使用量の調整

zlib ベースのストリームの場合

zlib/zconf.hから、Node.js で使用するために修正したもの:

deflate に必要なメモリ量は(バイト単位で)以下の通りです。

js
;(1 << (windowBits + 2)) + (1 << (memLevel + 9))

つまり、windowBits = 15 の場合 128KB + memLevel = 8(デフォルト値)の場合 128KB + 小さなオブジェクトのための数キロバイトです。

例えば、デフォルトのメモリ要件を 256KB から 128KB に削減するには、オプションを次のように設定する必要があります。

js
const options = { windowBits: 14, memLevel: 7 }

ただし、これにより、一般的に圧縮率が低下します。

inflate に必要なメモリ量は(バイト単位で)1 << windowBitsです。つまり、windowBits = 15(デフォルト値)の場合 32KB + 小さなオブジェクトのための数キロバイトです。

これは、chunkSizeサイズの単一の内部出力スラブバッファに加えてのことです。デフォルトは 16KB です。

zlib圧縮の速度は、level設定によって最も劇的に影響を受けます。レベルが高いほど圧縮率は向上しますが、完了するまで時間がかかります。レベルが低いほど圧縮率は低下しますが、はるかに高速になります。

一般的に、メモリ使用量が多いオプションは、各write操作でより多くのデータ処理できるため、Node.js がzlibへの呼び出しを減らすことができます。そのため、これはメモリ使用量を犠牲にして速度に影響を与えるもう 1 つの要因です。

Brotli ベースのストリームの場合

zlib オプションと同様のものが Brotli ベースのストリームにもありますが、これらのオプションの範囲は zlib のものとは異なります。

  • zlib のlevelオプションは Brotli のBROTLI_PARAM_QUALITYオプションに対応します。
  • zlib のwindowBitsオプションは Brotli のBROTLI_PARAM_LGWINオプションに対応します。

Brotli 固有のオプションの詳細については、以下を参照してください。

フラッシュ

圧縮ストリームで.flush()を呼び出すと、zlibは現在可能な限り多くの出力を返します。これは圧縮品質の低下を招く可能性がありますが、データをできるだけ早く利用する必要がある場合に役立ちます。

次の例では、flush()を使用して圧縮された部分的な HTTP 応答をクライアントに書き込んでいます。

js
import zlib from 'node:zlib'
import http from 'node:http'
import { pipeline } from 'node:stream'

http
  .createServer((request, response) => {
    // For the sake of simplicity, the Accept-Encoding checks are omitted.
    response.writeHead(200, { 'content-encoding': 'gzip' })
    const output = zlib.createGzip()
    let i

    pipeline(output, response, err => {
      if (err) {
        // If an error occurs, there's not much we can do because
        // the server has already sent the 200 response code and
        // some amount of data has already been sent to the client.
        // The best we can do is terminate the response immediately
        // and log the error.
        clearInterval(i)
        response.end()
        console.error('An error occurred:', err)
      }
    })

    i = setInterval(() => {
      output.write(`The current time is ${Date()}\n`, () => {
        // The data has been passed to zlib, but the compression algorithm may
        // have decided to buffer the data for more efficient compression.
        // Calling .flush() will make the data available as soon as the client
        // is ready to receive it.
        output.flush()
      })
    }, 1000)
  })
  .listen(1337)
js
const zlib = require('node:zlib')
const http = require('node:http')
const { pipeline } = require('node:stream')

http
  .createServer((request, response) => {
    // For the sake of simplicity, the Accept-Encoding checks are omitted.
    response.writeHead(200, { 'content-encoding': 'gzip' })
    const output = zlib.createGzip()
    let i

    pipeline(output, response, err => {
      if (err) {
        // If an error occurs, there's not much we can do because
        // the server has already sent the 200 response code and
        // some amount of data has already been sent to the client.
        // The best we can do is terminate the response immediately
        // and log the error.
        clearInterval(i)
        response.end()
        console.error('An error occurred:', err)
      }
    })

    i = setInterval(() => {
      output.write(`The current time is ${Date()}\n`, () => {
        // The data has been passed to zlib, but the compression algorithm may
        // have decided to buffer the data for more efficient compression.
        // Calling .flush() will make the data available as soon as the client
        // is ready to receive it.
        output.flush()
      })
    }, 1000)
  })
  .listen(1337)

定数

追加日時: v0.5.8

zlib 定数

zlib.hで定義されているすべての定数は、require('node:zlib').constantsにも定義されています。通常はこれらの定数を使用する必要はありません。存在が驚くべきものでないように、ここに記載されています。このセクションは、zlib ドキュメントからほぼそのまま引用したものです。

以前は、require('node:zlib')から直接定数にアクセスできました(例:zlib.Z_NO_FLUSH)。モジュールから直接定数にアクセスすることは現在も可能ですが、非推奨です。

許容されるフラッシュ値。

  • zlib.constants.Z_NO_FLUSH
  • zlib.constants.Z_PARTIAL_FLUSH
  • zlib.constants.Z_SYNC_FLUSH
  • zlib.constants.Z_FULL_FLUSH
  • zlib.constants.Z_FINISH
  • zlib.constants.Z_BLOCK
  • zlib.constants.Z_TREES

圧縮/解凍関数の戻り値コード。負の値はエラーを示し、正の値は特殊な正常なイベントに使用されます。

  • zlib.constants.Z_OK
  • zlib.constants.Z_STREAM_END
  • zlib.constants.Z_NEED_DICT
  • zlib.constants.Z_ERRNO
  • zlib.constants.Z_STREAM_ERROR
  • zlib.constants.Z_DATA_ERROR
  • zlib.constants.Z_MEM_ERROR
  • zlib.constants.Z_BUF_ERROR
  • zlib.constants.Z_VERSION_ERROR

圧縮レベル。

  • zlib.constants.Z_NO_COMPRESSION
  • zlib.constants.Z_BEST_SPEED
  • zlib.constants.Z_BEST_COMPRESSION
  • zlib.constants.Z_DEFAULT_COMPRESSION

圧縮戦略。

  • zlib.constants.Z_FILTERED
  • zlib.constants.Z_HUFFMAN_ONLY
  • zlib.constants.Z_RLE
  • zlib.constants.Z_FIXED
  • zlib.constants.Z_DEFAULT_STRATEGY

Brotli 定数

追加日時: v11.7.0, v10.16.0

Brotli ベースのストリームで使用できるオプションやその他の定数がいくつかあります。

フラッシュ操作

次の値は、Brotli ベースのストリームに対して有効なフラッシュ操作です。

  • zlib.constants.BROTLI_OPERATION_PROCESS (すべての操作のデフォルト)
  • zlib.constants.BROTLI_OPERATION_FLUSH (.flush() を呼び出す際のデフォルト)
  • zlib.constants.BROTLI_OPERATION_FINISH (最後のチャンクのデフォルト)
  • zlib.constants.BROTLI_OPERATION_EMIT_METADATA
    • この特定の操作は、Node.js のコンテキストでは使いにくい場合があります。ストリーミングレイヤーでは、どのデータがこのフレームに最終的に含まれるかがわかりにくいためです。また、現在、Node.js API を通じてこのデータを使用する方法はありません。

圧縮オプション

Brotli エンコーダに設定できるオプションはいくつかあり、圧縮効率と速度に影響します。キーと値の両方に、zlib.constantsオブジェクトのプロパティとしてアクセスできます。

最も重要なオプションは次のとおりです。

  • BROTLI_PARAM_MODE

    • BROTLI_MODE_GENERIC (デフォルト)
    • BROTLI_MODE_TEXT、UTF-8 テキストに合わせて調整済み
    • BROTLI_MODE_FONT、WOFF 2.0 フォントに合わせて調整済み
  • BROTLI_PARAM_QUALITY

    • BROTLI_MIN_QUALITYからBROTLI_MAX_QUALITYの範囲で、デフォルトはBROTLI_DEFAULT_QUALITYです。
  • BROTLI_PARAM_SIZE_HINT

    • 予想される入力サイズを表す整数値。入力サイズが不明な場合は0がデフォルトです。

以下のフラグは、圧縮アルゴリズムとメモリ使用量の調整に関する高度な制御のために設定できます。

  • BROTLI_PARAM_LGWIN

    • BROTLI_MIN_WINDOW_BITSからBROTLI_MAX_WINDOW_BITSの範囲で、デフォルトはBROTLI_DEFAULT_WINDOWです。BROTLI_PARAM_LARGE_WINDOWフラグが設定されている場合は、BROTLI_LARGE_MAX_WINDOW_BITSまでです。
  • BROTLI_PARAM_LGBLOCK

    • BROTLI_MIN_INPUT_BLOCK_BITSからBROTLI_MAX_INPUT_BLOCK_BITSの範囲です。
  • BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING

    • ブール値のフラグ。解凍速度を優先して圧縮率を低下させます。
  • BROTLI_PARAM_LARGE_WINDOW

    • ブール値のフラグ。「Large Window Brotli」モードを有効にします(RFC 7932で標準化された Brotli 形式とは互換性がありません)。
  • BROTLI_PARAM_NPOSTFIX

    • 0からBROTLI_MAX_NPOSTFIXの範囲です。
  • BROTLI_PARAM_NDIRECT

    • 0から15 \<\< NPOSTFIXの範囲で、1 \<\< NPOSTFIXずつ増加します。

解凍オプション

これらの高度なオプションは、解凍を制御するために使用できます。

  • BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION

    • ブール値のフラグ。内部メモリ割り当てパターンに影響します。
  • BROTLI_DECODER_PARAM_LARGE_WINDOW

    • ブール値のフラグ。「Large Window Brotli」モードを有効にします(RFC 7932で標準化された Brotli 形式とは互換性がありません)。

Class: Options

[履歴]

バージョン変更内容
v14.5.0, v12.19.0maxOutputLength オプションがサポートされました。
v9.4.0dictionary オプションに ArrayBuffer を使用できるようになりました。
v8.0.0dictionary オプションに Uint8Array を使用できるようになりました。
v5.11.0finishFlush オプションがサポートされました。
v0.11.1追加: v0.11.1

zlib ベースの各クラスは options オブジェクトを取ります。オプションは必須ではありません。

いくつかのオプションは圧縮時のみ関連し、解凍クラスでは無視されます。

詳細は、deflateInit2 および inflateInit2 のドキュメントを参照してください。

Class: BrotliOptions

[履歴]

バージョン変更
v14.5.0, v12.19.0maxOutputLength オプションがサポートされました。
v11.7.0追加: v11.7.0

Brotli ベースの各クラスは、options オブジェクトを受け取ります。すべてのオプションは省略可能です。

例:

js
const stream = zlib.createBrotliCompress({
  chunkSize: 32 * 1024,
  params: {
    [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,
    [zlib.constants.BROTLI_PARAM_QUALITY]: 4,
    [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fs.statSync(inputFile).size,
  },
})

Class: zlib.BrotliCompress

追加: v11.7.0, v10.16.0

Brotli アルゴリズムを使用してデータを圧縮します。

Class: zlib.BrotliDecompress

追加: v11.7.0, v10.16.0

Brotli アルゴリズムを使用してデータを解凍します。

Class: zlib.Deflate

追加: v0.5.8

deflate を使用してデータを圧縮します。

Class: zlib.DeflateRaw

追加: v0.5.8

deflate を使用してデータを圧縮し、zlib ヘッダーを追加しません。

Class: zlib.Gunzip

[履歴]

バージョン変更
v6.0.0入力ストリームの末尾にある余分なデータは、'error' イベントを引き起こすようになりました。
v5.9.0複数の連結された gzip ファイルメンバーがサポートされるようになりました。
v5.0.0切り詰められた入力ストリームは、'error' イベントを引き起こすようになりました。
v0.5.8追加: v0.5.8

gzip ストリームを解凍します。

クラス: zlib.Gzip

追加されたバージョン: v0.5.8

gzip を使用してデータを圧縮します。

クラス: zlib.Inflate

[履歴]

バージョン変更
v5.0.0切り詰められた入力ストリームは、 теперь будет вызывать событие 'error'
v0.5.8追加されたバージョン: v0.5.8

deflate ストリームを解凍します。

クラス: zlib.InflateRaw

[履歴]

バージョン変更
v6.8.0InflateRaw でカスタム辞書がサポートされるようになりました。
v5.0.0切り詰められた入力ストリームは、 теперь будет вызывать событие 'error'
v0.5.8追加されたバージョン: v0.5.8

生の deflate ストリームを解凍します。

クラス: zlib.Unzip

追加されたバージョン: v0.5.8

ヘッダーを自動検出することにより、Gzip または Deflate で圧縮されたストリームを解凍します。

クラス: zlib.ZlibBase

[履歴]

バージョン変更
v11.7.0, v10.16.0このクラスの名前が Zlib から ZlibBase に変更されました。
v0.5.8追加されたバージョン: v0.5.8

node:zlib モジュールによってエクスポートされません。圧縮/解凍クラスの基底クラスであるため、ここに記載されています。

このクラスは stream.Transform を継承しているため、node:zlib オブジェクトをパイプや同様のストリーム操作で使用できます。

zlib.bytesWritten

追加されたバージョン: v10.0.0

zlib.bytesWritten プロパティは、バイトが処理される(圧縮または解凍される、派生クラスに応じて)前に、エンジンに書き込まれたバイト数を指定します。

zlib.crc32(data[, value])

追加されたバージョン: v22.2.0, v20.15.0

  • data <string> | <Buffer> | <TypedArray> | <DataView> data が文字列の場合、計算に使用される前に UTF-8 でエンコードされます。
  • value <integer> オプションの開始値。32 ビットの符号なし整数である必要があります。デフォルト: 0
  • 戻り値: <integer> チェックサムを含む 32 ビットの符号なし整数。

data の 32 ビット 巡回冗長検査 チェックサムを計算します。value が指定されている場合、それはチェックサムの開始値として使用され、そうでない場合は 0 が開始値として使用されます。

CRC アルゴリズムは、チェックサムを計算し、データ伝送におけるエラーを検出するように設計されています。暗号認証には適していません。

他の API と整合性を保つために、data が文字列の場合、計算に使用される前に UTF-8 でエンコードされます。ユーザーが Node.js を使用してチェックサムを計算および照合する場合のみ、これはデフォルトで UTF-8 エンコーディングを使用する他の API とうまく機能します。

一部のサードパーティの JavaScript ライブラリは、str.charCodeAt() に基づいて文字列のチェックサムを計算するため、ブラウザで実行できます。ユーザーがこのようなブラウザのライブラリで計算されたチェックサムと一致させる必要がある場合、Node.js でも実行される場合は、Node.js で同じライブラリを使用する方が良いでしょう。ユーザーが zlib.crc32() を使用して、そのようなサードパーティライブラリによって生成されたチェックサムと一致させる必要がある場合:

js
import zlib from 'node:zlib'
import { Buffer } from 'node:buffer'

let crc = zlib.crc32('hello') // 907060870
crc = zlib.crc32('world', crc) // 4192936109

crc = zlib.crc32(Buffer.from('hello', 'utf16le')) // 1427272415
crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc) // 4150509955
js
const zlib = require('node:zlib')
const { Buffer } = require('node:buffer')

let crc = zlib.crc32('hello') // 907060870
crc = zlib.crc32('world', crc) // 4192936109

crc = zlib.crc32(Buffer.from('hello', 'utf16le')) // 1427272415
crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc) // 4150509955

zlib.close([callback])

追加日時: v0.9.4

基盤となるハンドルを閉じます。

zlib.flush([kind, ]callback)

追加日時: v0.5.8

  • kind デフォルト: zlib ベースのストリームではzlib.constants.Z_FULL_FLUSH、Brotli ベースのストリームではzlib.constants.BROTLI_OPERATION_FLUSH
  • callback <Function>

保留中のデータをフラッシュします。安易に呼び出さないでください。時期尚早のフラッシュは、圧縮アルゴリズムの効果に悪影響を及ぼします。

これは内部zlibの状態からデータのみをフラッシュし、ストリームレベルでのいかなる種類のフラッシュも行いません。むしろ、.write()への通常の呼び出しのように動作し、つまり、他の保留中の書き込みの後ろにキューに入れられ、ストリームからデータが読み取られるまで出力は生成されません。

zlib.params(level, strategy, callback)

追加日時: v0.11.4

この関数は、zlib ベースのストリーム(Brotli ではない)でのみ使用できます。

圧縮レベルと圧縮戦略を動的に更新します。deflate アルゴリズムにのみ適用されます。

zlib.reset()

追加日時: v0.7.0

コンプレッサー/デコンプレッサーを工場出荷時のデフォルトにリセットします。inflate アルゴリズムと deflate アルゴリズムのみに適用されます。

zlib.constants

追加日時: v7.0.0

Zlib 関連の定数を列挙するオブジェクトを提供します。

zlib.createBrotliCompress([options])

追加日時: v11.7.0, v10.16.0

新しいBrotliCompressオブジェクトを作成して返します。

zlib.createBrotliDecompress([options])

追加バージョン: v11.7.0, v10.16.0

新しいBrotliDecompressオブジェクトを作成して返します。

zlib.createDeflate([options])

追加バージョン: v0.5.8

新しいDeflateオブジェクトを作成して返します。

zlib.createDeflateRaw([options])

追加バージョン: v0.5.8

新しいDeflateRawオブジェクトを作成して返します。

zlib を 1.2.8 から 1.2.11 にアップグレードすると、windowBitsが raw deflate ストリームに対して 8 に設定されている場合の動作が変わりました。zlib は、windowBitsが最初に 8 に設定されていた場合、自動的に 9 に設定していました。新しいバージョンの zlib は例外をスローするため、Node.js は 8 の値を 9 にアップグレードするという元の動作を復元しました。これは、zlib にwindowBits = 9を渡すと、実際には 8 ビットウィンドウのみを効果的に使用する圧縮ストリームが生成されるためです。

zlib.createGunzip([options])

追加バージョン: v0.5.8

新しいGunzipオブジェクトを作成して返します。

zlib.createGzip([options])

追加バージョン: v0.5.8

新しいGzipオブジェクトを作成して返します。を参照してください。

zlib.createInflate([options])

追加バージョン: v0.5.8

新しいInflateオブジェクトを作成して返します。

zlib.createInflateRaw([options])

追加バージョン: v0.5.8

新しいInflateRawオブジェクトを作成して返します。

zlib.createUnzip([options])

追加バージョン: v0.5.8

新しいUnzipオブジェクトを作成して返します。

便利なメソッド

これらはすべて、最初の引数としてBufferTypedArrayDataViewArrayBuffer、または文字列を取り、zlibクラスにオプションを供給するオプションの第二引数を取り、callback(error, result)で指定されたコールバックを呼び出します。

すべてのメソッドには*Sync対応物があり、同じ引数を取りますが、コールバックはありません。

zlib.brotliCompress(buffer[, options], callback)

追加されたバージョン: v11.7.0, v10.16.0

zlib.brotliCompressSync(buffer[, options])

追加されたバージョン: v11.7.0, v10.16.0

BrotliCompressを使用してデータチャンクを圧縮します。

zlib.brotliDecompress(buffer[, options], callback)

追加: v11.7.0, v10.16.0

zlib.brotliDecompressSync(buffer[, options])

追加: v11.7.0, v10.16.0

BrotliDecompress を使用してデータチャンクを解凍します。

zlib.deflate(buffer[, options], callback)

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.deflateSync(buffer[, options])

[履歴]

バージョン変更
v9.4.0bufferパラメータにArrayBufferを使用できるようになりました。
v8.0.0bufferパラメータに任意のTypedArrayまたはDataViewを使用できるようになりました。
v8.0.0bufferパラメータにUint8Arrayを使用できるようになりました。
v0.11.12追加: v0.11.12

Deflateを使用してデータチャンクを圧縮します。

zlib.deflateRaw(buffer[, options], callback)

[履歴]

バージョン変更
v8.0.0bufferパラメータに任意のTypedArrayまたはDataViewを使用できるようになりました。
v8.0.0bufferパラメータにUint8Arrayを使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.deflateRawSync(buffer[, options])

[履歴]

バージョン変更
v9.4.0bufferパラメータにArrayBufferを使用できるようになりました。
v8.0.0bufferパラメータに任意のTypedArrayまたはDataViewを使用できるようになりました。
v8.0.0bufferパラメータにUint8Arrayを使用できるようになりました。
v0.11.12追加: v0.11.12

DeflateRawを使用してデータチャンクを圧縮します。

zlib.gunzip(buffer[, options], callback)

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.gunzipSync(buffer[, options])

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.11.12追加: v0.11.12

Gunzip を使用してデータチャンクを解凍します。

zlib.gzip(buffer[, options], callback)

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.gzipSync(buffer[, options])

[履歴]

バージョン変更点
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.11.12追加: v0.11.12

Gzip を使用してデータチャンクを圧縮します。

zlib.inflate(buffer[, options], callback)

[履歴]

バージョン変更点
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.inflateSync(buffer[, options])

[履歴]

バージョン変更点
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.11.12追加: v0.11.12

Inflate を使用してデータチャンクを解凍します。

zlib.inflateRaw(buffer[, options], callback)

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.inflateRawSync(buffer[, options])

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.11.12追加: v0.11.12

InflateRaw を使用してデータチャンクを解凍します。

zlib.unzip(buffer[, options], callback)

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.6.0追加: v0.6.0

zlib.unzipSync(buffer[, options])

[履歴]

バージョン変更
v9.4.0buffer パラメータに ArrayBuffer を使用できるようになりました。
v8.0.0buffer パラメータに任意の TypedArray または DataView を使用できるようになりました。
v8.0.0buffer パラメータに Uint8Array を使用できるようになりました。
v0.11.12追加: v0.11.12

Unzip を使用してデータチャンクを解凍します。