Zlib¶
Стабильность: 2 – Стабильная
АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.
Модуль node:zlib
предоставляет функциональность сжатия, реализованную с помощью Gzip, Deflate/Inflate и Brotli.
Чтобы получить к нему доступ:
1 |
|
Сжатие и распаковка построены вокруг Node.js Streams API.
Сжатие или распаковка потока (например, файла) может быть выполнена путем передачи исходного потока через поток zlib
Transform
в конечный поток:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Также можно сжать или распаковать данные за один шаг:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Использование пула потоков и соображения по производительности¶
Все zlib
API, за исключением тех, которые явно синхронны, используют внутренний пул потоков Node.js. Это может привести к неожиданным эффектам и ограничениям производительности в некоторых приложениях.
Создание и использование большого количества объектов zlib одновременно может привести к значительной фрагментации памяти.
1 2 3 4 5 6 7 8 |
|
В предыдущем примере одновременно создается 30 000 экземпляров deflate. Из-за того, как некоторые операционные системы обрабатывают выделение и деаллокацию памяти, это может привести к значительной фрагментации памяти.
Настоятельно рекомендуется кэшировать результаты операций сжатия, чтобы избежать дублирования усилий.
Сжатие HTTP-запросов и ответов¶
Модуль node:zlib
может быть использован для реализации поддержки механизмов кодирования содержимого gzip
, deflate
и br
, определенных в HTTP.
Заголовок HTTP Accept-Encoding
используется в HTTP-запросе для определения кодировок сжатия, принимаемых клиентом. Заголовок Content-Encoding
используется для определения кодировок сжатия, фактически примененных к сообщению.
Приведенные ниже примеры сильно упрощены, чтобы показать основную концепцию. Использование кодировки zlib
может быть дорогостоящим, и результаты должны кэшироваться.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
По умолчанию методы zlib
выдают ошибку при распаковке усеченных данных. Однако, если известно, что данные неполные, или есть желание просмотреть только начало сжатого файла, можно подавить обработку ошибок по умолчанию, изменив метод промывки, который используется для распаковки последнего куска входных данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Это не изменит поведение в других ситуациях с выбросом ошибок, например, когда входные данные имеют недопустимый формат. Используя этот метод, невозможно определить, завершился ли входной файл преждевременно или в нем отсутствуют проверки целостности, что делает необходимым ручную проверку достоверности распакованного результата.
Настройка использования памяти¶
Для потоков на основе zlib¶
Из zlib/zconf.h
, изменено для использования в Node.js:
Требования к памяти для deflate следующие (в байтах):
1 |
|
То есть: 128K для windowBits
= 15 + 128K для memLevel
= 8 (значения по умолчанию) плюс несколько килобайт для небольших объектов.
Например, чтобы уменьшить требования к памяти по умолчанию с 256K до 128K, нужно установить опции в следующие значения:
1 |
|
Это, однако, в целом ухудшит сжатие.
Требования к памяти для inflate составляют (в байтах) 1 << windowBits
. То есть 32К для windowBits
= 15 (значение по умолчанию) плюс несколько килобайт для небольших объектов.
Это в дополнение к одному внутреннему буферу выходного слэба размером chunkSize
, который по умолчанию равен 16K.
На скорость сжатия zlib
наиболее сильно влияет параметр level
. Более высокий уровень приводит к лучшему сжатию, но требует больше времени для завершения. Более низкий уровень приведет к меньшему сжатию, но будет намного быстрее.
В целом, большие параметры использования памяти означают, что Node.js придется делать меньше обращений к zlib
, поскольку он сможет обрабатывать больше данных при каждой операции записи
. Таким образом, это еще один фактор, влияющий на скорость, ценой использования памяти.
Для потоков на основе Brotli-.¶
Существуют эквиваленты опций zlib для потоков на базе Brotli, хотя эти опции имеют другие диапазоны, чем zlib:
- Опция zlib
level
соответствует опции BrotliBROTLI_PARAM_QUALITY
. - Опция zlib
windowBits
соответствует опции BrotliBROTLI_PARAM_LGWIN
.
Промывка¶
Вызов .flush()
на потоке сжатия заставит zlib
вернуть столько выходных данных, сколько возможно. Это может стоить ухудшения качества сжатия, но может быть полезно, когда данные должны быть доступны как можно скорее.
В следующем примере flush()
используется для записи сжатого частичного HTTP-ответа клиенту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
Константы¶
Константы zlib¶
Все константы, определенные в zlib.h
, также определены в require('node:zlib').constants
. В ходе обычной работы эти константы не понадобятся. Они документированы так, чтобы их наличие не вызывало удивления.
Ранее константы были доступны непосредственно из 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¶
Существует несколько опций и других констант, доступных для потоков на основе 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, так как из-за потокового слоя трудно определить, какие данные окажутся в этом кадре. Кроме того, в настоящее время не существует способа получить эти данные через API Node.js.
Параметры компрессора¶
Существует несколько опций, которые могут быть установлены в кодировщиках Brotli и влияют на эффективность и скорость сжатия. Доступ к ключам и значениям можно получить как к свойствам объекта zlib.constants
.
Наиболее важными параметрами являются:
BROTLI_PARAM_MODE
BROTLI_MODE_GENERIC
(по умолчанию)BROTLI_MODE_TEXT
, адаптированный для текста UTF-8BROTLI_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_LARGE_MAX_WINDOW_BITS
, если установлен флагBROTLI_PARAM_LARGE_WINDOW
.
- Варьируется от
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" (не совместим с форматом Brotli, стандартизированным в RFC 7932).
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" (не совместим с форматом Brotli, стандартизированным в RFC 7932).
Класс: Options
.¶
Каждый класс на основе zlib принимает объект options
. Никакие параметры не являются обязательными.
Некоторые опции важны только при сжатии и игнорируются классами распаковки.
flush
<integer>
По умолчанию:zlib.constants.Z_NO_FLUSH
.finishFlush
<integer>
По умолчанию:zlib.constants.Z_FINISH
chunkSize
<integer>
По умолчанию:16 * 1024
windowBits
<integer>
level
<integer>
(только для сжатия)memLevel
<integer>
(только сжатие)стратегия
<integer>
(только сжатие)dictionary
{Buffer|TypedArray|DataView|ArrayBuffer} (только дефлат/инфлат, по умолчанию пустой словарь)info
<boolean>
(Еслиtrue
, возвращает объект сбуфером
идвигателем
).maxOutputLength
<integer>
Ограничивает размер вывода при использовании удобных методов. По умолчанию:buffer.kMaxLength
Дополнительную информацию см. в документации по deflateInit2
и inflateInit2
.
Класс: BrotliOptions
.¶
Каждый класс, основанный на Brotli, принимает объект options
. Все опции являются необязательными.
flush
<integer>
По умолчанию:zlib.constants.BROTLI_OPERATION_PROCESS
.finishFlush
<integer>
По умолчанию:zlib.constants.BROTLI_OPERATION_FINISH
chunkSize
<integer>
По умолчанию:16 * 1024
params
<Object>
Объект ключ-значение, содержащий индексированные параметры Brotli.maxOutputLength
<integer>
Ограничивает размер вывода при использовании удобных методов. По умолчанию:buffer.kMaxLength
.
Например:
1 2 3 4 5 6 7 8 9 10 11 |
|
Класс: zlib.BrotliCompress
.¶
Сжатие данных с помощью алгоритма Brotli.
Класс: zlib.BrotliDecompress
.¶
Декомпрессия данных с использованием алгоритма Brotli.
Класс: zlib.Deflate
.¶
Сжатие данных с помощью deflate.
Класс: zlib.DeflateRaw
.¶
Сжимает данные с помощью deflate и не добавляет заголовок zlib
.
Класс: zlib.Gunzip
¶
Декомпрессия потока gzip.
Класс: zlib.Gzip
¶
Сжатие данных с помощью gzip.
Класс: zlib.Inflate
.¶
Декомпрессия потока deflate.
Класс: zlib.InflateRaw
.¶
Декомпрессия необработанного потока deflate.
Класс: zlib.Unzip
¶
Распаковывает поток, сжатый Gzip- или Deflate, автоматически определяя заголовок.
Класс: zlib.ZlibBase
.¶
Не экспортируется модулем node:zlib
. Он документирован здесь, поскольку является базовым классом классов компрессора/декомпрессора.
Этот класс наследуется от stream.Transform
, что позволяет использовать объекты node:zlib
в трубах и подобных потоковых операциях.
zlib.bytesRead
.¶
Стабильность: 0 – устарело или набрало много негативных отзывов
Утратил актуальность: Вместо этого используйте zlib.bytesWritten
.
Утративший силу псевдоним для zlib.bytesWritten
. Это оригинальное название было выбрано потому, что оно также имело смысл для интерпретации значения как количества байт, прочитанных движком, но не согласуется с другими потоками в Node.js, которые предоставляют значения под этими именами.
zlib.bytesWritten
¶
Свойство zlib.bytesWritten
определяет количество байтов, записанных в движок, до обработки байтов (сжатия или распаковки, в зависимости от производного класса).
zlib.close([callback])
.¶
callback
<Function>
Закрыть базовый хэндл.
zlib.flush([kind, ]callback)
.¶
kind
По умолчанию:zlib.constants.Z_FULL_FLUSH
для потоков на основе zlib,zlib.constants.BROTLI_OPERATION_FLUSH
для потоков на основе Brotli-.callback
<Function>
Промыть ожидающие данные. Не вызывайте эту функцию легкомысленно, преждевременная очистка негативно влияет на эффективность алгоритма сжатия.
Вызов этой функции только очищает данные из внутреннего состояния zlib
и не выполняет никакой очистки на уровне потоков. Скорее, он ведет себя как обычный вызов .write()
, т.е. он будет поставлен в очередь за другими ожидающими записи и будет выдавать вывод только тогда, когда данные читаются из потока.
zlib.params(level, strategy, callback)
.¶
уровень
<integer>
стратегия
<integer>
callback
<Function>
Эта функция доступна только для потоков на основе zlib, т.е. не Brotli.
Динамически обновляет уровень сжатия и стратегию сжатия. Применимо только к алгоритму deflate.
zlib.reset()
¶
Сброс компрессора/декомпрессора к заводским настройкам по умолчанию. Применимо только к алгоритмам inflate и deflate.
zlib.constants
¶
Предоставляет объект, перечисляющий константы, связанные с Zlib.
zlib.createBrotliCompress([options])
¶
options
{brotli options}
Создает и возвращает новый объект BrotliCompress
.
zlib.createBrotliDecompress([options])
¶
options
{brotli options}
Создает и возвращает новый объект BrotliDecompress
.
zlib.createDeflate([options])
¶
options
{zlib options}
Создает и возвращает новый объект Deflate
.
zlib.createDeflateRaw([options])
¶
options
{zlib options}
Создает и возвращает новый объект DeflateRaw
.
Обновление zlib с 1.2.8 до 1.2.11 изменило поведение, когда windowBits
установлен на 8 для потоков raw deflate. zlib автоматически устанавливал windowBits
на 9, если изначально был установлен на 8. Более новые версии zlib выбрасывают исключение, поэтому Node.js восстановил оригинальное поведение обновления значения от 8 до 9, поскольку передача windowBits = 9
в zlib фактически приводит к сжатому потоку, который эффективно использует только 8-битное окно.
zlib.createGunzip([options])
¶
options
{zlib options}
Создает и возвращает новый объект Gunzip
.
zlib.createGzip([options])
¶
options
{zlib options}
Создает и возвращает новый объект Gzip
.
zlib.createInflate([options])
¶
options
{zlib options}
Создает и возвращает новый объект Inflate
.
zlib.createInflateRaw([options])
¶
options
{zlib options}
Создает и возвращает новый объект InflateRaw
.
zlib.createUnzip([options])
¶
options
{zlib options}
Создает и возвращает новый объект Unzip
.
Удобные методы¶
Все эти методы принимают Buffer
, TypedArray
, DataView
, ArrayBuffer
или строку в качестве первого аргумента, необязательный второй аргумент для предоставления опций классам zlib
и вызывают предоставленный обратный вызов с callback(error, result)
.
Каждый метод имеет аналог *Sync
, который принимает те же аргументы, но без обратного вызова.
zlib.brotliCompress(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{brotli options}callback
<Function>
zlib.brotliCompressSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{brotli options}
Сжатие фрагмента данных с помощью BrotliCompress
.
zlib.brotliDecompress(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{brotli options}callback
<Function>
zlib.brotliDecompressSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{brotli options}
Декомпрессия фрагмента данных с помощью BrotliDecompress
.
zlib.deflate(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.deflateSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Сжать фрагмент данных с помощью Deflate
.
zlib.deflateRaw(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.deflateRawSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Сжать фрагмент данных с помощью DeflateRaw
.
zlib.gunzip(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.gunzipSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Декомпрессия фрагмента данных с помощью Gunzip
.
zlib.gzip(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.gzipSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Сжать фрагмент данных с помощью Gzip
.
zlib.inflate(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.inflateSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Декомпрессия фрагмента данных с помощью Inflate
.
zlib.inflateRaw(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.inflateRawSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Декомпрессия фрагмента данных с помощью InflateRaw
.
zlib.unzip(buffer[, options], callback)
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}callback
<Function>
zlib.unzipSync(buffer[, options])
¶
buffer
{Buffer|TypedArray|DataView|ArrayBuffer|string}options
{zlib options}
Декомпрессия фрагмента данных с помощью Unzip
.