当前位置: 首页 > news >正文

性能优化之前端与服务端中的 Gzip 压缩全解析

在前端性能优化中,Gzip 压缩是最常见、最有效的手段之一。它能够在不改变业务逻辑的情况下,大幅减少文件传输体积,从而加快页面加载速度。本文将从原理、构建配置、服务端行为到验证方法等角度,完整讲解 Gzip 的工作机制与实践方式。


一、Gzip 压缩的原理

Gzip 是一种基于 DEFLATE 算法 的无损压缩方式。它通过两步实现压缩效果:

  1. LZ77 重复字符串匹配算法:检测文件中重复的字符串,将重复的内容替换为指针引用。

  2. Huffman 编码:对出现频率较高的字节使用更短的二进制表示,降低总体编码长度。

在前端资源(如 HTML、CSS、JS)中,这种算法尤其有效,因为这些文件中存在大量重复的关键字与结构性文本。压缩率通常可达到 60%~90%

浏览器在收到带有 Content-Encoding: gzip 的响应后,会自动解压,不需要开发者进行任何额外操作。


二、前端打包与服务端 Gzip 的关系

很多前端项目会在构建阶段使用插件(如 compression-webpack-pluginvite-plugin-compression)来生成 .gz 文件。与此同时,服务端(如 Nginx、OSS、CDN)也可以开启动态 Gzip 压缩。

需要注意的是:
两者不会导致重复压缩。

  • 如果服务端检测到请求的资源已经是 .gz 格式,会直接返回压缩后的内容,并在响应头中声明 Content-Encoding: gzip

  • 如果资源不是 gzip 文件,且服务端开启了压缩,则会在返回时动态压缩。

因此,无论是在构建阶段生成 .gz 文件,还是依赖服务端的实时压缩,都只会有一次实际的压缩操作。


三、前端开启 Gzip 打包的影响

当在前端打包阶段启用 Gzip 插件时,打包产物会在 dist 目录中多出一份 .gz 文件副本。例如:

main.js
main.js.gz

这会导致构建后的目录整体体积变大,但仅是文件数量增加,并不影响浏览器加载。实际线上访问时,服务器只会根据配置选择其中一个返回。

对于需要离线运行或本地预览的项目(如桌面端应用、离线 Web App),不建议在前端打包时生成 .gz 文件,因为:

  • 离线环境不会自动根据 Accept-Encoding 响应。

  • .gz 文件需要额外的服务端配置才能正确返回。

  • 由于 dist 包多了 .gz 文件,导致安装包体积变大

此类项目更适合直接使用未压缩版本。


四、前端上传到 OSS 后的 Gzip 生效方式

即使前端打包时未生成 .gz 文件,只要在 OSS 或 CDN 层开启了 Gzip 压缩,返回内容依然会被自动压缩。

常见的两种情况:

仅上传普通 JS 文件

  • OSS 在返回时根据浏览器请求头自动压缩。

  • 响应头会带上 Content-Encoding: gzip

上传 JS 与 .gz 文件

  • 可通过 CDN 或 OSS 规则,将 .js 请求映射到 .js.gz 文件。

  • 此时无需再开启动态压缩,直接返回静态 .gz 文件即可。

这两种方式的效果是等价的。


五、如何判断 Gzip 是否生效

判断 Gzip 是否生效,可以从以下三个角度验证:

1. 响应头信息

Content-Encoding: gzip

说明服务端返回的内容经过 Gzip 压缩。


2. 同时通常会有:

Vary: Accept-Encoding

表示服务器根据浏览器的压缩支持情况选择返回内容。

3. 传输体积

在浏览器的 Network 面板中查看:Size:文件实际大小

对比本地打包生成的 .js 文件大小与浏览器请求返回的体积,一般会发现传输文件小于原始文件。


六、请求头中的 Accept-Encoding

Accept-Encoding 是浏览器在请求中自动添加的字段,用于声明自己支持的压缩算法。常见取值如下:

Accept-Encoding: gzip, deflate, br, zstd

其中:

  • gzip:最常用的压缩方式,兼容性最佳。

  • br (Brotli):压缩率更高,但部分旧浏览器不支持。

  • deflate / zstd:在某些特定环境使用较少。

浏览器无需手动配置该字段,它由浏览器内核自动添加。服务器根据此字段返回相应的压缩格式。


七、在 Vite 中开启 Gzip 压缩的配置示例

在 Vite 项目中,可以通过 vite-plugin-compression 插件快速启用构建阶段的 Gzip 压缩:

npm install vite-plugin-compression --save-dev

vite.config.ts 中添加:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import viteCompression from 'vite-plugin-compression'export default defineConfig({plugins: [vue(),viteCompression({verbose: true,             // 控制台输出压缩结果disable: false,            // 启用压缩threshold: 10240,          // 只压缩大于 10kb 的文件algorithm: 'gzip',         // 使用 gzip 压缩算法ext: '.gz',                // 生成的压缩文件后缀deleteOriginFile: false,   // 保留源文件})]
})

执行 vite build 后,dist 目录中会同时生成原始文件与 .gz 文件:

dist/├─ assets/│   ├─ main.js│   ├─ main.js.gz│   ├─ index.css│   └─ index.css.gz

这些 .gz 文件可以直接上传至服务器或 OSS,由 CDN 根据浏览器请求头进行匹配返回。


八、服务端开启 Gzip 压缩的方法

不同服务端框架的配置方式略有不同,以下是常见示例:

1. Nginx 配置 Gzip

nginx.conf 或相应的站点配置中添加:

gzip on;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_vary on;
gzip_static on;  # 若存在 .gz 文件则直接使用

说明:

  • gzip on:启用 gzip 压缩;

  • gzip_types:指定哪些类型的文件启用压缩;

  • gzip_static on:若存在预压缩的 .gz 文件则直接返回。

2. Node.js + Express

import express from 'express';
import compression from 'compression';const app = express();
app.use(compression()); // 自动对响应启用 gzipapp.use(express.static('dist'));
app.listen(3000);

Express 的 compression 中间件会根据请求头自动判断是否返回压缩数据。

3. Koa 框架

import Koa from 'koa';
import compress from 'koa-compress';const app = new Koa();
app.use(compress());

九、总结

场景是否需要前端打包 .gz是否需要服务端配置是否会重复压缩说明
前端生成 .gz + OSS 映射建议不需要CDN 直接返回 .gz 文件
.gz 文件 + OSS 自动压缩需要动态压缩返回
离线项目不推荐使用 gzip

Gzip 的核心在于:减小传输体积、提升加载性能
实际生产中,只需确保:

  • 浏览器请求中有 Accept-Encoding

  • 响应头中有 Content-Encoding: gzip
    即表示压缩已经生效。

http://www.dtcms.com/a/490216.html

相关文章:

  • 【Day 77】Linux-iptables防火墙
  • GitHub 热榜项目 - 日榜(2025-10-16)
  • 爬虫汇总与实战
  • 哪个网站做网销更好python怎么做网站
  • dede 网站地图 插件添加图标wordpress
  • 对比k8s的service和kube-proxy
  • 理想汽车Java后台开发面试题及参考答案(上)
  • Kotlin 实现社交 App 音视频模块:语音录制、播放、暂停与进度控制全流程封装
  • Lustre/Scade 形式化语义基础 —— 同步Kahn网络 (1996)
  • 内核空间与用户空间解读
  • ELK运维之路(Filebeat第一章-7.17.24)
  • 开源接口管理工具深度横评,swagger vs PostIn哪个更适合你?
  • list的使用和模拟实现
  • 群辉怎么做网站服务器专做投放广告网站
  • 【34】MFC入门到精通——MFC 控件 ComboBox 运行点击控件下拉框 “终止“、“重试“、“忽略“、“引发异常”
  • 论文见解:REACT:在语言模型中协同推理和行动
  • Megatron-DeepSpeed 方案
  • 停止检索!刚刚这本期刊被数据库剔除!
  • Flink-Kafka 数据倾斜问题解决方案
  • html 实现鼠标滑动点亮横轴
  • 连接 TDengine 遇到报错 “failed to connect to server, reason: Connection refused” 怎么办?
  • Web自动化(三方库:Selenium)
  • 网站单页在线制作软件长尾关键词是什么意思
  • 生成静态页面网站源码信息门户网站是什么
  • 在阿里云CentOS服务器上使用Certbot为Nginx配置SSL证书
  • 如何优化网站打开速度网站运营和管理
  • 华为数通认证学习难吗?需掌握哪些核心知识点?
  • 【vue】导出excel
  • WiFi模块远程连接APP:wifi模块的应用
  • 关闭电脑的“快速启动”功能