知识共享许可协议
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。

Node.js v4.2.4 手册 & 文档


Zlib#

稳定度: 3 - 稳定

你可以这样引入此模块:

var zlib = require('zlib');

这个模块提供了对Gzip/Gunzip, Deflate/Inflate和DeflateRaw/InflateRaw类的绑定。每一个类都可以接收相同的选项,并且本身也是一个可读写的Stream类。

例子#

压缩或解压缩一个文件可以通过导流一个 fs.ReadStream 到一个 zlib 流,然后到一个 fs.WriteStream 来完成。

inp.pipe(gzip).pipe(out);

一步压缩或解压缩数据可以通过快捷方法来完成。

var buffer = new Buffer('eJzT0yMAAGTvBe8=', 'base64');
zlib.unzip(buffer, function(err, buffer) {
  if (!err) {
    console.log(buffer.toString());
  }
});

要在 HTTP 客户端或服务器中使用此模块,请在请求和响应中使用 accept-encodingcontent-encoding 头。

注意:这些例子只是极其简单地展示了基础的概念 Zlib 编码消耗非常大,结果需要缓存.看下面的内存调优 中更多的关于Zlib用法中 速度/内存/压缩 的权衡取舍。

  // 注意: 这不是一个不合格的 accept-encoding 解析器
  // 详见 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);

zlib.createGzip([options])#

options 所给选项返回一个新的 Gzip 对象。

zlib.createGunzip([options])#

options 所给选项返回一个新的 Gunzip 对象。

zlib.createDeflate([options])#

options 所给选项返回一个新的 Deflate 对象。

zlib.createInflate([options])#

options 所给选项返回一个新的 Inflate 对象。

zlib.createDeflateRaw([options])#

options 所给选项返回一个新的 DeflateRaw 对象。

zlib.createInflateRaw([options])#

options 所给选项返回一个新的 InflateRaw 对象。

zlib.createUnzip([options])#

options 所给选项返回一个新的 Unzip 对象。

类: zlib.Zlib#

这个类未被 zlib 模块导出,编入此文档是因为它是其它压缩器/解压缩器的基类。

zlib.flush([kind], callback)#

kind 缺省为 zlib.Z_FULL_FLUSH

写入缓冲数据。请勿轻易调用此方法,过早的写入会对压缩算法的作用产生影响。

zlib.params(level, strategy, callback)#

动态更新压缩级别和压缩策略。仅对 deflate 算法有效。

zlib.reset()#

将压缩器/解压缩器重置为缺省值。仅对 inflate 和 deflate 算法有效。

类: zlib.Gzip#

使用 gzip 压缩数据。

类: zlib.Gunzip#

解压缩一个 gzip 流。

类: zlib.Deflate#

使用 deflate 压缩数据。

类: zlib.Inflate#

解压缩一个 deflate 流。

类: zlib.DeflateRaw#

使用 deflate 压缩数据,并且不附带 zlib 头。

类: zlib.InflateRaw#

解压缩一个原始 deflate 流。

类: zlib.Unzip#

自动识别头部来解压缩一个以 gzip 或 deflate 压缩的流。

快捷方法#

所有这些方法的第一个参数都可以是字符串或 Buffer;可选地可以将传给 zlib 类的选项作为第二个参数传入;回调格式为 callback(error, result)

zlib.deflate(buf, [options], callback)#

使用 Deflate 压缩一个字符串。

zlib.deflateRaw(buf, [options], callback)#

使用 DeflateRaw 压缩一个字符串。

zlib.Gzip(buf, [options], callback)#

使用 Gzip 压缩一个字符串。

zlib.gunzip(buf, [options], callback)#

使用 Gunzip 解压缩一个原始的 Buffer。

zlib.inflate(buf, [options], callback)#

使用 Inflate 解压缩一个原始的 Buffer。

zlib.inflateRaw(buf, [options], callback)#

使用 InflateRaw 解压缩一个原始的 Buffer。

zlib.unzip(buf, [options], callback)#

使用 Unzip 解压缩一个原始的 Buffer。

选项#

各个类都有一个选项对象。所有选项都是可选的。

请注意有些选项仅对压缩有效,并会被解压缩类所忽略。

  • flush(缺省:zlib.Z_NO_FLUSH
  • chunkSize(缺省:16*1024)
  • windowBits
  • level(仅用于压缩)
  • memLevel(仅用于压缩)
  • strategy(仅用于压缩)
  • dictionary(仅用于 deflate/inflate,缺省为空目录)

详情请参阅 http://zlib.net/manual.html#AdvanceddeflateInit2inflateInit2

内存使用调优#

来自 zlib/zconf.h,修改为 node 的用法:

deflate 的内存需求(按字节):

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

表示:windowBits = 15 的 128K + memLevel = 8 的 128K(缺省值)加上其它对象的若干 KB。

举个例子,如果您需要将缺省内存需求从 256K 减少到 128K,设置选项:

{ windowBits: 14, memLevel: 7 }

当然这通常会降低压缩等级(天底下没有免费午餐)。

inflate 的内存需求(按字节):

1 << windowBits

表示 windowBits = 15(缺省值)的 32K 加上其它对象的若干 KB。

这是除了内部输出缓冲外 chunkSize 的大小,缺省为 16K。

zlib 压缩的速度主要受压缩级别 level 的影响。更高的压缩级别会有更好的压缩率,但也要花费更长时间。更低的压缩级别会有较低压缩率,但速度更快。

通常,使用更多内存的选项意味着 node 能减少对 zlib 的调用,因为单次 write操作能处理更多数据。因此,这是另一个影响速度和内存占用的因素。

常量#

所有在 zlib.h 中定义的常量同样也定义在 require('zlib') 中。 在通常情况下您几乎不会用到它们,编入文档只是为了让您不会对它们的存在感到惊讶。该章节几乎完全来自 zlib 的文档。详见 http://zlib.net/manual.html#Constants

允许的 flush 取值。

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

压缩/解压缩函数的返回值。负数代表错误,正数代表特殊但正常的事件。

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

压缩级别。

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

压缩策略。

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

data_type 字段的可能值。

  • zlib.Z_BINARY
  • zlib.Z_TEXT
  • zlib.Z_ASCII
  • zlib.Z_UNKNOWN

deflate 压缩方法(该版本仅支持一种)。

  • zlib.Z_DEFLATED

初始化 zalloc/zfree/opaque。

  • zlib.Z_NULL