NodeJS 服务器实现 gzip 压缩

ProjectOne(06) - 番外篇03 nodejs开启gzip压缩,使用compression包 今天跟同事讨论起网站效率优化的问题。 说起优化,首先当然想到的是压缩功能了呀。 然后,就肯定是Gzip咯。 ok,简单的百度了一下Gzip在nodejs中的实现。 然后, 就找到了如下方式。 操作: 首先,在项目根目录下运行npm,安装Gzip所需要用到的包"compression"。 运行cmd,在E:\ProjectOne目录下,执行以下命令。 npm i compressi 阅读详情

在这里插入图片描述


阅读原文


概述

在浏览器向服务器请求静态资源时,服务器为了减小在网络传输过程中消耗的流量和时间,都是将静态资源经过压缩后返回给服务器的,实现压缩的算法有 deflate 和 gzip 等,最常用的是 gzip 压缩。


gzip 简介

在浏览器和服务器之间通过 gzip 压缩流实现传输的过程可以用下图表示。

在这里插入图片描述

当浏览器向服务器请求静态资源,服务器会将静态资源经过处理转换为压缩流,大大减小文件体积,然后将压缩流返回给浏览器,浏览器通过压缩的类型重新将压缩流解析成静态文件。


zlib 模块的使用

1、压缩

在 NodeJS 中通过 zlib 模块帮助我们实现不同类型的压缩,其实压缩的过程就是创建流的过程,创建的压缩流是 Transform 类型(转化流),读取文件的内容经过转化流创建一个新类型的文件。

// 文件:gzip.js
const zlib = require("zlib");
const fs = require("fs");
const path = require("path");

// 压缩
function gzip(source) {
    // 处理输入和输出的文件路径
    let sourcePath = path.join(__dirname, source);
    let gzipPath = `${sourcePath}.gz`;

    // 创建转化流
    let gzip = zlib.createGzip();

    // 创建可读流
    let rs = fs.createReadStream(sourcePath);

    // 创建可写流
    let ws = fs.createWriteStream(gzipPath);

    // 实现转化
    rs.pipe(gzip).pipe(ws);
}

gzip("index.html");

执行上面代码查看根目路是否出现 index.gz 压缩包。

2、解压

压缩的过程是可逆的,可以压缩就可以解压,无论是在浏览器还是在服务器,我们下面实现解压的方法。

// 文件:gunzip.js
const zlib = require("zlib");
const fs = require("fs");
const path = require("path");

// 解压
function gunzip(source) {
    // 处理输入和输出的文件路径
    let sourcePath = path.join(__dirname, source);
    let filePath = path.join(__dirname, path.basename(source, ".gz"));

    // 创建转化流
    let unzip = zlib.createGunzip();

    // 创建可读流
    let rs = createReadStream(sourcePath);

    // 创建可写流
    let ws = createWriteStream(filePath);

    // 实现转化
    rs.pipe(unzip).pipe(ws);
}

gunzip("index.html.gz");

删除原来 index.html,执行解压代码,查看文件根目录是否生成 index.html。


服务器的实现

在浏览器与服务器的交互中,浏览器其实会通过请求头 Accept-Encoding 告诉服务器当前支持解压的压缩格式,值为 gzip, deflate, br,多个压缩格式用 , 隔开,服务器在接收到浏览器请求后,会按照请求头的格式压缩资源,将压缩后的资源返回,并通过响应头 Content-Encoding 告诉浏览器当前服务器压缩的格式。

// 文件:server.js
// 引入依赖
const http = require("http");
const url = require("url");
const path = require("path");
const fs = require("fs");
const zlib = require("zlib");

// 创建服务器
const server = http.createServer((req, res) => {
    // 处理 pathname,"/" 时默认读取 "/index.html"
    let { pathname } = url.parse(req.url, true);
    pathname = pathname !== "/" ? pathname : "/index.html";

    // 获取读取文件的绝对路径
    let p = path.join(__dirname, pathname);

    // 查看路径是否合法
    fs.access(p, err => {
        // 路径不合法则直接中断连接
        if (err) return res.end("Not Found");

        // 获取浏览器支持的压缩格式
        let encoding = req.headers["accept-encoding"];

        // 创建可读流
        let rs = fs.createReadStream(p);

        // 支持 gzip 使用 gzip 压缩,支持 deflate 使用 deflate 压缩
        if (encoding && encoding.match(/\bgzip\b/)) {
            let compress = zlib.createGzip();
            let compressType = "gzip";
        } else if (encoding && encoding.match(/\bdeflate\b/)) {
            let compress = zlib.createDeflate();
            let compressType = "deflate";
        } else {
            // 否则直接返回可读流
            return rs.pipe(res);
        }

        // 将压缩流返回并设置响应头
        res.setHeader("Content-Encoding", compressType);
        rs.pipe(compress).pipe(res);
    });
});

server.listen(3000, () => {
    console.log("server start 3000");
});

在上面服务器中如果不通过响应头通知浏览器当前资源的压缩格式,浏览器会不知道该如何解压,默认会当成文件下载,如 Chrome,所以在返回压缩流时必须通过 Content-Encoding 响应头通知浏览器当前的压缩格式。


测试服务器压缩

我们在文件根目录创建一个 index.html 文件,代码如下。

<!-- 文件:index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>gzip</title>
</head>
<body>
    <div>Hello GZIP!</div>
</body>
</html>

启动服务器 server.js,然后通过浏览器访问 localhost:3000,查看页面能否正确返回,并查看开发者工具 Network 中的响应头 Content-Encoding 的值是否正确。


总结

服务器压缩其实是客户端与服务器在网络传输时的一种优化手段,可以大大减小流量的消耗和响应时间,而 gzip 只是目前最常用的一种压缩格式,即压缩算法。


使用Node.js进行Gzip包安装和编程 最后,我们使用.pipe()方法将可读流、压缩流和可写流连接起来,实现数据的流动和压缩操作。最后,我们使用.pipe()方法将可读流、解压流和可写流连接起来,实现数据的流动和解压缩操作。首先,我们安装了gzip包,然后演示了如何使用gzip包进行文件压缩和解压缩的代码示例。通过使用gzip包,我们可以方便地在Node.js应用程序中实现文件的压缩和解压缩功能,从而提高网络传输效率,并节省存储空间。本文将介绍如何安装gzip包,并演示如何在Node.js中使用gzip进行文件的压缩和解压缩。 阅读详情

相关推荐

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

任何服务端开发都少不了性能优化的操作,在前后端使用HTTP接口(API)进行数据传递时,如果传递数据量太大,势必会造成请求超时或失败。 nodejs为我们提供了一个zlib内置模块,我们可以使用它其中的gzip方法来对传递的数据进行压缩,从而提高数据传递效率,快进来看看吧!

前端之行,任重道远! 4911

javascript使用gzip压缩数据后传输给后端

使用场景:app的日志接口需要大量提交日志给服务器,每30s提交一次,一次性最多提交50条日志数据,日志信息包含大量文本数据,导致数据传输量大,故后端的接口改成接受gizp压缩后的数据流 java接口定义: 前端javascript请求: let binaryArray = pako.gzip(JSON.stringify(params)); let buffer = new Uint16Array(binaryArray).buffer let url = _configServer.LOG_SERVI

weixin_37744901的博客 3202

qt实现程序密钥注册功能,MD5加密+AES加密,并实现一台电脑系统一个密钥

qt实现了一个给自己软件加密的功能。 原理是: 需要被注册的软件第一次运行的时候,在系统的注册表里面注册一个键值,如下: 这个值作为生成密钥的用户识别号,然后生成密钥文件key.db,把这个key.db文件放到软件执行目录下,即可完成软件的注册并正常使用软件。 软件第一次打开的界面及密钥生成工具软件界面如下: 将密钥生成工具软件生成的key.db放到软件执行目录下之后,软件即可正常使用,如下图: 代码使用了MD5加密 外加 AES加密, 解密和加密的核心代码如下: QSt.

weixin_43935474的博客 4128

基于NodeJS的HTTP server Plus 5:压缩(Accept-Encoding/Content-Encoding)

概述在浏览器向服务器请求静态资源时,服务器为了减小在网络传输过程中消耗的流量和时间,都是将静态资源经过压缩后返回给服务器的,实现压缩的算法有 deflate 和 gzip 等,最常用的是 gzip 压缩。gzip 简介在浏览器和服务器之间通过 gzip 压缩流实现传输的过程可以用下图表示。当浏览器向服务器请求静态资源,服务器会将静态资源经过处理转换为压缩流,大大减小文件体积,然后将压缩流返回给浏览...

weixin_33932129的博客 586

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 484

主动式桥梁防船撞预警系统的方案汇总

本系统以精密光电测高前端(2台,上下游各1台)、固态雷达(2台,上下游各1台)、AIS(1台)、偏航辅助前端(4台,上下游各2台)为核心,通过人工智能,对画面上的船舶目标进行深度学习、精确定位,再用系统集成方法将各设备有机结合在一起,构建成套的桥梁防撞主动预警系统,全天候监控过往船舶。主动式桥梁防船撞预警系统主要船舶监测采集单元、控制单元、船舶超高、偏航信息检测单元、以及视频监控单元组成,,通过声光警示、短信文字、船舶身份识别及海事对讲频道、视频录像取证等多种手段与船舶进行信息互动,主动防止船舶碰撞桥梁!

gdxixun的博客 974

js实现服务器端文件压缩,NodeJS服务器实现gzip压缩的示例代码

本文介绍了NodeJS服务器实现gzip压缩,分享给大家,具体如下:在浏览器向服务器请求静态资源时,服务器为了减小在网络传输过程中消耗的流量和时间,都是将静态资源经过压缩后返回给服务器的,实现压缩的算法有 deflate 和 gzip 等,最常用的是 gzip 压缩。gzip 简介在浏览器和服务器之间通过 gzip 压缩流实现传输的过程可以用下图表示。当浏览器向服务器请求静态资源,服务器会将静态资...

weixin_42207707的博客 1248

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了在UE5游戏逆向工程中使用FModel提取.pak文件中3D模型的实战技巧,包括Dumper-7工具的深度配置与避坑指南。针对UE5特有的unversioned属性系统,提供了从源码编译到智能注入的全链路解决方案,帮助开发者高效获取游戏资产并优化处理流程。

weixin_30374009的博客 495

nodejs html 压缩,NodeJS服务器实现gzip压缩的示例代码_奔赴_前端开发者

本文介绍了NodeJS服务器实现gzip压缩,分享给大家,具体如下:在浏览器向服务器请求静态deflate 和 gzip 等,最常用的是 gzip 压缩。gzip 简介在gzip 压缩流实现传输的过程可以用下图表示。当zlib 模块的使用1、压缩在 NodeJS 中通过 zlib 模块帮助我们实现不同类型的压缩,其实压缩的过程就是创建流的过程,创建的压缩流是 Transform 类型(转化流),读...

weixin_35666639的博客 459

【OpenClaw从入门到精通】第09篇:企业级实践——将OpenClaw接入钉钉,打造7×24小时数字员工(2026实测版)

本文聚焦OpenClaw的企业级落地实践,以“招聘数字专员”为核心场景,完整演示从钉钉接入到全流程自动化的实现路径。内容涵盖企业级部署架构设计、前置环境搭建、核心技能开发、流程串联、安全权限管控及运维监控六大模块,详解简历解析、岗位匹配、外呼集成、CRM同步、日历提醒等关键技能的构建逻辑与代码实现。借鉴中关村科金、网易智企的企业级实践经验,重点突破企业知识融合、安全权限管控、业务系统连接三大核心门槛,提供可直接参考的配置示例与操作步骤。所有技术方案均基于公开文档与实测验证,兼顾新手入门与进阶实操。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1170

5、基于模型的系统工程(MBSE)全面解析

本文全面解析了基于模型的系统工程(MBSE),介绍了模型在系统工程中的核心地位,以及如何通过视图和符号表示法实现信息的可视化。文章还详细阐述了MBSE的方法构成,包括框架(本体和视图点)和流程集,探讨了MBSE的实施流程、关键要素、应用策略以及未来发展趋势。通过合理应用MBSE,组织可以提高系统开发的效率和质量,降低成本与风险,实现成功部署。

nft7creator的博客 127

gzip的了解

基本操作原理:通过消除文件中的冗余信息,使用哈夫曼编码等算法,将文件体积压缩到最小。这种数据压缩方式在网络传输中发扮了巨大作用,减小了传输数据的大小,从而提高了网页加载速度。

zxcvb0825的博客 505

福彩快乐8智能选号系统研究

本文介绍了一款福彩快乐8智能选号系统的开发过程。系统首先通过数据采集获取历史开奖数据,作为分析的基础。随后,对采集的数据进行深入分析,以识别可能的模式和趋势。基于这些分析,系统能够智能预测未来的开奖号码,如2025129期的预测。最后,通过模拟兑奖功能,用户可以直观地看到预测结果的实际效果。文章鼓励感兴趣的读者点赞并领取源代码,以便自行探索和使用该系统。

gumuzi1210的博客 2213

用NodeJS打造你的静态文件服务器 <转载>

转自http://cnodejs.org/topic/4f16442ccae1f4aa27001071 用NodeJS打造你的静态文件服务器 前言 在《The Node Beginner Book》的中文版(http://nodebeginner.org/index-zh-cn.html)发布之后,获得国内的好评。也有同学觉得这本书略薄,没有包含进阶式的例子。@otakustay同学说:...

weixin_34275734的博客 86

fatal: unable to access ‘https://github.com/xxx.git/‘ OpenSSL SSL_connect: SSL_ERROR_SYSCALL 解决方案

 本文主要介绍了fatal: unable to access ‘https://github.com/xxx.git/’: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 24万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

node静态服务器优缺点_NodeJS-静态服务器

静态服务器代码const http = require('http')const chalk = require('chalk')const conf = require('./config/default')const path = require('path')const fs = require('fs')const server = http.createServer((req, res)...

weixin_29471009的博客 229

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

nodejs压缩成7z_NodeJS(五):静态资源服务器

1 前言通过 http 模块,快速创建一个 http server demo,为了在控制台打印出有颜色的信息,可以安装 chalk 库:npm i chalkconst http = require('http');const chalk = require('chalk');const hostname = '127.0.0.1';const port = 3000;const server =...

weixin_39612110的博客 640

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何快速本地构建BoostNote-Legacy:开发环境搭建与VSCode调试完整教程

BoostNote-Legacy 是一款面向程序员的开源 Markdown 笔记应用,基于 Electron + React + Redux + Webpack 技术栈构建。本教程带你从零完成 **BoostNote-Legacy 本地构建**全流程:开发环境搭建、一键热启动、VSCode 断点调试,再到运行测试验证,新手也能照着 10 分钟跑起来。 [![BoostNote-Legacy Ma

gitblog_00066的博客 414

使用Nginx部署网站

如果服务器只需要放置一个网站程序,解析网站到服务器的网站,网站程序监听80端口就可以了。如果服务器有很多应用,借助nginx不仅可以实现端口的代理,还可以实现负载均衡。本文将详细介绍前端及nodeJS项目在服务器配置时需要用到的nginx配置。 Nginx 在线配置:https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN 安装 卸载nginx 在介绍如何安装nginx之前,先要介绍如何卸载nginx。因.

游荡边缘的博客 1204

性能优化实践:快速开启 Gzip 压缩

Gzip,全称为 GNU zip,是一种无损压缩文件的算法。其底采用的是 DEFLATE,而 DEFLATE 是 LZ77 与 哈夫曼编码 的一个组合体。 通常来说,“Gzip 压缩”的实现流程如下:

weixin_47516343的博客 4799

前端优化:开启Gzip压缩

Gzip是一种文件压缩算法,减少文件大小,节省带宽从而提减少网络传输时间,网站会更快地加载。请求头中设置属性accept-encoding:gzip使用gzip策略去解压。

m0_56347363的博客 5557

服务器开启GZIP

  开始接触GZIP压缩是在工作中上传lodash脚本文件到服务器上。本来压缩版的脚本也有七十几KB,但是笔者的同事说上传到服务器上只有二十多KB,笔者半信半疑,怎么会有这么大的差距,服务器压缩的幅度也太大了。后来网上找了很多资料,发现GZIP确实能够节省传输过程中很多的流量。   GZIP介绍 什么是GZIP   gzip是GNUzip的缩写,是一个GUN自由软件的文件压缩程序。刚开始用于...

精进编程の博客 4085

nodejs html 压缩,Node.js服务器启用Gzip压缩

Gzip是什么复制大神们的解释吧:GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技...

weixin_33571513的博客 429

nodejs开启gzip压缩和 使用scp传输文件到centos服务器中

nginx开启gzip压缩 打开 nginx-1.18.0\conf\nginx.conf 文件,在 http{}中添加 gzip on; //开启gzip压缩 gzip_disable "msie6"; //IE6以下对Gzip不怎么友好,不给压缩了 gzip_min_length 1k; //最小的长度,1K,文件如果太小,小于1K,就不会压缩,因为没准压缩之后还要变大 gzip_buffers 4 16k; //设置缓存的单位,压缩的时候要分配的缓冲区,缓冲区以16K为单位,往缓冲区写入内容的

艾小逗 597

Node.JS环境,Express服务器实现GZIP压缩传输

这篇文章将介绍如何使用Node.js和Express来实现Web服务器并使用fs模块读取文件,并将其gzip压缩后传递给客户端。

w2sft的博客 833
上一篇: NodeJS 实现多语言
下一篇: NodeJS 加密 —— crypto 模块
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值