要獲取這個模塊,你可以通過:
var zlib = require('zlib');
它提供了Gzip/Gunzip,Deflate/Inflate和DeflateRaw/InflateRaw類的綁定。每個類都有相同的選項,并且都是可讀/可寫流。
可以通過將一個fs.ReadStream的數(shù)據(jù)導(dǎo)入一個zlib流,然后導(dǎo)入一個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ù)。
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é)果需要被緩存。更多關(guān)于速度/內(nèi)存/壓縮的權(quán)衡,請參閱下文的內(nèi)存使用調(diào)優(yōu)。
// 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;
default:
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ù)一個options,返回一個新的Gzip對象。
根據(jù)一個options,返回一個新的Gunzip對象。
根據(jù)一個options,返回一個新的Deflate對象。
根據(jù)一個options,返回一個新的Inflate對象。
根據(jù)一個options,返回一個新的DeflateRaw對象。
根據(jù)一個options,返回一個新的InflateRaw對象。
根據(jù)一個options,返回一個新的Unzip對象。
這個類未被zlib模塊暴露。它之所以會出現(xiàn)在這里,是因為它是compressor/decompressor類的基類。
kind默認為zlib.Z_FULL_FLUSH。
沖刷等待中的數(shù)據(jù)。不要輕率地調(diào)用這個方法,過早的沖刷會給壓縮算法帶來消極影響。
動態(tài)地更新壓縮等級和壓縮策略。只適用于deflate算法。
將compressor/decompressor重置為默認值。只使用于inflate和deflate算法。
使用gzip壓縮數(shù)據(jù)。
解壓一個gzip流。
使用deflate壓縮數(shù)據(jù)。
解壓一個deflate流。
使用deflate壓縮數(shù)據(jù),不添加zlib頭。
解壓一個原始deflate流。
通過自動探測頭信息,解壓Gzip或Deflate壓縮流。
所有的方法接受一個字符串或一個buffer作為第一個參數(shù),并且第二個參數(shù)是一個可選的 zlib類的配置,并且會以callback(error, result)的形式執(zhí)行提供的回調(diào)函數(shù)。
每一個方法都有一個同步版本,除去回調(diào)函數(shù),它們接受相同的參數(shù)。
使用Deflate壓縮一個字符串。
使用DeflateRaw壓縮一個字符串。
使用Gzip壓縮一個字符串。
使用Gunzip壓縮一個字符串。
使用Inflate壓縮一個字符串。
使用InflateRaw壓縮一個字符串。
使用Unzip壓縮一個字符串。
每一個類都接受一個options對象。所有的options對象都是可選的。
注意一些選項只與壓縮相關(guān),會被解壓縮類忽略:
zlib.Z_NO_FLUSH)16*1024)deflate/inflate,默認為空目錄)參閱http://zlib.net/manual.html#Advanced中deflateInit2和inflateInit2的描述來獲取更多信息。
來自zlib/zconf.h,將其修改為io.js的用法:
默認的內(nèi)存要求(字節(jié))為:
(1 << (windowBits+2)) + (1 << (memLevel+9))
換言之:windowBits=15的128 K 加上 menLevel = 8(默認值)的128 K 加上其他小對象的一些字節(jié)。
例子,如果你想要將默認內(nèi)存需求從256 K減少至128 K,將選項設(shè)置為:
{ windowBits: 14, memLevel: 7 }
當然,它會降低壓縮等級(沒有免費的午餐)。
inflate的內(nèi)存需求(字節(jié))為:
1 << windowBits
換言之:windowBits=15(默認值)的32 K 加上其他小對象的一些字節(jié)。
這是內(nèi)部輸出緩沖外的chunkSize大小,默認為16 K。
zlib壓縮的速度動態(tài)得受設(shè)置的壓縮等級的影響。高的等級會帶來更好地壓縮效果,但是花費的時間更長。低的等級會帶來更少的壓縮效果,但是更快。
通常,更高的內(nèi)存使用選項意味著io.js會調(diào)用zlib更少次數(shù),因為在一次單獨的寫操作中它可以處理更多的數(shù)據(jù)。所以,這是影響速度和內(nèi)存占用的另一個因素。
所有在zlib.h中定義的常量,都也被定義在了require('zlib')中。大多數(shù)操作中,你都將不會用到它們。它們出現(xiàn)在這里只是為了讓你對它們的存在不套感到驚訝。該章節(jié)幾乎完全來自zlib文件。更多詳情請參閱http://zlib.net/manual.html#Constants。
允許的沖刷值:
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
compression/decompression函數(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
壓縮等級:
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