Node.js?使用?zlib?內置模塊進行?gzip?壓縮
前言
任何服務端開發(fā)都少不了性能優(yōu)化的操作,在前后端使用HTTP接口(API)進行數(shù)據(jù)傳遞時,如果傳遞數(shù)據(jù)量太大,勢必會造成請求超時或失敗。
nodejs為我們提供了一個zlib內置模塊,我們可以使用它其中的gzip方法來對傳遞的數(shù)據(jù)進行壓縮,從而提高數(shù)據(jù)傳遞效率。
什么是gzip?
HTTP協(xié)議上的GZIP編碼是一種用來改進WEB應用程序性能的技術
這一般是指服務器中安裝的一個功能,當有人來訪問這個服務器中的網(wǎng)站時,服務器中的這個功能就將網(wǎng)頁內容壓縮后傳輸?shù)絹碓L的電腦瀏覽器中顯示出來,一般對純文本內容可壓縮到原大小的40%
這樣傳輸就快了,效果就是你點擊網(wǎng)址后數(shù)據(jù)會很快的顯示出來,提高用戶體驗,當然這也會增加服務器的負載.,一般服務器中都安裝有這個功能模塊
減少文件大小有兩個明顯的好處:
- 一是可以減少存儲空間
- 二是通過網(wǎng)絡傳輸文件時,可以減少傳輸?shù)臅r間
我們在進行本地數(shù)據(jù)傳遞時,如果一個文件太大我們經(jīng)常會使用到文件壓縮技術(zip或rar等),將大文件壓縮成小文件進行傳遞,接收者再進行解壓即可,因為壓縮的速度一般是比較快的,這樣就能減少文件傳輸過程中的時間,從而提高效率
簡單來說,gzip其實就是一種用于服務端(后端)和客戶端(前端)之間壓縮數(shù)據(jù)的一種方法
gzip和zlib什么關系?
zlib是DEFLATE算法的實現(xiàn)庫,它的API同時支持gzip文件格式以及一個簡化的數(shù)據(jù)流格式
DEFLATE是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數(shù)據(jù)壓縮算法
gzip在HTTP壓縮,一種在萬維網(wǎng)中加速傳輸HTML和其他內容的技術
所以可以說zlib是在gzip的基礎上增加了一些內容,這也是為什么node中gzip方法是在zlib內置模塊中的原因
普通數(shù)據(jù)傳輸
我們使用node搭建一個服務器,來演示我們傳遞數(shù)據(jù)的普通方式:
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里的內容大家隨便寫,寫的越多越好
這里也使用到了上一節(jié)我們講過的內置模塊fs中的stream流,需要注意的是,在node服務器中的res參數(shù)本質是一個可寫流,所以我們才能直接將res用于pipe管道中
如果你對
node搭建服務器或者內置模塊fs的stream流不太了解的話,可以看我先前的文章:
Node.js 搭建后端服務器內置模塊( http+url+querystring 的使用)
Node.js 操作本地文件及深入了解fs內置模塊
運行server.js文件,使用瀏覽器訪問node服務器:

可以看到我這里傳遞的數(shù)據(jù)大小是97.6kb(這取決于你的index.html的內容)
gzip壓縮數(shù)據(jù)傳輸
我們使用gzip來改造一下上面普通數(shù)據(jù)傳輸?shù)睦樱?/strong>
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本質就是一個可寫流
// 在數(shù)據(jù)返回之前使用gzip壓縮數(shù)據(jù)
readStream.pipe(gzip).pipe(res);
}).listen(3000, () => {
console.log("服務器啟動啦!");
});先引入zlib內置模塊,再使用zlib.createGzip()獲取gzip方法,這個gzip方法實際也是一種數(shù)據(jù)流的格式,與node服務器中的res參數(shù)一樣,這也是pipe管道中能直接使用gzip的原因
我們在將數(shù)據(jù)傳遞給res參數(shù)(客戶端)之前,通過pipe管道的鏈式調用,將gzip加上
這樣readStream(服務端)的數(shù)據(jù)會先經(jīng)過gzip壓縮,之后才會傳遞給res參數(shù)(客戶端)
需要注意的是:
http數(shù)據(jù)壓縮的方式不止有gzip,還有其它的壓縮方式,只不過gzip是最常見最常用的一種方式
所以我們服務端使用gzip將數(shù)據(jù)壓縮后傳遞給瀏覽器時,瀏覽器并不知道我們是使用哪種方式壓縮的數(shù)據(jù),于是就不知道該以哪種方式進行解壓,所以我們需要手動明確的告訴瀏覽器我們使用的是gzip,服務端加上以下響應頭即可:
"Content-Encoding": "gzip", // 告訴瀏覽器我們是通過gzip壓縮的
這樣瀏覽器就能夠正確解壓我們傳遞的數(shù)據(jù)了,運行上面的server.js,打開瀏覽器訪問我們的node服務器:

可以看到使用gzip壓縮后我這里傳遞的數(shù)據(jù)大小只有27.5kb(這取決于你的index.html的內容),這與之前的97.6kb相比,數(shù)據(jù)傳輸速率大幅提升,這就是我們使用gzip的意義!
結語
這篇文章講了node的一個非常實用的小模塊zlib,zlib大家可能之前沒聽過,但gzip應該都曾聽過,gzip是請求數(shù)據(jù)傳輸性能優(yōu)化的一種很好的方式,看完本篇文章,相信你會對gzip有了更深的理解
到此這篇關于Node.js 使用 zlib 內置模塊進行 gzip 壓縮的文章就介紹到這了,更多相關Node.js gzip 壓縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Node.js中Express生成Token的實現(xiàn)方法
本文介紹了在Express中生成和使用Token進行用戶認證的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-12-12
nodejs實現(xiàn)解析xml字符串為對象的方法示例
這篇文章主要介紹了nodejs實現(xiàn)解析xml字符串為對象的方法,涉及nodejs針對xml格式字符串的解析與轉換相關操作技巧,需要的朋友可以參考下2018-03-03
Node.js中JavaScript操作MySQL的常用方法整理
這篇文章主要介紹了Node.js中JavaScript操作MySQL的常用方法整理,包括作者對使用MySQL模塊連接池時錯誤解決的一個記錄,需要的朋友可以參考下2016-03-03
NodeJS整合銀聯(lián)網(wǎng)關支付(DEMO)
這篇文章主要介紹了NodeJS整合銀聯(lián)網(wǎng)關支付DEMO的相關資料非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2016-11-11
使用Node.js實現(xiàn)Clean?Architecture方法示例詳解
這篇文章主要為大家介紹了使用Node.js實現(xiàn)Clean?Architecture方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

