【性能优化】gzip 压缩

news/2025/1/20 16:42:50/文章来源:https://www.cnblogs.com/wanglei1900/p/18681852

gzip 压缩

常见的压缩技术包括 gzip、Brotli (br) 和 Zstandard (zstd)。gzip兼容性最好,后文讲的都是gzip压缩。

gzip 是一种基于 LZ77 算法的通用数据压缩算法。它通过查找重复的字符串模式来减少数据冗余,从而实现压缩。

1 理解网络传输数值

在浏览器控制台的Network面板中,当你查看网页网络请求时,可能会注意到有两个与大小相关的数值:Transferred over network(网络传输大小)和 Resource size(资源大小)。这两个数值代表了不同的含义,理解它们有助于你更好地分析网络性能和资源优化情况。

  • Transferred over network(网络传输大小)
    定义:这是指从服务器传输到浏览器(或从浏览器传输到服务器,如果是上传请求的话)的数据量大小。
    影响因素:这个数值会受到多种因素的影响,包括文件本身的压缩情况(如是否开启了Gzip压缩)、HTTP头的大小、传输过程中可能添加的额外数据(如cookies、认证信息等)等。
    重要性:网络传输大小是衡量网络性能的重要指标之一。较小的传输大小意味着更快的加载速度和更低的带宽消耗。

  • Resource size(资源大小)
    定义:这是指资源本身的原始大小,即文件在服务器上的大小,不包括HTTP头或其他传输过程中添加的额外数据。
    影响因素:这个数值主要取决于资源文件本身的内容,如图片、脚本、样式表等的大小。
    重要性:资源大小对于评估网页的整体大小和加载性能也很重要。较小的资源大小有助于减少网页的加载时间,提高用户体验。

当你发现某些文件的Transferred over network值远小于Resource size值时,这通常意味着这些文件已经经过了Gzip压缩。


2 开启Gzip压缩

2.1 前置条件

  • 服务器开启gzip压缩(nginx、IIS、Apache、tomcat服务器都支持)
    • 响应头返回 Content-Encoding: gzip
  • 浏览器支持gzip压缩(除IE都支持)
    • 请求头返回 Accept-Encoding: gzip

2.2 传输流程

Gzip的动态压缩和静态压缩是两种不同的压缩方式,它们在实际应用中有各自的特点和适用场景。

2.2.1 动态压缩

  • 定义:动态压缩是指服务器在响应客户端请求(如.js文件)时,实时地对文件进行压缩,并将压缩后的文件(如.js.gz文件)发送给客户端。
  • 实现方式:在Nginx等Web服务器中,动态压缩通常是通过配置gzip模块来实现的。当服务器接收到客户端的请求时,它会检查请求的文件类型是否支持gzip压缩,如果支持,则对文件进行压缩,并在HTTP响应头中设置相应的Content-Encoding字段,指示客户端使用gzip解码。
  • 特点:
    • 实时性:动态压缩是在客户端请求时实时进行的。
    • CPU负载:由于每次请求都需要进行压缩操作,因此会增加服务器的CPU负载。
    • 适用性:适用于内容更新频繁、需要实时压缩的场景。

2.2.2 静态压缩

  • 定义:静态压缩是指提前将文件压缩成gzip格式,并将压缩后的文件(.gz后缀)存储在服务器上。当客户端请求该文件(如.js文件)时,服务器直接发送压缩后的文件(如.js.gz文件)给客户端。
  • 实现方式:在Nginx中,静态压缩可以通过配置 gzip_static 模块来实现。服务器会检查请求的文件是否存在对应的.gz压缩文件,如果存在,则直接发送该压缩文件给客户端。
  • 特点:
    • 提前性:静态压缩是在文件上传到服务器前或上传后由服务器提前进行的。
    • CPU负载:由于压缩操作已经在文件上传前或上传后完成了,因此不会增加服务器在响应请求时的CPU负载。
    • 适用性:适用于内容更新不频繁、可以提前压缩的场景。

2.2.3 选择何种方式

  • 压缩效率:动态压缩在每次请求时都需要进行压缩操作,而静态压缩则只需要进行一次压缩操作。因此,在压缩效率方面,静态压缩通常更高。
  • 资源消耗:动态压缩会增加服务器的CPU负载,而静态压缩则不会。因此,在资源消耗方面,静态压缩更具优势。
  • 适用性:在实际项目中,选择gzip的动态压缩还是静态压缩,需要根据项目的具体需求和资源情况来决定。例如,对于静态资源(如图片、CSS、JavaScript等)可以使用静态压缩来优化存储和传输;而对于动态生成的内容(如API响应等)则可以使用动态压缩来减少带宽使用。

3 项目测试

3.1 webpack 开启gzip 压缩

// vue-cli @4.5.13
// compression-webpack-plugin @5.0.1
// webpack-bundle-analyzer @3.9.0
const CompressionWebpackPlugin = require("compression-webpack-plugin");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;module.exports = {...omitconfigureWebpack: config => {// 公共配置..omit// 生产模式if (isProduction) {const plugins = [// 用来观察压缩后的体积大小new BundleAnalyzerPlugin({analyzerMode: "static",reportFilename: "report.html",openAnalyzer: false // 不自动打开浏览器}),new CompressionWebpackPlugin({filename: "[path].gz[query]", // 生成的压缩文件名。algorithm: "gzip", // 压缩算法,这里选择gzip。test: /\.(js|css|svg)$/, // 匹配需要压缩的文件类型。如果删除原始文件一定不能压缩html文件threshold: 10240, // 文件大于这个大小时才进行压缩,单位为字节。minRatio: 0.8, // 压缩比例,只有压缩比例小于这个值的文件才会被压缩。deleteOriginalAssets: false //删除原始文件只保留压缩后的文件,不建议开启})];config.plugins.push(...plugins);} else {config.devtool = "source-map"; // 生成 source map 以便于调试}}
}

3.2 打包产物分析

正常对js/css 压缩就行了,使用gzip对图片进行压缩的话反而会增大体积和失真。

  • 可以通过BundleAnalyzerPlugin 插件的点击gzipped查看压缩效率。

    • 只能查看js文件的 14.44 M,,gzip压缩后为 3.43 M。js文件压缩为原文件 23%
  • CompressionWebpackPlugin 插件开启 deleteOriginalAssets:true来比较最终产物大小。

    • 压缩前 58.5 M,gzip压缩后为 32.3 M 。最终产物压缩率为55%(不是实际压缩率 因为实际只压缩了js/css/svg)。

3.3 观察 gzip是否生效

  • 开启Gzip压缩:如果服务器对资源进行了Gzip压缩,那么浏览器在接收到这些资源后会自动进行解压缩。在Network面板中,你可以通过查看Transferred over network值来判断是否开启了Gzip压缩。如果开启了Gzip压缩,该值通常会远小于Resource size值。

  • 未开启Gzip压缩:如果服务器没有对资源进行Gzip压缩,那么Transferred over network值将接近或等于Resource size值(考虑到HTTP头和其他额外数据的影响,可能会有一些微小的差异)。


4 gzip 服务器部署设置

4.1 iis 配置

需要在根目录下设置 webconfig(或者全局的webconfig同等配置里)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><system.webServer><httpProtocol><customHeaders><add name="Access-Control-Allow-Origin" value="*" /></customHeaders></httpProtocol><httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"><scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /><staticTypes><add mimeType="text/*" enabled="true" /><add mimeType="message/*" enabled="true" /><add mimeType="application/javascript" enabled="true" /><add mimeType="*/*" enabled="false" /></staticTypes><dynamicTypes><add mimeType="text/*" enabled="true" /><add mimeType="message/*" enabled="true" /><add mimeType="application/x-javascript" enabled="true" /><add mimeType="*/*" enabled="false" /></dynamicTypes></httpCompression><urlCompression doStaticCompression="true" doDynamicCompression="false" /></system.webServer>
</configuration>

tips:iis部署有时候会出现随机的gzip行为

iis部署有时候会出现随机的gzip行为 📚

开发环境必须触发频繁访问资源(10秒内2次访问同一url),才能开启gzip。


4.2 nginx 配置

需要设置 config.nginx

gzip on; # 开启Gzip压缩gzip_disable "msie6"; # IE 对 Gzip 压缩不友好,禁掉gzip_buffers 4 16k; # 获取多少内存用于缓存压缩结果,4 16k表示以16k*4为单位获得,默认 4 8kgzip_comp_level 6; # 压缩比{1 - 9},1处理压缩速度最快,9最慢(传输快但消耗CPU)gzip_static: on; # 告诉 nginx 在提供文件时优先查找对应的 .gz 版本gzip_http_version 1.1; # 识别http协议的版本,早期浏览器可能不支持gzip自解压,用户会看到乱码,默认1.1gzip_min_length 10k; // 超过 10Kb才压缩gzip_types text/plain text/plain application/javascript application/x-javascript text/css application/xml text/javascript 

5 参考

Gzip、Brotli 和 Zstandard 压缩技术 📚
前端性能优化——Gzip压缩 📚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872221.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025/1/20

今天继续学习Android Studio,学习了布局,有LinearLayout、相对布局、FrameLayout的布局方式,学习了各个组件内部的小组件,以及TextView 和View的基础控件,用手机usb进行调试,突发奇想,想整一个简单的app,调试成功后,关闭电脑程序,手机端app会卡退,了解到需要apk的知…

manim边做边学--交替变换

今天,我们将介绍 Manim 中两个用于交替变换的动画类:CyclicReplace 和 Swap。 无论是在展示数学概念的动态变化,还是在图形设计中呈现元素的巧妙交互,这两个动画类都扮演着重要角色。 它们以各自独特的方式,为我们提供了丰富的创意表达空间。CyclicReplace:循环替换一组对…

认识西门子ET 200SP分布式I/O系统的接口模块

文章来源:认识西门子ET 200SP分布式I/O系统的接口模块西门子ET 200SP分布式I/O系统由接口模块和信号模块组成,信号模块插接在底板上,通过底板与接口模块相连接。一个接口模块可以连接多个信号模块,具体的数量与接口模块的类型有关。今天这篇文章,我们来介绍下接口模块。 接…

【DingTalk】JsApi 地理位置相关

最近接手同事新开的半成品项目,钉钉嵌入的地图API测试中出现了BUG 钉钉API文档见此: https://open.dingtalk.com/document/orgapp/obtain-current-geographic-location-information-single-positioning一、IOS位置获取组件无法打开 安卓手机是可以不需要JSAPI授权配置的,这点…

“国产双系统”出炉!复旦微FMQL20SM非对称AMP:Linux + 裸机

“非对称AMP”双系统是什么 AMP(Asymmetric Multi-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的…

CudaSPONGE与PySAGES初步性能测试

接前一篇关于PySAGES结合CudaSPONGE使用方法的文章,本文主要还是使用了一样的测试案例。仅通过不同的测试步长,来定性的分析PySAGES的MetaDynamics实现方案结合MD软件之后的性能数据。技术背景 在前面的一篇博客中,我们介绍过CudaSPONGE的基础使用方法、CudaSPONGE调用Pytho…

记一次移动光猫(GM219-S)安全测试

前言 过个年,WiFi密码忘记了…光猫管理密码也忘记了(这个光猫也不支持物理按钮重置设置),但是手机还连着WiFi,正规操作找回不了密码,那就用咱们测试的思维来试试PWN掉这个路由器。 过程 未授权获取WiFi连接密码 还好之前没闲着,发现管理的几个未授权访问的接口如下: 获取…

Web安全测试学习手册-业务逻辑测试

首先感谢朋友倾璇的邀请 ,参与了的相关撰写,目前负责业务逻辑测试这一块的撰写,目前初步已经成型,先发出来让大家看看,欢迎点评,也可以加入我们一起来撰写~ 业务逻辑测试 介绍:这里对Web应用业务逻辑方面的安全缺陷进行介绍和常见案例讲解。 任意用户密码重置 常见的缺陷…

串口、COM口、UART口 ;TTL、 RS-232、 RS-485

串口、COM口、UART口TTL、RS-232、RS-485区别首先 串口、COM口、UART口一般指的是硬件接口。而TTL、RS-232、RS-485则是逻辑电平0和1的不同表示标准 它们区别如下:1)和RS232相比,由于RS485采用了差分传输的方式,因此抗干扰能力强很多。TTL抗干扰能力最差。2)像STM32这类单…

ML.NET 图像分类

参考文档:https://www.cnblogs.com/mq0036/p/18302572using MLNET_Image; using static MLNET_Image.MLModel1;namespace MLNET.Image {public partial class MainForm : Form{public MainForm(){InitializeComponent();}private void btnSelectImage_Click(object sender, Ev…

【医疗行业】2024中国网络安全产业势能榜优能企业「医疗行业」典型案例展示

医疗行业涉及大量敏感数据,包括患者的健康信息和医疗记录。因此,医疗数据的保护一直是行业中的重中之重。随着电子病历、远程医疗等新技术的应用,医疗行业面临着更多的网络安全威胁。在本期,我们将展示医疗行业的一些典型案例,探讨如何加强医疗数据保护,保障患者隐私和数…

海康web3.0插件开发,登录成功预览失败

做个记录,使用官方的demo,发现有登录成功,预览和回放失败,代码1000,未知错误,我遇到的情况是获取端口信息错误导致的这个是硬盘录像机原始的配置,虽然配置显示没有启用UPnP,但是插件中的默认获取的端口信息是按照这张表中的外部端口获取的,但是如果你没有启用端口映射…