HTML Minifier Next(HMN)发布 9.0.0,这一轮更新的重点不在"又少压了几个字节",而在**它把判断标准交给了独立基准**。作者 Jens Oliver Meiert 同时上线了 Minifier Benchmarks 项目,用 100 多个真实站点横向对比 @swc/html、HMN、htmlcompressor.com、htmlnano、minify、minify-html、Minimize 七款压缩器的输出体积与处理耗时。

基准分两档:一档只用"保持输出合法"前提下的最激进设置,是可比的同类对比;另一档开放各压缩器的全部合法特性,属于"谁更狠"的不可比对比。把两档拆开是有意为之——混在一起会得出"某某压缩率最高"的假结论,实际只是它敢用的手段更多。压缩器作者可以自行提交配置,这比作者自测自夸要可信。

三个具体改动

**自闭合外来元素**。`selfCloseForeignElements`(含在 comprehensive 预设里)现在能把空的 SVG / MathML 元素写成自闭合形式,`<path d="…"></path>` 变成 `<path d="…"/>`。但 `foreignObject` 里那些真正的 HTML 元素仍然保留闭合标签——这条边界划得很准,因为浏览器对外来内容里嵌套 HTML 的解析规则完全不同,一刀切会破坏文档结构。

**多删冗余属性**。`removeRedundantAttributes` 扩展到了 HTML 本来就会忽略的命名空间声明,比如内联 SVG 上的 `xmlns="http://www.w3.org/2000/svg"`、`html` 上的 XHTML 命名空间。同时会清理 SVG 的默认值,但**绕开两类**:会继承的 presentation 属性,以及相互引用的 gradient / pattern / filter。删掉前者会改变渲染,删掉后者会断引用。

**JSON 压缩改为显式开启**。以前 HMN 自动压缩 `script` 元素里的 JSON(`application/ld+json`、importmap、speculationrules),且无法关闭。这跟它处理 CSS、JS、SVG 的方式不一致,也跟其他压缩器不一致,于是新增 `minifyJSON` 选项,默认关闭;comprehensive 预设包含它,conservative 预设需要手动开。

更值得注意的正确性修复

JSON 压缩的实现方式换了。原来的做法是解析再重新序列化,这会悄悄改值:大整数丢精度(`12345678901234567890` 变成 `12345678901234567000`)、超出范围变成 `null`、`-0` 变成 `0`、重复键被丢弃。现在只做两件事——去掉 token 之间的空白、缩短字符串里的转义。这个 bug 类型很典型:**用语义化的方式做本该是字节级的操作,结果把数据改坏了还没人发现**。结构化的 `application/ld+json` 一旦大整数被截断,受害的是搜索引擎的解析结果,肉眼几乎测不出来。

怎么看这次更新

对日常项目,最实用的两点是:想换压缩器时先看 Minifier Benchmarks 而不是拍脑袋;用 conservative 预设有 JSON-LD 的站点,要主动开 `minifyJSON` 才能继续压缩。对做工具的人,这次更新示范了一件事——把"我更快"变成"这里有可复现的第三方跑分",比写十段营销文案都有说服力。

阅读原文 → 返回 AI 技术文档

内容与图片版权归原作者所有 · 原文: https://meiert.com/blog/html-minifier-next-updates-8/