穩(wěn)定性: 3 - 文檔
可以通過以下方式訪問這個模塊:
var zlib = require('zlib');
這個模塊提供了對 Gzip/Gunzip, Deflate/Inflate, 和 DeflateRaw/InflateRaw 類的綁定。每個類都有相同的參數(shù)和可讀/寫的流。
壓縮/解壓縮一個文件,可以通過倒流(piping)一個 fs.ReadStream 到 zlib 流里來,再到一個 fs.fs.WriteStream.
var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');
inp.pipe(gzip).pipe(out);
一步壓縮/解壓縮數(shù)據(jù)可以通過一個簡便方法來實現(xiàn)。
var input = '.................................';
zlib.deflate(input, function(err, buffer) {
if (!err) {
console.log(buffer.toString('base64'));
}
});
var buffer = new Buffer('eJzT0yMAAGTvBe8=', 'base64');
zlib.unzip(buffer, function(err, buffer) {
if (!err) {
console.log(buffer.toString());
}
});
要在一個 HTTP 客戶端或服務(wù)器中使用這個模塊,可以在請求時使用 accept-encoding,響應(yīng)時使用 content-encoding 頭。
注意: 這些例子只是簡單展示了基本概念。 Zlib 編碼可能消耗非常大,并且結(jié)果可能要被緩存。更多使用 zlib 相關(guān)的速度/內(nèi)存/壓縮的權(quán)衡選擇細(xì)節(jié)參見后面的 Memory Usage Tuning。
// client request example
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
var request = http.get({ host: 'izs.me',
path: '/',
port: 80,
headers: { 'accept-encoding': 'gzip,deflate' } });
request.on('response', function(response) {
var output = fs.createWriteStream('izs.me_index.html');
switch (response.headers['content-encoding']) {
// or, just use zlib.createUnzip() to handle both cases
case 'gzip':
response.pipe(zlib.createGunzip()).pipe(output);
break;
case 'deflate':
response.pipe(zlib.createInflate()).pipe(output);
break;
默認(rèn):
response.pipe(output);
break;
}
});
// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
http.createServer(function(request, response) {
var raw = fs.createReadStream('index.html');
var acceptEncoding = request.headers['accept-encoding'];
if (!acceptEncoding) {
acceptEncoding = '';
}
// Note: this is not a conformant accept-encoding parser.
// See 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);
根據(jù)參數(shù) options 返回一個新的 Gzip 對象。
根據(jù)參數(shù) options 返回一個新的 Gunzip 對象。
根據(jù)參數(shù) options 返回一個新的 Deflate 對象。
根據(jù)參數(shù) options 返回一個新的 Inflate 對象。
根據(jù)參數(shù) options 返回一個新的 DeflateRaw 對象。
根據(jù)參數(shù) options 返回一個新的 InflateRaw 對象。
根據(jù)參數(shù) options 返回一個新的 Unzip 對象。
這個類未被 zlib 模塊導(dǎo)出。之所以寫在這,是因為這是壓縮/解壓縮類的基類。
參數(shù) kind 默認(rèn)為 zlib.Z_FULL_FLUSH。
刷入緩沖數(shù)據(jù)。不要輕易調(diào)用這個方法,過早的刷會對壓縮算法產(chǎn)生負(fù)面影響。
動態(tài)更新壓縮基本和壓縮策略。僅對 deflate 算法有效。
重置壓縮/解壓縮為默認(rèn)值。僅適用于 inflate 和 deflate 算法。
使用 gzip 壓縮數(shù)據(jù)。
使用 gzip 解壓縮數(shù)據(jù)。
使用 deflate 壓縮數(shù)據(jù)。
解壓縮 deflate 流。
使用 deflate 壓縮數(shù)據(jù),不需要拼接 zlib 頭。
解壓縮一個原始 deflate 流。
通過自動檢測頭解壓縮一個 Gzip- 或 Deflate-compressed 流。
所有的這些方法第一個參數(shù)為字符串或緩存,第二個可選參數(shù)可以供 zlib 類使用,回調(diào)函數(shù)為 callback(error, result)。
每個方法都有一個 *Sync 伴隨方法,它接收相同參數(shù),不過沒有回調(diào)。
使用 Deflate 壓縮一個字符串。
使用 DeflateRaw 壓縮一個字符串。
使用 Gzip 壓縮一個字符串。
使用 Gunzip 解壓縮一個原始的 Buffer。
使用 Inflate 解壓縮一個原始的 Buffer。
使用 InflateRaw 解壓縮一個原始的 Buffer。
使用 Unzip 解壓縮一個原始的 Buffer。
每個類都有一個選項對象。所有選項都是可選的。
注意:某些選項僅在壓縮時有用,解壓縮時會被忽略。
zlib.Z_NO_FLUSH)參見 deflateInit2 和 inflateInit2 的描述,它們位于http://zlib.net/manual.html#Advanced。
來自 zlib/zconf.h,修改為 node's 的用法:
deflate 的內(nèi)存需求(單位:字節(jié)):
(1 << (windowBits+2)) + (1 << (memLevel+9))
windowBits=15 的 128K 加 memLevel = 8 的 128K (缺省值),加其他對象的若干 KB。
例如,如果你想減少默認(rèn)的內(nèi)存需求(從 256K 減為 128k),設(shè)置選項:
{ windowBits: 14, memLevel: 7 }
當(dāng)然這通常會降低壓縮等級。
inflate 的內(nèi)存需求(單位:字節(jié)):
1 << windowBits
windowBits=15 (默認(rèn)值)32K 加其他對象的若干 KB。
這是除了內(nèi)部輸出緩沖外 chunkSize 的大小,缺省為 16K
影響 zlib 的壓縮速度最大因素為 level 壓縮級別。 level 越大,壓縮率越高,速度越慢,level 越小,壓縮率越小,速度會更快。
通常來說,使用更多的內(nèi)存選項,意味著 node 必須減少對 zlib 掉喲過,因為可以在一個 write 操作里可以處理更多的數(shù)據(jù)。所以,這是另一個影響速度和內(nèi)存使用率的因素,
所有常量定義在 zlib.h ,也定義在 require('zlib') 。
通常的操作,基本用不到這些常量。寫到文檔里是想你不會對他們的存在感到驚訝。這個章節(jié)基本都來自 zlib documentation。更多細(xì)節(jié)參見 http://zlib.net/manual.html#Constants。
允許 flush 的值:
zlib.Z_NO_FLUSHzlib.Z_PARTIAL_FLUSHzlib.Z_SYNC_FLUSHzlib.Z_FULL_FLUSHzlib.Z_FINISHzlib.Z_BLOCKzlib.Z_TREES壓縮/解壓縮函數(shù)的返回值。負(fù)數(shù)代表錯誤,正數(shù)代表特殊但正常的事件:
zlib.Z_OKzlib.Z_STREAM_ENDzlib.Z_NEED_DICTzlib.Z_ERRNOzlib.Z_STREAM_ERRORzlib.Z_DATA_ERRORzlib.Z_MEM_ERRORzlib.Z_BUF_ERRORzlib.Z_VERSION_ERROR壓縮級別:
zlib.Z_NO_COMPRESSIONzlib.Z_BEST_SPEEDzlib.Z_BEST_COMPRESSIONzlib.Z_DEFAULT_COMPRESSION壓縮策略:
zlib.Z_FILTEREDzlib.Z_HUFFMAN_ONLYzlib.Z_RLEzlib.Z_FIXEDzlib.Z_DEFAULT_STRATEGYdata_type 字段的可能值:
zlib.Z_BINARYzlib.Z_TEXTzlib.Z_ASCIIzlib.Z_UNKNOWNdeflate 的壓縮方法:
zlib.Z_DEFLATED初始化 zalloc, zfree, opaque:
zlib.Z_NULL