?? NodeJS专栏:Node.js从入门到精通
?? 博主的前端之路:前端之行,任重道远(来自大三学长的万字自述)
?? 加入社区领红包:(从前端到全栈)
???个人简介:即将大三的学生,一个不甘平庸的平凡人??
?? 你的一键三连是我更新的最大动力!
??分享博主自用牛客网??:一个非常全面的面试刷题求职网站,真的超级好用(点击跳转)??


?? 文章目录

  • ?? 前言
  • ?? 什么是gzip?
  • ?? gzip和zlib什么关系?
  • ?? 普通数据传输
  • ?? gzip压缩数据传输
  • ?? 结语

?? 前言

最近博主一直在牛客网刷题巩固基础知识,快来和我一起冲关升级吧!点击进入牛客网

任何服务端开发都少不了性能优化的操作,在前后端使用HTTP接口(API)进行数据传递时,如果传递数据量太大,势必会造成请求超时或失败。

nodejs为我们提供了一个zlib内置模块,我们可以使用它其中的gzip方法来对传递的数据进行压缩,从而提高数据传递效率。

?? 什么是gzip?

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术

这一般是指服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来,一般对纯文本内容可压缩到原大小的40%

这样传输就快了,效果就是你点击网址后数据会很快的显示出来,提高用户体验,当然这也会增加服务器的负载.,一般服务器中都安装有这个功能模块

减少文件大小有两个明显的好处:

  • 一是可以减少存储空间
  • 二是通过网络传输文件时,可以减少传输的时间

我们在进行本地数据传递时,如果一个文件太大我们经常会使用到文件压缩技术(zip或rar等),将大文件压缩成小文件进行传递,接收者再进行解压即可,因为压缩的速度一般是比较快的,这样就能减少文件传输过程中的时间,从而提高效率

简单来说,gzip其实就是一种用于服务端(后端)和客户端(前端)之间压缩数据的一种方法

?? gzip和zlib什么关系?

zlibDEFLATE算法的实现库,它的API同时支持gzip文件格式以及一个简化的数据流格式

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

gzipHTTP压缩,一种在万维网中加速传输HTML和其他内容的技术

所以可以说zlib是在gzip的基础上增加了一些内容,这也是为什么nodegzip方法是在zlib内置模块中的原因

?? 普通数据传输

我们使用node搭建一个服务器,来演示我们传递数据的普通方式:

server.js

const http = require("http");
const fs = require("fs");http.createServer((req, res) => {res.writeHead(200, {"Content-Type": "text/html;charset=utf-8",});const readStream = fs.createReadStream("./index.html");// res本质就是一个可写流readStream.pipe(res);
}).listen(3000, () => {console.log("服务器启动啦!");
});

这是一个简单的node服务器,浏览器访问它后,它会向我们返回一个index.html,这个index.html里的内容大家随便写,写的越多越好

这里也使用到了上一节我们讲过的内置模块fs中的stream流,需要注意的是,在node服务器中的res参数本质是一个可写流,所以我们才能直接将res用于pipe管道中

如果你对node搭建服务器或者内置模块fsstream流不太了解的话,可以看我先前的文章:
Node.js | 搭建后端服务器(含内置模块 http | url | querystring 的使用)
Node.js | 操作本地文件 — 玩转 fs 内置模块

运行server.js文件,使用浏览器访问node服务器:

可以看到我这里传递的数据大小是97.6kb(这取决于你的index.html的内容)

?? gzip压缩数据传输

我们使用gzip来改造一下上面普通数据传输的例子:

server.js

const http = require("http");
const fs = require("fs");
// 导入内置模块zlib
const zlib = require("zlib");
// 获取gzip方法
const gzip = zlib.createGzip();
http.createServer((req, res) => {res.writeHead(200, {"Content-Type": "text/html;charset=utf-8","Content-Encoding": "gzip", // 告诉浏览器我们是通过gzip压缩的});const readStream = fs.createReadStream("./index.html");// res本质就是一个可写流// 在数据返回之前使用gzip压缩数据readStream.pipe(gzip).pipe(res);
}).listen(3000, () => {console.log("服务器启动啦!");
});

先引入zlib内置模块,再使用zlib.createGzip()获取gzip方法,这个gzip方法实际也是一种数据流的格式,与node服务器中的res参数一样,这也是pipe管道中能直接使用gzip的原因

我们在将数据传递给res参数(客户端)之前,通过pipe管道的链式调用,将gzip加上

这样readStream(服务端)的数据会先经过gzip压缩,之后才会传递给res参数(客户端)

需要注意的是:

http数据压缩的方式不止有gzip,还有其它的压缩方式,只不过gzip是最常见最常用的一种方式

所以我们服务端使用gzip将数据压缩后传递给浏览器时,浏览器并不知道我们是使用哪种方式压缩的数据,于是就不知道该以哪种方式进行解压,所以我们需要手动明确的告诉浏览器我们使用的是gzip,服务端加上以下响应头即可:

"Content-Encoding": "gzip", // 告诉浏览器我们是通过gzip压缩的

这样浏览器就能够正确解压我们传递的数据了,运行上面的server.js,打开浏览器访问我们的node服务器:

可以看到使用gzip压缩后我这里传递的数据大小只有27.5kb(这取决于你的index.html的内容),这与之前的97.6kb相比,数据传输速率大幅提升,这就是我们使用gzip的意义!

?? 结语

这篇文章讲了node的一个非常实用的小模块zlibzlib大家可能之前没听过,但gzip应该都曾听过,gzip是请求数据传输性能优化的一种很好的方式,看完本篇文章,相信你会对gzip有了更深的理解

关于node.js的更多内容请移步我的node.js专栏:Node.js从入门到精通

如果本篇文章对你有所帮助,还请客官一件四连!

基础不牢,地动山摇! 快来和博主一起来牛客网刷题巩固基础知识吧!

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

Node.js 使用 zlib 内置模块进行 gzip 压缩相关推荐

  1. Node.js | 使用 zlib 内置模块进行 gzip 压缩

  2. node.js实现文件和数据的压缩与解压缩

    在web性能优化的时候,经常会使用到压缩神器gzip.当客户端(浏览器)向服务端发起资源请求时,服务器首先会对比较大的资源进行压缩,然后再返回给客户端,以此加快资源的访问速度. 下面来看压缩和解压缩的 ...

  3. 基于Node.js实现压缩和解压缩的方法

    本篇文章主要介绍了基于Node.js实现压缩和解压缩的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当 ...

  4. PHP网站开启gzip压缩,php中开启gzip压缩的2种方法代码

    Gzip网页压缩可以大幅度提升网站访问速度,对于网站在国外的站来说,这是必不可少的一步,提升网页打开速度非常明显,现在我们就系统的来认识一下这个Gzip的庐山真面目. 一.何为GZIP GZIP概念 ...

  5. Node.js 从门详解 (二)

    目录 1. 模块化的基本概念 1.1 什么是模块化 1.2 模块化规范 2. Node.js 中模块化 2.1 Node.js 中模块的分类 2.2 加载模块 2.3 Node.js中的模块作用域 2 ...

  6. Node.js 文档(目录)

    Node.js 文档 Node.js®是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时. 提供以下几种类型的文档: API参考文档 ES6功能 指南 API参考文档 ...

  7. Node.js学习笔记——模块加载机制及npm指令详解

    文章目录 二.模块化 1.模块化的基本概念 2.Node.js 中的模块化 Node.js 中模块的分类 加载模块 Node.js 中的模块作用域 向外共享模块作用域中的成员 Node.js 中的模块 ...

  8. 万字长文--详解Node.js(快速入门)

    Node.js基础与扩展 Node.js 1.初识Node.js与内置模块 1.1 Node.js初识 1.2 fs文件系统模块 1.3 path路径模块 1.4 http模块 2.模块化 2.1 模 ...

  9. Node.js基础(二)-- 模块化、npm与包

    1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程.对于整个系统来说,模块是可组合.分解和更换的单元. 1.1.1. 现实生活中的模块化 ...

最新文章

  1. Linux下使用SSH、Crontab、Rsync三工具实现数据自动备份
  2. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
  3. java入门的注意点_Java基础之Integer使用的注意事项及面试题
  4. 数据科学之:消费者资产分析
  5. 语音合成论文与韩国小哥“撞车”后续:英伟达“赶紧”把代码开源了
  6. spark+phoenix
  7. WIN7安装FreeSwitch,1.8版本无法安装,1.6版本成功
  8. 【FinE】EMD/EEMD方法及金融数据分解
  9. 一行代码统计文本中指定字符串出现的次数
  10. MathType公式编辑器试用期到了怎么办?
  11. windowsXPsp3恢复桌面IE图标
  12. 工业大数据:中国智造下的“数字新基建”
  13. ad网络标号设置经验_AD9 设置网络标号作用域
  14. 手把手教你VirtualBox安装Centos,全网最全教程
  15. lpc1768的gpio库函数_LPC1768之GPIO输入和输出配置基础例程
  16. Python最优化算法学习笔记(Gurobi)
  17. azkaban任务状态一直在Preparing状态不能更新的解决办法
  18. 案例分析:回归-克里金方法生成气温表面图(1)
  19. 哔哩哔哩 2019秋招编程题---山寨金闪闪
  20. frl啥意思_轻钢笔记《FRL60/60/60是什么意思?》

热门文章

  1. 基于ESP32的蓝牙翻页器设计(论文附调试成功代码!!)
  2. 共享充电宝投放餐饮行业收益如何?
  3. oracle替换图片颜色,PS人物抠图、衣服颜色更换及相片增加清晰度方法
  4. 循环冗余校验-CRC
  5. NEON Intrinsics 练习题
  6. 有心杀贼,无力回天出处
  7. 免费动态IP代理科普知识课堂—代理服务器的类型
  8. Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组
  9. MySQL入门教程系列-1.5 如何学习MySQL
  10. 【1945. 字符串转化后的各位数字之和】