Node内置模块 【压缩zlib模块】

简介: Node内置模块 【压缩zlib模块】

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node内置模块 压缩zlib模块 ;让我们一起来看看吧🤘


🌟zlib模块

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。


zlib是一个免费、通用、不受任何法律阻碍的、无损的数据压缩开发库,而且还是跨平台的。这意味着任何人都可以修改、使用而无需交纳任何费用。ZLib具有同winzip和winrar等商业软件相比毫不逊色的压缩率,已经成功应用在诸如MySQL、Java、3DMax、甚至是微软的DirectX等大型的系统中。目前Z1ib的最新版本是1.2.3。


DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。


🌟关于gzip与deflate

deflate(RFC1951)是一种压缩算法,使用LZ77和哈弗曼进行编码。gzip(RFC1952)一种压缩格式,是对deflate的简单封装,gzip = gzip头(10字节) + deflate编码的实际内容 + gzip尾(8字节)。在HTTP传输中,gzip是一种常用的压缩算法,使用gzip压缩的HTTP数据流,会在HTTP头中使用Content-Encoding:gzip进行标识。


🌟使用zlib

zlib模块提供Gzip和Deflate / Inflate方式来实现压缩功能。使用以下方式访问:

1685513406284.png🌟压缩与解压缩

🌟案例:压缩

var fs = require("fs");
var zlib = require("zlib");
var gzip = zlib.createGzip();
var inFile = fs.createReadStream("./test.txt");
var outFile = fs.createWriteStream("./test.txt.gz");
inFile.pipe(gzip).pipe(outFile);

🌟案例:解压缩

var fs = require("fs");
var zlib = require("zlib");
var Gunzip = zlib.createGunzip();
var inFile = fs.createReadStream("./test.txt.gz");
var outFile = fs.createWriteStream("./test2.txt");
inFile.pipe(Gunzip).pipe(outFile);

🌟服务端gzip压缩

为了减少网络传输数据量,http传输过程中会采用通用的压缩算法来压缩数据,gzip属于最常用的压缩算法。


浏览器向服务器发起资源请求,比如下载一个js文件,服务器先对资源进行压缩,再返回给浏览器,以此节省流量,加快访问速度。


🌟HTTP配置

🌟HTTP请求中添加Accept-Encoding字段

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


Accept-Encoding:gzip, deflate

🌟HTTP响应中添加Content-Encoding字段

在HTTP响应中添加Content-Encoding,告诉浏览器:文件被 gzip 压缩过。

res.writeHead(200, {
    'Content-Encoding': 'gzip'
});

🌟示例代码

开发逻辑:

判断HTTP请求头是否包含 accept-encoding 字段,且值为gzip。

否:返回未压缩的文件。

是:返回gzip压缩后的文件。

var zlib = require("zlib");
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
    var acceptEncoding = req.headers['accept-encoding'];
    var inFile = fs.createReadStream('./test.html');
    if(acceptEncoding.indexOf('gzip') !=-1){
        //响应头添加 Content-Encoding 字段,告诉浏览器 服务器端使用gzip压缩
        res.writeHead(200,{
            'Content-Encoding': 'gzip'
        });
        inFile.pipe(zlib.createGzip()).pipe(res);
    }else if(acceptEncoding.indexOf('deflate') !=-1){
        res.writeHead(200,{
            'Content-Encoding': 'deflate'
        });
        inFile.pipe(zlib.createInflate()).pipe(res);
    }else{
        inFile.pipe(res);
    }
});
server.listen(8080)

🌟服务端字符串gzip压缩

采用slib.gzipSync(str)对字符串进行gzip压缩。

var http = require('http');
var zlib = require('zlib');
var responseText = 'hello world';
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知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

目录
相关文章
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
31 0
|
14天前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
15天前
|
缓存 JavaScript 前端开发
Node.js的模块系统:CommonJS模块系统的使用
【4月更文挑战第29天】Node.js采用CommonJS作为模块系统,每个文件视为独立模块,通过`module.exports`导出和`require`引入实现依赖。模块有独立作用域,保证封装性,防止命名冲突。引入的模块会被缓存,提高加载效率并确保一致性。利用CommonJS,开发者能编写更模块化、可维护的代码。
|
29天前
|
JavaScript API
node.js之模块系统
node.js之模块系统
|
1月前
|
Web App开发 JavaScript 前端开发
【Node系列】node核心模块util
Node.js的核心模块util为开发者提供了一些常用的实用工具函数。这些函数能够很方便地进行对象的继承、类型判断以及其他工具函数的实现。
22 2
|
1月前
|
域名解析 网络协议 JavaScript
【Node系列】node工具模块
Node.js有多个内置的工具模块,这些模块提供了用于执行各种任务的功能。
26 2
|
1月前
|
缓存 并行计算 JavaScript
【Node系列】模块系统
Node.js 的模块系统是其核心特性之一,允许开发者编写可复用的代码,并通过简单的导入和导出机制来共享和使用这些模块。
21 3
|
2月前
|
JavaScript 前端开发
Node.js之path路径模块
Node.js之path路径模块
|
2月前
|
JavaScript
Node.js之http模块
Node.js之http模块
|
3月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
36 0