前端网站优化-Brotli 压缩

news2024/9/24 19:27:01

杨绛先生说:“岁不声不响,你且不慌不忙。在凡俗的烟火里,愿以素心,阅来日方长。生活总是一地鸡毛,繁杂琐碎的日常,无力掌控的局面,以及猝不及防的变化,让日子多了几分慌张”。
市井长巷,聚拢起来是烟火,摊开来是人间;生活,远看是风景,近看才是人生。万事藏于心,而不表于情,有风听风,有雨看雨,生活并没有深意,幸福和遗憾都藏在日常里。所以,不慌不忙,不紧不慢,是一个成年人兵荒马乱日子之外的一点自由与安宁。

前言

通常我们都希望浏览网站网页的速度越快越好,这样也意味着,下载内容的数据越少越好。越少的数据量,会消耗更少的下载时间,就能让用户得到更快的网页载入。

根据 Google 的研究,超过40%的人在打开网页,等待了三秒钟后放弃了,而对于交易网站来说,每增加一秒钟的等待时间,就会降低7%的转换率。是的,每一秒钟都是非常重要的。

什么是br 压缩

同 gzip 类似, Brotli 也是一种压缩算法,由 Google 开发,对于文本压缩非常好。主要的特点就是它在服务器端和客户端都用到了词典,常见关键词和词组都有,这样可以获得更佳的压缩率。但 brotli 压缩速度比 Gzip 压缩慢,因此 gzip 可能更适合于压缩不可缓存的内容。

目前 Brotli已经获得各主流浏览器的支持。

怎样知道浏览器是否支持 Brotli?

当打开一个网页,然后在浏览器使用期开发工具的时候,可以查看其 content-encoding,如果看到 br 字样,那就是Brotli,如果看到 gzip,那就是用的 gzip 方式。

关于gzip 压缩

Gzip 是一种用于文件压缩与解压缩的文件格式。它基于 Deflate 算法,可将文件(译者注:快速地、流式地)压缩地更小,从而实现更快的网络传输。Web 服务器与现代浏览器普遍地支持 Gzip,这意味着服务器可以在发送文件之前自动使用 Gzip 压缩文件,而浏览器可以在接收文件时自行解压缩文件。

gzip vs br

根据某些文章的比较:
Javascript 文件用 Brotli 压缩可以比 gzip 的小14%。
HTML 文件会小21%。
CSS 文件会小17%
注意,图片之类的就不要在使用gzip或者 brotli 来压缩了,因为它们是已经压缩过的了。再压的话只会让文件更大。

较小的文件传输,不只是会让浏览器可以更快的载入,而且会让你的服务器节省带宽成本,或者 CDN 也会省一点。

尽管 Brotli 在压缩方面表现出色,但其优势是以其他代价为代价的。随着压缩级别的提高,Brotli 压缩所需的时间也会相应增加。换句话说,Brotli 需要更多的计算能力,这可能意味着更高的设备和软件成本。此外,Brotli 要求浏览器必须支持 HTTPS 才能使用。

gzip vs br压缩算法优劣对比

在这里插入图片描述

Brotli压缩与其算法压缩对比

下图来源于网络,从压缩比率和压缩时间来分析brotli、bzip2、gzip、xz这四种压缩算法,结果可想而知,brotli两者都位居首位

在这里插入图片描述

使用的前提

在 Chrome 中只有 https 的网站发起的请求头 Accept-Encoding 中才会加上 br 选项,此时服务端才会响应 brotli 压缩的资源。因此只有网站支持 https 时,开启 br 压缩才有价值。

使用 br 压缩

vite为例

1.安装插件
npm i -D vite-plugin-compression 
2. 配置 vite.config.ts
import { defineConfig } from 'vite'
import viteCompression from 'vite-plugin-compression'
export default defineConfig({
  plugins: [
    viteCompression({
      verbose: true,
      disable: false,
      threshold: 10240,
      algorithm: 'brotliCompress',
      ext: '.br',
    }),
  ],
})
开启 br 压缩

1. 安装插件

npm i -D rollup-plugin-brotli

2. 配置 vite.config.ts

import { defineConfig } from 'vite'
import vue from 'vue'
import brotli from 'rollup-plugin-brotli'
export default defineConfig({
  plugins: [
    vue(),
    brotli(),
  ],
})

webpack为例

1. 安装插件

npm i -D compression-webpack-plugin

2. 配置 webpack.config.ts

new CompressionPlugin({
  filename: '[path][base].br',
  algorithm: 'brotliCompress',
  test: /\.(js|css|html|svg)$/,
  compressionOptions: {
    params: {
      [zlib.constants.BROTLI_PARAM_QUALITY]: 11,
    },
  },
  threshold: 10240,
  minRatio: 0.8,
})

Nginx 开启 br 压缩

1.下载 Brotli 的源码;
yum install git && cd /usr/local/src
git clone https://github.com/google/ngx_brotli.git
pushd ngx_brotli
git submodule update --init
popd
2.执行命令 nginx -v;
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.1.1c  28 May 2019
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-http_v2_module --with-http_sub_module --with-openssl=../openssl-1.1.1c
3.追加参数 --add-module=…/ngx_brotli,重新编译 Nginx。
cd nginx-1.16.1
./configure \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-openssl=../openssl-1.1.1c \
--add-module=../ngx_brotli
make && make install

如需执行平滑升级 (热部署),make 之后请不要 make install:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade
4.接着修改 nginx.conf
http {
  # 启用 Brotli 压缩
  brotli on;

  # 设置 Brotli 压缩级别
  brotli_comp_level 6;

  # 设置启用压缩的最小文件大小
  brotli_min_length 20;

  # 指定要压缩的文件类型
  brotli_types text/plain text/css application/javascript;

  # 配置 Brotli 压缩的缓冲区大小
  brotli_buffers 16 8k;

  # 其他的 Nginx 配置项...
}

5.重载 Nginx,检验效果。
nginx -t && nginx -s reload

扩展

Brotli-G 对标准 Brotli 比特流格式的修改
允许使用 GPU 和多线程 CPU 进行高效的数据并行解压缩,同时仍保持相对较高压缩率

最后

在默认参数下, brotli 压缩方式有更好的压缩率,但是在参数调优的情况下,差距变小。
github地址:

https://github.com/google/ngx_brotli#brotli_ratio
https://github.com/google/brotli

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssrf漏洞复现

环境搭建 zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台 (github.com) 直接将其复制到linux环境下拉取docker就行 我这里已经拉去过了,如果拉去速度慢话,可以在/etc/docker下的daemon.json中配置镜像加速 vim /etc/docker/daemon.js…

大模型学习笔记 - LLM 对齐优化算法 DPO

LLM - DPO LLM - DPO DPO 概述DPO 目标函数推导DPO 目标函数梯度的推导 DPO 概述 大模型预训练是从大量语料中进行无监督学习,语料库内容混杂,训练的目标是语言模型损失,任务是next token prediction,生成的token 不可控&…

MyBatis-Plus分页插件使用详解

一、简述 在使用mybatis开发项目的时候我们通常使用pagehelper来进行分页操作, 但是我们在使用MyBatis-Plus 开发时,MyBatis-Plus内置已经有分页功能了,其实不需要在额外引入pagehelper依赖了,而且两者同时引入有时候还会导致分页…

主流商品API接口在电商跨境电商企业应用/项目中的重要作用

618狂欢已经开启,为了获取更大利益,电商商家应使用价格接口系统。价格接口对电商商家有多方面的好处,主要体现在以下几个方面: 1、价格接口系统可以帮助品牌和商家实现更加科学和精准的定价策略。通过实时获取多个主流电商平台&a…

公众号里面的试卷怎么打印

经过我们的观察发现,微信公众号中的试卷通常有两种形式:图片和文档。如果试卷是以图片的形式嵌入在文章中作为配图,您只需点击图片并长按,选择“保存图片”到手机中。之后,您可以选择任何方便的方式完成打印。 不过&am…

ELK企业级日志分析系统(分布式文件系统与企业级应用)

一、ELK 概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch 是基于Lucene(一个全文检索引擎的架构…

笔记整理—uboot启动过程(4)BL2干了什么及内存排布

uboot的第一阶段结束于start_armboot,第二阶段的uboot代码主要负责soc外部硬件(inand、网卡、......)、uboot本身构建(uboot指令、环境变量、......)最后进入命令行,等待命令然后倒数,等待bootc…

Pytest框架环境切换实战教程

测试人员每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,那么今天小编就给大家聊一下,如何能让我们python…

linux 安装kafaka单体服务

1.下载kafka的linux安装包 前往Apache Kafka官方网站下载页面(Apache Kafkahttps://kafka.apache.org/downloads),选择最新稳定版的Kafka二进制分发文件,通常是以.tgz结尾的文件。 手动下载kafka_2.13-3.8.0.tgz到本地&#xff0…

Spring Boot 与 Spring Security 的集成及 OAuth2 实现

我的主页:2的n次方_ 在现代 Web 应用开发中,安全性是至关重要的。无论是保护用户的敏感数据,还是确保 API 只允许经过授权的请求访问,开发者都需要一个强大且灵活的安全框架来实现这些需求。Spring Security 作为 Spring 框架的…

MATLAB 生成指定范围、角度、厚度的含噪平面点云(77)

模拟生成点云并可视化显示,可以验证算法有效性,尤其是针对验证算法的某方面 MATLAB 生成指定范围、角度、厚度的含噪平面点云(77) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 如题,模拟生成一组平面点云,含有噪声点,确定算法稳定性,可以指定生成平面的范围,厚…

混合A*算法

混合A*算法是一种改进版的A*算法,特别针对车辆动力学进行了优化。这种算法在经典A*的基础上引入了新的维度和概念,以生成更加实际可行的路径。 首先,混合A*算法不仅考虑x和y的位置,还引入了θ维度来表示车辆的朝向。这意味着搜索…

Unity视频播放插件-VideoPro(Windows)

Unity视频播放插件-VideoPro-windows 🌮介绍🍤使用方法🥙示例🌳rtsp🌳本地视频🌳网络视频 🌮介绍 1.支持播放格式:rtsp、http、本地视频。 2.exe试用🌈 3.经测试i9 cpu 空…

【STM32开发笔记】搭建基于ST官方VSCode扩展的STM32开发环境

搭建基于ST官方VSCode扩展的STM32开发环境 一、安装软件1.1 安装VSCode1.2 安装STM32CubeMX1.3 安装STM32CubeCLT1.4 安装ST-MCU-FINDER-PC 二、安装插件2.1 安装 STM32 VS Code Extension 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原理图3.3 修改引脚功能3.4 生成CMake项目…

完成单位信息宣传工作考核投稿别输在投稿方法上

在信息化迅速发展的今天,弘扬社会正能量已经成为各个企事业单位的重要使命。作为单位的信息宣传员,我深知信息宣传工作的重要性和复杂性。每个月,我们都肩负着信息宣传考核的任务,需要在指定的媒体上投稿发表文章。然而,刚接触这一工作时,我却经历了一段艰辛而焦虑的历程。 我一…

ubuntu install Miniconda3(轻量级conda)

ubuntu install Miniconda3(轻量级conda) Miniconda3 是一个包含 conda 和 Python 的小型发行版,适合需要灵活定制python环境的用户。 一、下载Miniconda3 sudo apt-get update wget https://repo.anaconda.com/miniconda/Miniconda3-latest…

elasticsearch快照存储到linux本地路径或分布式存储系统mioio

一、使用linux本地目录做快照存储 1.编辑 elasticsearch.yml 文件,添加以下配置: path.repo: ["/path/to/your/backup/dir"]2.创建一个文件系统类型的快照仓库 PUT /_snapshot/my_local_repository {"type": "fs",&quo…

WIN 10 注册表损坏怎么办

系统修复功能 打开“设置”-“更新和安全”-“恢复”-“立即重新启动” 然后就会进入到恢复模式,在里面点“疑难解答”-“高级选项”-“启动修复” SFC工具 在电脑搜索框中输入“命令提示符”,右键点击“命令提示符”选择“以管理员身份运行”。随后在…

前端算法 === 计数排序

目录 计数排序算法的起源 算法的基本原理 算法的实现 代码示例 算法的优势与局限性 计数排序的应用场景 计数排序是一种简单而高效的排序算法,特别适合于处理一定范围内的整数排序问题。它的核心思想是利用额外的存储空间来记录数组中每个元素出现的次数&…

Ansible远程自动化运维

目录 概念 安装ansible modules模块和语法 命令行语法 模块 1. command 基础模块 常用的参数 2. shell模块 3. cron定时任务模块 4. user用户管理模块 参数 5. copy复制模块 参数 6. file模块 设置文件属性 参数 实验:批量创建目录 7…