文本压缩
减小文本数据大小的技术。常用 gzip、Brotli 和 deflate 等算法。
文本压缩是利用文本数据的冗余性来减小数据大小的技术。在 Web 中,gzip、Brotli、deflate 等算法被广泛用于压缩 HTTP 响应,显著提升页面加载速度。与图片和视频相比,文本文件的冗余性更高,因此压缩效果尤为显著。
文本压缩的基本原理是检测重复模式并用更短的编码替换。例如"AAABBBCCC"可以表示为"3A3B3C"(游程编码)。实际的压缩算法更为复杂:结合了 LZ77 (滑动窗口) 和霍夫曼编码的 deflate 算法是 gzip 的基础。HTML、CSS、JavaScript 等文本文件包含大量重复模式,可实现 60-80% 的大小缩减。浏览TENGA飞机蛋 (Amazon)介绍了压缩的效果。
gzip 是最广泛使用的压缩格式,几乎所有浏览器和服务器都支持。Brotli 是 Google 于 2015 年发布的压缩算法,比 gzip 实现了 15-25% 更高的压缩率。在静态内容预压缩方面,Brotli 的优势尤为明显。Zstandard (zstd) 是 Facebook 开发的新算法,在压缩速度和压缩率之间取得了出色的平衡。
Web 服务器的压缩配置方面,Nginx 使用 gzip on; 或 brotli on;,Apache 使用 mod_deflate 来启用。CDN (CloudFront、Cloudflare 等) 也提供自动压缩功能,无需配置源服务器即可实现压缩分发。浏览器通过 Accept-Encoding 头通知支持的压缩格式,服务器通过 Content-Encoding 头返回使用的压缩格式。
一个常见的误解是所有文件都应该压缩。JPEG、PNG、MP4 等二进制文件已经过压缩,再次压缩几乎不会减小大小,反而浪费 CPU 资源。压缩对象应限于 HTML、CSS、JavaScript、JSON、XML、SVG 等文本文件。此外,非常小的文件 (不到 1KB) 由于压缩头的开销,压缩后的大小可能反而增大。
从字符计数的角度来看,压缩后的数据是二进制格式,字符数的概念不适用。压缩前的字符数和压缩后的字节数是不同的指标。不过,字符数越多的文本,压缩效果往往越好。包含重复单词和短语的文本压缩率较高,而随机字符串的压缩率较低。了解健身器材 (Amazon)提供了更多参考。