前端性能优化-Gzip工作原理

news2026/4/2 12:35:50

Gzip

本节整理 Gzip 相关的知识点

Gzip

Gzip(GNU Zip)是一种数据压缩和文件格式的算法。它主要用于在网络传输中减小数据的大小,从而提高传输速度。Gzip 使用 DEFLATE 算法对数据进行压缩,同时还包括一些额外的文件头信息和校验信息。

DEFLATE 算法

DEFLATE 是 Gzip 压缩算法的基础。它是一种无损数据压缩算法,结合了两种主要的压缩技术:霍夫曼编码和 LZ77 算法。

  • LZ77 算法: 这是一种基于滑动窗口的压缩算法。它通过查找以前出现过的相似数据片段,并用指向先前出现位置的指针来表示这些片段,从而实现压缩

  • 霍夫曼编码: 这是一种变长编码,其中不同的符号(或字符)被映射到不同长度的比特串。频率更高的符号使用较短的比特串,而频率较低的符号使用较长的比特串,以实现更好的压缩效果。

Gzip 的工作原理

Gzip 的压缩基本原理是通过移除数据中的冗余信息来减小文件大小。这包括重复的字符串、无用的空格以及其他可以通过编码技术表示的模式。压缩算法的目标是通过使用更少的位来表示相同的信息,从而减小文件的体积。

  • 重复数据的检测和消除: 压缩算法会识别并删除文件中的重复数据片段,以减小文件大小。

  • 霍夫曼编码: 通过使用频率较高的符号的短编码,减小整体文件的大小。

  • LZ77 算法: 通过指向先前出现的数据片段的指针,而不是重复存储相同的片段,实现数据的更有效存储。

Gzip 在 web 中的优势

Gzip 在 Web 中的优势主要体现在减小文件大小、提高页面加载速度以及降低带宽占用,从而加速资源传输。

减小文件大小

  1. 压缩文本内容:HTML、CSS、JavaScript 等文本文件中通常存在大量的重复信息和空白字符。Gzip 通过使用压缩算法,如 DEFLATE,来消除这些冗余信息,使文本文件更紧凑,从而减小文件大小。

  2. 优化图像: 尽管 Gzip 主要用于文本内容的压缩,但在一些情况下也可以与其他压缩技术结合使用,例如图片压缩。当服务器启用 Gzip 压缩时,通常也会对图像文件使用更高效的压缩算法,以进一步减小图像文件的大小。

提高页面加载速度

  1. 减少传输时间: 较小的文件大小意味着数据可以更快地从服务器传输到客户端。当浏览器请求页面资源时,较小的文件将更快地到达用户终端,从而提高页面加载速度。

  2. 加快渲染时间: 页面加载速度不仅取决于文件传输的速度,还取决于浏览器加载和渲染这些文件的速度。由于文件更小,浏览器可以更快地解析和渲染页面,提高用户体验。

服务器端如何开启 Gzip

在服务器端配置 Gzip 压缩涉及两个主要方面:启用 Gzip 压缩和配置服务器以识别支持 Gzip 的浏览器。

Nginx

在 Nginx 服务器上,可以使用 gzip 模块来启用 Gzip 压缩。在配置文件中添加以下配置:

gzip on;
gzip_types text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json;

配置服务器以识别支持 Gzip 的浏览器:


gzip_proxied any;

此配置告诉 Nginx 在检查 Accept-Encoding 头时考虑任何代理服务器的值。

Nodejs

nodejs 中使用 compression 中间件来开启 Gzip 压缩

示例代码如下:

const express = require("express");
const compression = require("compression");
const fs = require("fs");

const app = express();
const port = 3000;

// Use compression middleware only for the /gzip route
app.use("/gzip", compression());

app.get("/", (req, res) => {
  // Return the non-Gzip version
  res.sendFile("public/index.html", { root: __dirname });
});

app.get("/gzip", (req, res) => {
  // Return the Gzip version
  res.sendFile("public/index.html", { root: __dirname });
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});

本文首发于个人博客前端开发笔记,由于笔者能力有限,文章难免有疏漏之处,欢迎指正

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

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

相关文章

第二十一天培训笔记

上午 1 、环境准备 2 、安装 mysql 绿包 3 、配置 mysql 工作环境 mysql -hip 地址 -p3306 -uroot -p (远程连接使用) 4 、 mysql 基础命令 ( 1 )修改密码 ( 2 )授权远程登录 ( 3 &#x…

程序员短视频上瘾综合症

一、是你疯了还是面试官疯了? ​ 最近有两个学员咨询问题,把我给整得苦笑不得。大家来看看,你有没有同样的症状。 ​ 第一个学员说去一家公司面试,第一轮面试聊得挺好的。第二轮面试自我感觉良好,但是被面试官给Diss…

模型优化学习笔记—对比各种梯度下降算法

import mathimport numpy as np from opt_utils import * import matplotlib.pyplot as plt# 标准梯度下降 def update_parameters_with_gd(parameters, grads, learning_rate):L len(parameters) // 2for l in range(1, L 1):parameters[f"W{l}"] parameters[f&q…

【uniapp】聊天记录列表长按消息计算弹出菜单方向

1. 效果图 1.1 消息靠上接近导航栏&#xff0c;菜单显在消息体下方弹出&#xff0c;箭头向上 1.2 消息体没有贴近上方导航栏&#xff0c;菜单在消息体上方弹出&#xff0c;箭头向下 1.3 长消息&#xff0c;菜单在手指按下的位置弹出&#xff0c;无箭头 2. 代码实现 <view …

sqli 1- 10

sql靶场 第一关 首先我们需要判断是否存在sql注入点&#xff0c;前端界面提示我使用ID作为参数,在url地址栏输入?id1 通过输入不同的id值查询数据库相对应的内容&#xff0c;之后判断为数字型还是字符型 根据查询内容判断为字符型且有注入点&#xff0c;再通过联合查询&…

Vitis AI 基本操作+模型检查(inspector)用法详解

目录 1. 简介 2. 代码详解 2.1 导入所需的库 2.2 创建 Inspector 2.3 下载模型 2.4 检查模型 3. 其他有用函数 3.1 查看 torchvision 中模型 3.2 保存模型 3.2.1 保存模型参数 3.2.2 保存完整模型 3.2.3 加载模型 4. 总结 1. 简介 在《Vitis AI 构建开发环境&…

GNSS相关知识

各定位系统的频段&#xff1a; SystemSignalFrequency(MHz)GPSL1C/A1575.42L1C1575.42L2C1227.6L2P1227.6L51176.45   GLONASSL1C/A1598.0625-1609.3125L2C1242.9375-1251.6875L2P1242.9375-1251.6875L3OC1202.025   GalileoE11575.42E5a1176.45E5b1207.14E5AltBOC1191.…

SpringBoot之外部化配置

前言 SpringBoot 版本 2.6.13&#xff0c;相关链接 Core Features Default properties (specified by setting SpringApplication.setDefaultProperties).PropertySource annotations on your Configuration classes. Please note that such property sources are not added …

如何在群晖NAS中搭建影音管理利器nastool并实现远程访问本地资源

文章目录 前言1. 本地搭建Nastool2. nastool基础设置3. 群晖NAS安装内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 Nastool是为群晖NAS玩家量身打造的一款智能化影音管理利器。它不仅能够满足电影发烧友、音乐爱好者和追剧达人的需求&#xff0c;更能让你在繁忙的生活…

疯狂的马达——Arduino

本次学习目标 1、了解马达的运用、以及马达内部的基本原理。 2、学会通过编程控制马达的速度、方向。 3、制作电位器换挡风扇。 马达 “马达”为英语motor的音译&#xff0c;我们称为电机&#xff0c;电机又可分为 发电机和电动机。前者是一种能够将动能转化电能的装置&am…

【知识】pytorch中的pinned memory和pageable memory

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 概念简介 pytorch用法 速度测试 反直觉情况 概念简介 默认情况下&#xff0c;主机 &#xff08;CPU&#xff09; 数据分配是可分页的。GPU 无…

计算机系统的基本结构-CSP初赛知识点整理

真题练习 [2021-CSP-J-第3题] 目前主流的计算机储存数据最终都是转换成&#xff08; &#xff09;数据进行储存。 A.二进制 B.十进制 C.八进制 D.十六进制 [2020-CSP-J-第1题] 在内存储器中每个存储单元都被赋予一个唯一的序号&#xff0c;称为( ) A&#xff0e;地址 B&a…

探索 Electron 应用的本地存储:SQLite3 与 Knex.js 的协同工作

electron 简介 Electron 是一个使用 JavaScript, HTML 和 CSS 构建跨平台桌面应用程序的框架。 它允许开发者使用 Web 技术来创建桌面软件&#xff0c;而不需要学习特定于平台的编程语言。 Electron 应用程序实际上是一个包含 Web 内容的 Chromium 浏览器实例&#xff0c;并…

创建型模式(Creational Patterns)之工厂模式(Factory Pattern)之简单工厂模式(Simple Factory Pattern)

1.简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff0c;又叫做静态工厂方法&#xff08;Static FactoryMethod Pattern&#xff09;。 1.1 基本介绍 被创建的对象称为“产品”&#xff0c;创建产品的对象称为“工厂”。如果要创建的产品不多&#xff0c;只…

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

一、多语言切换&#xff08;需重启&#xff09; 1、配置文件添加Key <appSettings><add key"language" value"zh-CN"/></appSettings> 2、新增附加属性当前选择语言 public CultureInfo SelectLanguage{get > (CultureInfo)GetValu…

使用Go语言绘制柱状图教程

使用Go语言绘制柱状图教程 本文将介绍如何使用Go语言及gg包绘制柱状图&#xff0c;并将图表保存为PNG格式的图片。gg包是一个功能强大的2D图形库&#xff0c;适合用于绘制各种图表。 安装gg包 首先&#xff0c;确保你已经安装了gg包。如果还没有安装&#xff0c;可以使用以下…

Java二十三种设计模式-组合模式(11/23)

组合模式&#xff1a;构建层次化结构的灵活方案 引言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。 基础知识&…

Linux 命令,mkdir说明与使用

1&#xff1a;mkdir命令功用&#xff1a; 用于创建一个或多个目录&#xff0c;创建目录&#xff0c;必须在父目录中写上权限。 新目录的默认模式为0777&#xff0c;可以由系统或用的umask来修改。 2&#xff1a;命令构件: mkdir [options] directories 3:参数选项: -m&#x…

海洋知识竞赛规则流程方案

为贯彻落实“进一步关心海洋、认识海洋、经略海洋”的重要指示精神&#xff0c;引导社会公众学习海洋知识、增强海洋意识、保护海洋环境&#xff0c;推动建设海洋强国&#xff0c;推进人与自然和谐共生的现代化&#xff0c;围绕“保护海洋 人与自然和谐共生”的主题&#xff0c…

机械学习—零基础学习日志(高数22——泰勒公式理解深化)

核心思想&#xff1a;函数逼近 在泰勒的年代&#xff0c;如果想算出e的0.001次方&#xff0c;这是很难计算的。那为了能计算这样的数字&#xff0c;可以尝试逼近的思想。 但是函数又不能所有地方都相等&#xff0c;那退而求其次&#xff0c;只要在一个极小的范围&#xff0c;…