穩(wěn)定性: 3 - 文檔
可以通過(guò)以下方式訪問(wèn)這個(gè)模塊:
var zlib = require('zlib');
這個(gè)模塊提供了對(duì) Gzip/Gunzip, Deflate/Inflate, 和 DeflateRaw/InflateRaw 類(lèi)的綁定。每個(gè)類(lèi)都有相同的參數(shù)和可讀/寫(xiě)的流。
壓縮/解壓縮一個(gè)文件,可以通過(guò)倒流(piping)一個(gè) fs.ReadStream 到 zlib 流里來(lái),再到一個(gè) 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ù)可以通過(guò)一個(gè)簡(jiǎn)便方法來(lái)實(shí)現(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());
}
});
要在一個(gè) HTTP 客戶端或服務(wù)器中使用這個(gè)模塊,可以在請(qǐng)求時(shí)使用 accept-encoding,響應(yīng)時(shí)使用 content-encoding 頭。
注意: 這些例子只是簡(jiǎn)單展示了基本概念。 Zlib 編碼可能消耗非常大,并且結(jié)果可能要被緩存。更多使用 zlib 相關(guān)的速度/內(nèi)存/壓縮的權(quán)衡選擇細(xì)節(jié)參見(jiàn)后面的 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 返回一個(gè)新的 Gzip 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 Gunzip 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 Deflate 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 Inflate 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 DeflateRaw 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 InflateRaw 對(duì)象。
根據(jù)參數(shù) options 返回一個(gè)新的 Unzip 對(duì)象。
這個(gè)類(lèi)未被 zlib
模塊導(dǎo)出。之所以寫(xiě)在這,是因?yàn)檫@是壓縮/解壓縮類(lèi)的基類(lèi)。
參數(shù) kind
默認(rèn)為 zlib.Z_FULL_FLUSH
。
刷入緩沖數(shù)據(jù)。不要輕易調(diào)用這個(gè)方法,過(guò)早的刷會(huì)對(duì)壓縮算法產(chǎn)生負(fù)面影響。
動(dòng)態(tài)更新壓縮基本和壓縮策略。僅對(duì) deflate 算法有效。
重置壓縮/解壓縮為默認(rèn)值。僅適用于 inflate 和 deflate 算法。
使用 gzip 壓縮數(shù)據(jù)。
使用 gzip 解壓縮數(shù)據(jù)。
使用 deflate 壓縮數(shù)據(jù)。
解壓縮 deflate 流。
使用 deflate 壓縮數(shù)據(jù),不需要拼接 zlib 頭。
解壓縮一個(gè)原始 deflate 流。
通過(guò)自動(dòng)檢測(cè)頭解壓縮一個(gè) Gzip- 或 Deflate-compressed 流。
所有的這些方法第一個(gè)參數(shù)為字符串或緩存,第二個(gè)可選參數(shù)可以供 zlib 類(lèi)使用,回調(diào)函數(shù)為 callback(error, result)
。
每個(gè)方法都有一個(gè) *Sync
伴隨方法,它接收相同參數(shù),不過(guò)沒(méi)有回調(diào)。
使用 Deflate 壓縮一個(gè)字符串。
使用 DeflateRaw 壓縮一個(gè)字符串。
使用 Gzip 壓縮一個(gè)字符串。
使用 Gunzip 解壓縮一個(gè)原始的 Buffer。
使用 Inflate 解壓縮一個(gè)原始的 Buffer。
使用 InflateRaw 解壓縮一個(gè)原始的 Buffer。
使用 Unzip 解壓縮一個(gè)原始的 Buffer。
每個(gè)類(lèi)都有一個(gè)選項(xiàng)對(duì)象。所有選項(xiàng)都是可選的。
注意:某些選項(xiàng)僅在壓縮時(shí)有用,解壓縮時(shí)會(huì)被忽略。
zlib.Z_NO_FLUSH
)參見(jiàn) deflateInit2
和 inflateInit2
的描述,它們位于http://zlib.net/manual.html#Advanced。
來(lái)自 zlib/zconf.h
,修改為 node's 的用法:
deflate 的內(nèi)存需求(單位:字節(jié)):
(1 << (windowBits+2)) + (1 << (memLevel+9))
windowBits=15 的 128K 加 memLevel = 8 的 128K (缺省值),加其他對(duì)象的若干 KB。
例如,如果你想減少默認(rèn)的內(nèi)存需求(從 256K 減為 128k),設(shè)置選項(xiàng):
{ windowBits: 14, memLevel: 7 }
當(dāng)然這通常會(huì)降低壓縮等級(jí)。
inflate 的內(nèi)存需求(單位:字節(jié)):
1 << windowBits
windowBits=15 (默認(rèn)值)32K 加其他對(duì)象的若干 KB。
這是除了內(nèi)部輸出緩沖外 chunkSize 的大小,缺省為 16K
影響 zlib 的壓縮速度最大因素為 level
壓縮級(jí)別。 level
越大,壓縮率越高,速度越慢,level
越小,壓縮率越小,速度會(huì)更快。
通常來(lái)說(shuō),使用更多的內(nèi)存選項(xiàng),意味著 node 必須減少對(duì) zlib 掉喲過(guò),因?yàn)榭梢栽谝粋€(gè) write
操作里可以處理更多的數(shù)據(jù)。所以,這是另一個(gè)影響速度和內(nèi)存使用率的因素,
所有常量定義在 zlib.h ,也定義在 require('zlib')
。
通常的操作,基本用不到這些常量。寫(xiě)到文檔里是想你不會(huì)對(duì)他們的存在感到驚訝。這個(gè)章節(jié)基本都來(lái)自 zlib documentation。更多細(xì)節(jié)參見(jiàn) 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
壓縮/解壓縮函數(shù)的返回值。負(fù)數(shù)代表錯(cuò)誤,正數(shù)代表特殊但正常的事件:
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
壓縮級(jí)別:
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