Node-内置模块:zlib 压缩

目录

  • 概述
  • 压缩和解压
  • 示例

1、概述

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

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

在 node.js 中,对资源进行压缩的模块是 zlib

2、压缩和解压

zlib 模块中提供了两种压缩的算法:gzipdeflate

2.1 压缩的例子

var fs = require('fs');
var zlib = require('zlib');

var gzip = zlib.createGzip();
var deflate = zlib.createDeflate();

var inFile = fs.createReadStream('./extra/fileForCompress.txt');
var out = fs.createWriteStream('./extra/fileForCompress.txt.gz');

inFile.pipe(gzip).pipe(out);
inFile.pipe(deflate).pipe(out);

2.2 解压的例子

var fs = require('fs');
var zlib = require('zlib');

var gunzip = zlib.createGunzip();
var inflate = zlib.createInflate();

var inFile = fs.createReadStream('./extra/fileForCompress.txt.gz');
var outFile = fs.createWriteStream('./extra/fileForCompress1.txt');

inFile.pipe(gunzip).pipe(outFile);
inFile.pipe(inflate).pipe(outFile);

3、示例

示例分为客户端和服务端,在客户端需要将收到的数据进行解压,而且服务端则需要将数据进行压缩之后传给客户端。

const zlib = require('zlib');
const fs = require('fs');
const http = require('http');

// 客户端示例
const request = http.get({
    host: 'example.com',
    path: '/',
    port: 80,
    headers: {'Accept-Encoding': 'gzip,deflate'}
});

request.on('response', response => {
    const output = fs.createWriteStream('example.com_index.html');
    switch (response.headers['content-encoding']) {
        case 'gzip':
            response.pipe(zlib.createGunzip()).pipe(output);
            break;
        case 'deflate':
            response.pipe(zlib.createInflate()).pipe(output);
            break;
        default:
            response.pipe(output);
            break;
    }
});


//服务端的示例。压缩资源给response,必须得判断request的请求头中能够接受的encoding类型
http.createServer((request, response) => {
    const raw = fs.createReadStream('index.html');
    let acceptEncoding = request.headers['accept-encoding'];
    if(!acceptEncoding){
        acceptEncoding = '';
    }
    // 判断acceptEncoding的类型
    if (/\bdeflate\b/.test(acceptEncoding)) {
        response.writeHead(200, {'Content-Encoding': 'deflate'});
        raw.pipe(zlib.createDeflate()).pipe(response);
    } else if (/\bgzip\b/.test(acceptEncoding)) {
        response.writeHead(200, {'Content-Encoding': 'gzip'});
        raw.pipe(zlib.createGzip()).pipe(response);
    } else {
        response.writeHead(200, {});
        raw.pipe(response);
    }
}).listen(3000);

参考资料

Node基础:资源压缩之zlib

Node.js 官方文档:zlib 压缩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值