# 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`