美文网首页
Node-gzip压缩

Node-gzip压缩

作者: 辻子路 | 来源:发表于2020-04-02 10:17 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Node-gzip压缩

          本文链接:https://www.haomeiwen.com/subject/wamtphtx.html