Node中的gzip压缩

Node中的gzip压缩

四月 02, 2020

前端时间有同事问我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');  

更多的压缩算法请看官方文档