前端时间有同事问我node如何做gzip压缩。 首先我们先来看下Header里面的Accept-Encoding。
Accept-Encoding
HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。
通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding 中通知客户端该选择。
上面这段话通俗点说就是浏览器通过HTTP请求头部里加上Accept-Encoding,告诉服务器,“你可以用gzip,或者defalte算法压缩资源”。
Accept-Encoding:gzip, deflate
然后服务器端压缩后,在响应头Content-Encoding中返回用了那种算法。
Zlib
那么在node中如何采用gzip压缩的,答案就是zlib这个包。
我们来小试牛刀下:
压缩
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);
服务端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();
// 记得响应 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');
结果如图:
服务器端压缩字符串
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');
更多的压缩算法请看官方文档
网友评论