Node之文件压缩模块-zlib

原文地址

简介

做过web性能优化的同学,对性能优化大杀器gzip应该不陌生。浏览器向服务器发起资源请求,比如下载一个js文件,服务器先对资源进行压缩,再返回给浏览器,以此节省流量,加快访问速度。

浏览器通过HTTP请求头部里加上Accept-Encoding,告诉服务器,“你可以用gzip,或者defalte算法压缩资源”。

Accept-Encoding:gzip, deflate

入门实例:简单的压缩/解压缩

压缩的例子

--非常简单的几行代码,就完成了本地文件的gzip压缩。

let fs = require('fs')
let zlib = require('zlib')

let gzip = zlib.createGzip()

let inFile = fs.createReadStream('./1.zlib.md')
let outFile = fs.createWriteStream('./1.zlib.md.gz')

inFile.pipe(gzip).pipe(outFile)

解压的例子

同样非常简单,就是个反向操作。

let fs = require('fs')
let zlib = require('zlib')

let gunzip = zlib.createGunzip()

let inFile = fs.createReadStream('./1.zlib.md.gz')
let outFile = fs.createWrieStream('./1.zlib.md')

inFile.pipe(gunzip).pipe(outFile)

服务端gzip压缩

代码超级简单。首先判断 是否包含 accept-encoding 首部,且值为gzip。

  • 否:返回未压缩的文件。
  • 是:返回gzip压缩后的文件。
  let http = require('http')
  let zlib = require('zlib')
  let fs = require('fs')

  let server = http.createServer((req, res) => {
    let acceptEncoding = req.headers['accept-encoding'];
    var gzip;
    // 判断是否需要gzip压缩
    if(acceptEncoding.indexOf('gzip') != -1) {
      gzip = zlib.createGzip();
      // 记得响应 Content-Encoding,告诉浏览器:文件被 gzip 压缩过
      res.writeHead(200, {
        'content-encoding': 'gzip'
      });
      fs.createReadStream(fllepath).pipe(gzip).pipe(res)
    } else {
      fs.createReadStream(filePath).pipe(res)
    }
  })

  server.listen('3000')

服务端字符串gzip压缩

代码跟前面例子大同小异。这里采用了 zlib.gzipSync(str) 对字符串进行gzip压缩。

let http = require('http');
let zlib = require('zlib');

let responseText = 'hello world';

let server = http.createServer(function(req, res){
    let  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');
posted @ 2019-03-11 00:53  今晚打老虎i2016  阅读(943)  评论(0编辑  收藏  举报