前端時(shí)間有同事問我node如何做gzip壓縮对人。 首先我們先來(lái)看下Header里面的Accept-Encoding呻纹。
Accept-Encoding
HTTP 請(qǐng)求頭 Accept-Encoding 會(huì)將客戶端能夠理解的內(nèi)容編碼方式——通常是某種壓縮算法——進(jìn)行通知(給服務(wù)端)搬男。
通過內(nèi)容協(xié)商的方式,服務(wù)端會(huì)選擇一個(gè)客戶端提議的方式,使用并在響應(yīng)頭 Content-Encoding 中通知客戶端該選擇。
上面這段話通俗點(diǎn)說(shuō)就是瀏覽器通過HTTP請(qǐng)求頭部里加上Accept-Encoding玫锋,告訴服務(wù)器,“你可以用gzip讼呢,或者defalte算法壓縮資源”撩鹿。
Accept-Encoding:gzip, deflate
然后服務(wù)器端壓縮后,在響應(yīng)頭Content-Encoding中返回用了那種算法悦屏。
Zlib
那么在node中如何采用gzip壓縮的节沦,答案就是zlib這個(gè)包。
我們來(lái)小試牛刀下:
壓縮
var fs = require('fs');
var zlib = require('zlib');
var gzip = zlib.createGzip();
var inFile = fs.createReadStream('./compress.txt');
var out = fs.createWriteStream('./compress.txt.gz');
inFile.pipe(gzip).pipe(out);
解壓縮
var fs = require('fs');
var zlib = require('zlib');
var gunzip = zlib.createGunzip();
var inFile = fs.createReadStream('./compress.txt.gz');
var outFile = fs.createWriteStream('./compress.txt');
inFile.pipe(gunzip).pipe(outFile);
服務(wù)端gzip
var http = require('http');
var zlib = require('zlib');
var fs = require('fs');
var filePath = './test.html';
var server = http.createServer(function(req, res){
var acceptEncoding = req.headers['accept-encoding'];
var gzip;
if(acceptEncoding.indexOf('gzip')!=-1){ // 判斷是否需要gzip壓縮
gzip = zlib.createGzip();
// 記得響應(yīng) Content-Encoding础爬,告訴瀏覽器:文件被 gzip 壓縮過
res.writeHead(200, {
'Content-Encoding': 'gzip'
});
fs.createReadStream(filePath).pipe(gzip).pipe(res);
}else{
fs.createReadStream(filePath).pipe(res);
}
});
server.listen('3000');
結(jié)果如圖:
服務(wù)器端壓縮字符串
var http = require('http');
var zlib = require('zlib');
var responseText = 'hello gzip';
var server = http.createServer(function(req, res){
var acceptEncoding = req.headers['accept-encoding'];
if(acceptEncoding.indexOf('gzip')!=-1){
res.writeHead(200, {
'content-encoding': 'gzip'
});
res.end( zlib.gzipSync(responseText) );
}else{
res.end(responseText);
}
});
server.listen('3000');
更多的壓縮算法請(qǐng)看官方文檔