HTML 压缩与 Gzip 的区别与配合

工具相关 ·

引言

网站性能优化中,"压缩"一词经常出现,但含义不同。HTML 代码压缩和 Gzip 传输压缩是两种不同的优化手段,理解它们的区别和配合方式,对提升网站性能至关重要。

两种压缩的本质

HTML 代码压缩

层面:代码层面 原理:移除不必要的字符 时机:构建/部署时 工具:html-minifier、在线压缩工具

<!-- 压缩前 -->
<div class="container">
    <h1>标题</h1>
    <p>这是一段文字</p>
</div>

<!-- 压缩后 -->
<div class="container"><h1>标题</h1><p>这是一段文字</p></div>

Gzip 传输压缩

层面:传输层面 原理:使用算法压缩文件内容 时机:服务器传输时 工具:Nginx、Apache、CDN

原始文件 → Gzip 压缩 → 网络传输 → 浏览器解压 → 渲染

详细对比

特性HTML 代码压缩Gzip 传输压缩
压缩对象HTML 语法结构文件二进制内容
压缩算法规则替换DEFLATE/Brotli
压缩率20-40%60-80%
可逆性不可逆(注释丢失)完全可逆
实施位置构建工具/部署前服务器/CDN
浏览器支持所有浏览器所有现代浏览器
对 SEO 影响无无

压缩效果对比

单独使用 HTML 压缩

原始 HTML:50 KB
压缩后 HTML:35 KB(减少 30%)
传输大小:35 KB

单独使用 Gzip

原始 HTML:50 KB
Gzip 压缩后:15 KB(减少 70%)
传输大小:15 KB

两者配合使用

原始 HTML:50 KB
HTML 压缩后:35 KB
Gzip 压缩后:10 KB(减少 80%)
传输大小:10 KB

结论:两者配合效果最佳。

为什么配合使用效果更好?

1. HTML 压缩为 Gzip 创造更好条件

Gzip 通过查找重复模式来压缩,HTML 压缩后:

  • 减少了冗余字符
  • 结构更紧凑
  • 重复模式更明显
// 压缩前,Gzip 需要处理大量空白
<div class="container">\n    <h1>标题</h1>\n    <p>文字</p>\n</div>

// 压缩后,Gzip 处理更紧凑的内容
<div class="container"><h1>标题</h1><p>文字</p></div>

2. 减少 Gzip 的工作量

HTML 压缩已经移除了大量无用字符,Gzip 可以更专注于有效内容的压缩。

服务器配置

Nginx 配置 Gzip

# 开启 Gzip
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript text/html;
gzip_vary on;
gzip_proxied any;
gzip_buffers 16 8k;

Apache 配置 Gzip

# 开启 Gzip
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/json
</IfModule>

Brotli 配置(更优选择)

# Nginx Brotli 配置
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript text/html;

Brotli 比 Gzip 压缩率高 15-20%,但需要 HTTPS 支持。

最佳实践

1. 构建流程集成 HTML 压缩

// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    plugins: [
        new HtmlWebpackPlugin({
            minify: {
                collapseWhitespace: true,
                removeComments: true,
                removeRedundantAttributes: true,
                removeScriptTypeAttributes: true,
                removeStyleLinkTypeAttributes: true,
                useShortDoctype: true
            }
        })
    ]
};

2. 服务器开启 Gzip/Brotli

确保所有文本资源都启用传输压缩。

3. 设置合理的缓存

# 压缩后的文件长期缓存
location ~* \.(html|css|js)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

4. 使用 CDN

CDN 通常自动处理 Gzip,且节点离用户更近。

验证压缩效果

浏览器开发者工具

  1. 打开 Network 面板
  2. 查看请求头:

- Content-Encoding: gzip 表示 Gzip 生效 - Content-Encoding: br 表示 Brotli 生效

  1. 对比 Size(传输大小)和 Content(原始大小)

命令行测试

# 测试 Gzip
curl -H "Accept-Encoding: gzip" -I https://example.com

# 测试 Brotli
curl -H "Accept-Encoding: br" -I https://example.com

在线工具

  • Google PageSpeed Insights
  • GTmetrix
  • WebPageTest

常见误区

误区一:只开 Gzip 不做代码压缩

虽然 Gzip 效果显著,但代码压缩能进一步减少体积,且对 Gzip 有加成效果。

误区二:压缩率越高越好

# 不推荐:最高压缩级别
gzip_comp_level 9;  # CPU 消耗大,收益小

# 推荐:平衡压缩率和性能
gzip_comp_level 6;

误区三:忽略小文件

# 推荐:设置最小压缩阈值
gzip_min_length 1k;  # 小于 1KB 不压缩

总结

HTML 代码压缩和 Gzip 传输压缩是互补的优化手段。前者在构建时减少冗余,后者在传输时压缩数据。两者配合使用,才能最大化网站性能。

阅读 50