Node中实现gzip压缩的方法和操作是什么
Admin 2022-10-12 群英技术资讯 269 次浏览
任何服务端开发都少不了性能优化的操作,在前后端使用HTTP接口(API)进行数据传递时,如果传递数据量太大,势必会造成请求超时或失败。
nodejs
为我们提供了一个zlib
内置模块,我们可以使用它其中的gzip
方法来对传递的数据进行压缩,从而提高数据传递效率。【相关教程推荐:nodejs视频教程】什么是gzip?
HTTP
协议上的GZIP
编码是一种用来改进WEB应用程序性能的技术这一般是指服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来,一般对纯文本内容可压缩到原大小的40%
这样传输就快了,效果就是你点击网址后数据会很快的显示出来,提高用户体验,当然这也会增加服务器的负载.,一般服务器中都安装有这个功能模块
减少文件大小有两个明显的好处:
- 一是可以减少存储空间
- 二是通过网络传输文件时,可以减少传输的时间
我们在进行本地数据传递时,如果一个文件太大我们经常会使用到文件压缩技术(zip或rar等),将大文件压缩成小文件进行传递,接收者再进行解压即可,因为压缩的速度一般是比较快的,这样就能减少文件传输过程中的时间,从而提高效率
简单来说,
gzip
其实就是一种用于服务端(后端)和客户端(前端)之间压缩数据的一种方法gzip和zlib什么关系?
zlib
是DEFLATE
算法的实现库,它的API同时支持gzip
文件格式以及一个简化的数据流格式
DEFLATE
是同时使用了LZ77算法
与哈夫曼编码(Huffman Coding)
的一个无损数据压缩算法
gzip
在HTTP
压缩,一种在万维网中加速传输HTML
和其他内容的技术所以可以说
zlib
是在gzip
的基础上增加了一些内容,这也是为什么node
中gzip
方法是在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
搭建服务器或者内置模块fs
的stream
流不太了解的话,可以看我先前的文章: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
的意义!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
JS循环结构有几种?在javascript中循环结构有三种,分别是for循序、while循环和do while循环,具体是如何实现的呢?这篇我们就来看看JS中循环的实现,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起学习一下吧。
这篇文章主要介绍了 vue3 自定义指令详情,自定义指令分为全局和局部两种类型,大家并不陌生。今天我们就讲讲在 vue3 中,自定义指令定义、使用以及钩子函数都有哪些变化?,需要的朋友可以参考一下
utf8编码算法是什么样的,如何实现?小编这就来给大家分析分析下,对此感兴趣的话可以看看以下知识点,有需要的朋友一定不要错过了。
这篇文章主要给大家分享解决重复请求的问题,下文给介绍了如何判断重复请求及如何取消重复请求的方法,本文有很详细的介绍,有这方面学习需要的朋友可以参考了解看看。
这篇文章给大家分享的是jQuery中attr的方法的相关内容。attr的方法的作用和用法很多,小编觉得挺实用的,因此分享给大家做个参考,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008