前端性能优化之Gzip

2023-11-15

前端性能优化之Gzip

什么是GZIP ?

gzipGNUzip的缩写,它是一个GNU自由软件的文件压缩程序。它是Jean-loupGaillyMarkAdler一起开发的。

压缩原理

Gzip 压缩背后的原理,是在一个文本文件中找出一些重复出现的字符串、临时替换它们,从而使整个文件变小。

根据这个原理,文件中代码的重复率越高,那么压缩的效率就越高,使用 Gzip 的收益也就越大。反之亦然。

文件格式

[filename].gz

Gzip 的优点

减少文件大小。gzip压缩比率在3到10倍左右,可以大大节省服务器的网络带宽。

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

  1. 是可以减少存储空间
  2. 是通过网络传输文件时,可以减少传输的时间

对于带宽较低的服务器是一种利好,开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量。

Gzip 的缺点

  1. 开启gzip后会额外的增加很多cpu的开销,会对服务器产生一起压力,同时,客户端解压也需要cpu开销(不过客户端还好),这也是不建议把压缩率设置太高的原因。
  2. 对图片的压缩支持不太好,会出现体积变大或图片失真的问题。

如何开启Gzip?

两个先行条件

要开启Gzip,需要先满足两个条件:

  • 服务器支持并开启Gzip压缩服务

    目前大多数的服务器都支持Gzip压缩服务,比如NginxIISApachetomcat等,只不过设置不同而已。

  • 客户端(浏览器)支持Gzip解压服务

    目前主流的浏览器都支持Gzip解压服务。

判断是否已开启Gzip服务?

通过查看HTTP请求来判断:

如果服务器开启了Gzip压缩服务,HTTP的响应头就会出现:

Content-Encoding: gzip

如果客户端支持Gzip解压服务,HTTP的响应头就会出现:

Accept-Encoding:gzip

Nginx中开启Gzip

配置属性

  • gzip on;
    on为启用,off为关闭

  • gzip_min_length 1k;
    设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。

  • gzip_buffers 4 16k;
    获取多少内存用于缓存压缩结果,4 16k表示以16k*4为单位获得,默认 4 8k

  • gzip_proxied any;
    nginx做为反向代理时启用

    off(关闭所有代理结果的数据的压缩),

    expired(启用压缩,如果header头中包括"Expires"头信息),

    no-cache(启用压缩,header头中包含"Cache-Control:no-cache"),

    no-store(启用压缩,header头中包含"Cache-Control:no-store"),

    private(启用压缩,header头中包含"Cache-Control:private"),

    no_last_modefied(启用压缩,header头中不包含"Last-Modified"),

    no_etag(启用压缩,如果header头中不包含"Etag"头信息),

    auth(启用压缩,如果header头中包含"Authorization"头信息)

  • gzip_comp_level 3;
    压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值;

  • gzip_types text/plain application/x-javascript text/css text/javascript;
    对特定的MIME类型生效,其中text/html被系统强制启用

  • gzip_http_version 1.1
    识别http协议的版本,早起浏览器可能不支持gzip自解压,用户会看到乱码,默认1.1

  • gzip_vary on
    启用应答头Vary: Accept-Encoding,一般不需要设置

  • gzip_disable msie6
    (IE5.5IE6 SP1使用msie6参数来禁止gzip压缩 )指定哪些不需要gzip压缩的浏览器(将和User-Agents进行匹配),依赖于PCRE

  • gzip_static on;

    nginx 会优先匹配 gzip 文件来返回,如果没有就寻找相应资源进行 gzip 压缩再返回。

nginx.conf常用配置

gzip on;
gzip_min_length 10k;
 // 设置大于10k起才压缩
gzip_buffers 4 16k;
gzip_comp_level 3;
 // 3到5
gzip_types text/css text/javascript;
 // 只对js,css文件进行压缩

Webpack开启Gzip打包

WebpackGzip打包是通过插件compression-webpack-plugin来生成.gz文件。

配置流程

首先,安装compression-webpack-plugin:

npm i -D compression-webpack-plugin

然后,在webpack配置文件中加入以下配置:

// 最好是先判断以下环境变量是否是生产环境的打包
const CompressionWebpackPlugin = require('compression-webpack-plugin')
if (process.env.NODE_ENV === 'production') {
    webpackConfig.plugins.push(
    	new CompressionWebpackPlugin({
            filename: '[path].gz[query]',
            // 目标资源名称。 [file] 会被替换成原始资源。[path] 会被替换成原始资源的路径, [query] 会被替换成查询字符串。默认值是 "[path].gz[query]"。
            algorithm: 'gzip',
            // 算法,默认'gzip'
            test: '\\.(js|css))$',
            // 所有匹配该正则的资源都会被处理。默认值是全部资源。
            // 这里只匹配了js、css文件
            threshold: 10240,
          	//只有大小大于该值的资源会被处理。单位是 bytes。默认值是 0。
            minRatio: 0.8
            // 只有压缩率小于这个值的资源才会被处理。默认值是 0.8。
        })
    )
}

最后,在nginx配置开启gzip压缩

在上面的nginx常用配置中,添加gzip_static on;,这样nginx 会优先匹配 gzip 文件来返回,如果没有就寻找相应资源进行 gzip 压缩再返回。

修改后的nginx配置如下:

gzip on;
gzip_min_length 10k;
gzip_buffers 4 16k;
gzip_comp_level 3;
gzip_types text/css text/javascript;
gzip_static on;
// `nginx` 会优先匹配 `gzip` 文件来返回,如果没有就寻找相应资源进行 `gzip` 压缩再返回。

优点

减少了服务器压缩文件的压力

缺点

增加了打包时间

总结

相比于用服务器每次请求都要压缩的方式,这种牺牲一点打包时间的方式更加值得推荐使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端性能优化之Gzip 的相关文章

随机推荐

  • Qt 多项目系统中如何指定各项目的编译顺序 (***笔记)

    QT学习笔记 QT多项目系统中如何指定各项目的编译顺序 Qt pri 创建使用 pri文件 Qt pro文件 pri文件的写法 Qt 多项目系统中如何指定各项目的编译顺序 笔记 https blog csdn net ken2232 art
  • 目标跟踪算法——KCF入门详解

    一直以来没有很想写这个 以为这个东西比较简单 还算是比较容易理解的一个算法 但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西 我一直以为关于细节的东西大家可以自己去理解 大家都是想快速了解这个 那我就厚脸皮了在这写一下自己的见
  • 场景二:Git远程版本库的基本用法

    1 克隆远程版本库 如果你已经在Gitee或者GitHub等网站上创建了Git版本库 可以通过git clone命令 将版本库克隆到本地完成本地版本库的初始化 git clone命令的用法如下 git clone https DOMAIN
  • 由羽毛球拍想到的

    羽毛球拍 品牌太多 如何选择 看到红双喜厂商的具体套路 才知这个市场与手机市场一样 都是低端的外包 高端的自己做 但是 球拍这个东西高端的和低端的普通人能看出区别 许多生活中的产品都是如此 例如空调 格力之类的空调压缩机许多也是采购第三方的
  • Python之花舞盛宴:探索列表与元组之美与妙用

    前言 在Python编程世界中 列表和元组是两个最常用的数据结构之一 无论是初学者还是经验丰富的开发者 对于这两个数据类型的掌握都至关重要 列表和元组都是用于存储多个值的容器 但它们在性质和特性上有所不同 列表是可变的 可以随意修改 添加或
  • 用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

    面向对象是一种编程思想 并不特指某种编程语言 所以不必惊讶用 VimL 也能以面向 对象的方式来写代码 本章先简单介绍一下面向对象的编程思想 再探讨如何利用 VimL 现有的特性实现面向对象编程 最后应由用户自行决定是否有必要使用面向对象的
  • C++学习系列之求圆柱体的体积

    实例要求 以函数调用的方式 求圆柱体的体积 主函数中先输入圆柱体的半径和高 调用求体积的函数 输出结果 代码如下 include
  • linux服务器运维

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 no space left on device 原因 磁盘满了 inode耗尽
  • 如何将Web主页性能提升十倍以上?

    给IT平头哥联盟加星标 提升前端技能 作者 exAspArk 译者 核子可乐 最近 我们将 Universe com 主页的性能提升了十倍以上 在本文中 我们将解析实现这一重大改进的具体技术手段 但在开始之前 让我们先对网络性能的重要意义进
  • C 基本语法

    原文链接 https www runoob com cprogramming c basic syntax html 我们已经看过 C 程序的基本结构 这将有助于我们理解 C 语言的其他基本的构建块 C 的令牌 Tokens C 程序由各种
  • Selenium+python之不打开浏览器,来运行测试用例

    调用浏览器 来进行自动化测试 是一个常规操作 或者说针对少量测试用例 可以打开浏览器运行 但是针对大量运行测试用例来说 如果每个测试用例都需要调用一次 浏览器 那么无疑对服务器增加了巨大的压力 那么有没有一个办法 不调用浏览器 让浏览器在后
  • (只需两步)让ChatGPT免费帮你制作出漂亮的PPT

    目录 第一步 生成 PPT 代码 第二步 将代码转化为 PPT 还在为制作PPT而烦恼吗 让ChatGPT来帮您 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式 省时省力又专业 真的只需两步 真的非常简单 以下部分生成效果 pp
  • bash和sh的区别

    一 简述 Shell 中文意思贝壳 寓意类似内核的壳 Shell是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既
  • 一文搞懂Ubuntu环境变量

    用户级别的环境变量 bash profile bash login bashrc 坑的原理 1 当bash shell作为登录shell启动时 比如用户登录系统时 首先会查找并执行 bash profile文件 如果这个文件不存在 那么它会
  • R根据列名提取想要的列

    数据格式如下 a b c d e 1 2 3 4 5 使用select过滤不要的列 df which names df in c a b subset df select c a b 使用select选择想要的列 df c x y subs
  • 微信小程序 真机调试无法请求localhost

    问题描述 在微信开发者工具里能正常请求后台数据 但真机调试时 却报localhost请求失败的错误 解决方案 在客户端的config js中 把host里的localhost改成本机在局域网里的ip地址即可 服务端可继续沿用localhos
  • 【云原生】kubectl常用命令大全

    目录 一 资源管理方法 kubectl 的命令大全 二 kubectl常用命令大全 2 2 项目的生命周期 创建 gt 发布 gt 更新 gt 回滚 gt 删除 1 创建 kubectl create命令 2 发布 kubectl expo
  • plt.show无法显示图片

    省流 Linux系统本来就没有图形界面 import matplotlib pyplot as plt plt savefig img png 引号里是保存的路径 像此处示例就是相对路径 保存在当前文件夹 远程服务器连接Linux系统 则保
  • SpringAOP+自定义注解实现日志功能

    SpringAOP 自定义注解实现日志功能 上篇文章讲解了springAOP实现简单日志功能 这次讲解使用自定义注解实现日志功能 具体pom Spring SpringMVC的配置不再进行讲解 详情点击链接查看SpringAOP Aspec
  • 前端性能优化之Gzip

    前端性能优化之Gzip 什么是GZIP gzip是GNUzip的缩写 它是一个GNU自由软件的文件压缩程序 它是Jean loupGailly和MarkAdler一起开发的 压缩原理 Gzip 压缩背后的原理 是在一个文本文件中找出一些重复