直接用brotli替代gzip不可简单关闭gzip、开启brotli,而需依托http协商机制优先返回.br预压缩文件,保留gzip兜底,并严格限定text类mime类型,禁压已压缩二进制资源。

直接用 Brotli 替代 Gzip 是可行的,但不能简单“关掉 Gzip、打开 Brotli”就完事。关键在于配合浏览器协商机制 + 静态预压缩 + 服务端智能响应,才能真正发挥 Brotli 的优势,同时不牺牲兼容性。
确认浏览器和服务器都支持 Brotli
Brotli 需要两端配合:客户端(浏览器)声明支持,服务端(如 Nginx)具备压缩能力并启用模块。
- 现代主流浏览器(Chrome 49+、Firefox 44+、Edge 15+、Safari 11+)均默认支持
br编码,且要求 HTTPS 环境(HTTP/1.1 下部分浏览器可能降级) - Nginx 默认不带 Brotli 模块,需手动编译安装
ngx_brotli,或使用已集成该模块的发行版(如 Cloudflare 官方 Nginx 镜像、某些 Linux 包管理器提供的版本) - 可通过浏览器开发者工具的 Network 标签页查看响应头:
Content-Encoding: br表示成功启用;若看到gzip或无该字段,则未生效
优先采用静态预压缩而非实时压缩
Brotli 压缩耗 CPU,尤其高阶级别(如 level 11)。对每次请求都实时压缩,会显著增加服务器负载。更推荐在构建阶段生成 .br 文件,由 Web 服务器按需提供。
- Vite 项目中可添加
vite-plugin-compression,配置algorithm: 'brotliCompress',自动为.js、.css、.html输出.br文件 - Webpack 可用
brotli-webpack-plugin或compression-webpack-plugin(v9+ 支持 Brotli) - 输出后,确保原始文件(如
index.js)和压缩副本(index.js.br)同目录存放,便于 Nginx 查找
Nginx 配置支持 .br 文件智能服务
启用 ngx_brotli 后,Nginx 可以根据请求头中的 Accept-Encoding: br 自动返回预压缩的 .br 文件,无需动态计算。
- 核心配置示例:
brotli on;<br>brotli_comp_level 6;<br>brotli_types text/plain text/css application/json application/javascript application/xml image/svg+xml;<br>brotli_static always;
-
brotli_static always表示始终查找并返回已存在的.br文件(即使原始文件更新,也需重新构建生成新.br) -
brotli_types列出需支持 Brotli 的 MIME 类型——注意不要对图片(.png、.jpg)、字体(.woff2)等已压缩格式开启,否则无效甚至增大体积 - 保留 Gzip 配置作为 fallback(例如
gzip on; gzip_vary on;),确保不支持 Brotli 的旧设备仍能获得压缩收益
验证与渐进式上线
上线前务必验证实际效果,避免配置错误导致资源无法加载。
- 用
curl -H "Accept-Encoding: br" -I https://yoursite.com/app.js检查响应头是否含Content-Encoding: br和Vary: Accept-Encoding - 对比同一资源的
.js、.js.gz、.js.br体积:典型 JS/CSS 文件,Brotli level 6 比 Gzip level 6 小约 17–20% - 建议先对静态资源(如构建产物)启用,再逐步覆盖 API 响应(需服务端框架支持,如 Express 的
compression中间件启用 Brotli)











