多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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-encoding](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3) 和 [content-encoding](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11) 头。 **注意:这些例子只是极其简单地展示了基础的概念** 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#Advanced](http://zlib.net/manual.html#Advanced) 的 `deflateInit2` 和 `inflateInit2`。 ### 内存使用调优 来自 `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)。详见 [http://zlib.net/manual.html#Constants](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`