Brotli压缩后JS文件反而变大,是配置问题还是服务器不支持?

端木爱豪 阅读 24

我用Express配置了Brotli压缩,但发现压缩后的JS文件比Gzip版本还大,这是怎么回事?

我按照网上的教程在Node服务里这样写配置:


const compression = require('compression');
app.use(compression({
  threshold: 0,
  brotli: {
    params: {
      [zlib.constants.BROTLI_PARAM_QUALITY]: 11,
      [zlib.constants.BROTLI_PARAM_LGWIN]: 22
    }
  }
}));

用在线压缩测试工具发现,原始文件12KB,Gzip后是5KB,但Brotli压缩后反而变成6KB。服务器是AWS EC2,Nginx代理到Node服务,可能哪里出问题了?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
技术伊果
问题应该出在你的 Brotli 配置和实际生效情况上。首先,express 的 compression 中间件默认并不支持 Brotli,你用的这个配置根本不会生效。compression 只支持 Gzip 和 Deflate,它内部用的是 zlib,根本不处理 BROTLI_PARAM_QUALITY 这些参数。

你现在看到的所谓“Brotli 压缩后变大”,大概率是没压缩或者被 fallback 成了别的格式,甚至可能是原始文件。真正的问题是你当前的方案压根没开启 Brotli。

要真想用 Brotli,有两个靠谱方案:

第一,换中间件。用 shrink-ray-current 或者 iltorb 相关的中间件,比如:

const shrinkRay = require('shrink-ray-current');
app.use(shrinkRay());


这玩意才真正支持 Brotli + Gzip 自动协商。

第二,如果你用了 Nginx,干脆把压缩交给它来做。Nginx 1.11+ 支持 Brotli,装好 ngx_brotli 模块后,在配置里加上:

brotli on;
brotli_comp_level 6;
brotli_types application/javascript;


然后 Node 层就别搞压缩了,让 Nginx 统一处理,反而更稳定高效。

你现在这种半吊子配置,不仅没启到作用,还可能因为错误参数导致输出异常,建议先检查响应头看 Content-Encoding 到底是什么,再决定走哪条路。
点赞 2
2026-02-13 02:06
UX亚美
UX亚美 Lv1
BROTLI_PARAM_LGWIN 参数设置太大了,改小一点试试看。
app.use(compression({
threshold: 0,
brotli: {
params: {
[zlib.constants.BROTLI_PARAM_QUALITY]: 11,
[zlib.constants.BROTLI_PARAM_LGWIN]: 20 // 调整为20
}
}
}));

另外,Nginx也可能影响压缩效果,检查下Nginx的gzip_typesgzip_vary配置是否正确。
点赞 14
2026-01-28 22:01