要獲取這個模塊,你可以通過:
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
的128K 加上 menLevel = 8
(默認值)的128K 加上其他小對象的一些字節(jié)。
例子,如果你想要將默認內(nèi)存需求從256K減少至128K,將選項設(shè)置為:
{ windowBits: 14, memLevel: 7 }
當(dāng)然,它會降低壓縮等級(沒有免費的午餐)。
inflate
的內(nèi)存需求(字節(jié))為:
1 << windowBits
換言之:windowBits=15
(默認值)的32K加上其他小對象的一些字節(jié)。
這是內(nèi)部輸出緩沖外的chunkSize
大小,默認為16K。
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
壓縮方法(當(dāng)前版本只支持這一個):
zlib.Z_DEFLATED
用于初始化zalloc
,zfree
,opaque
:
zlib.Z_NULL
更多建議: