HTML压缩

删掉普通注释、折叠标签之间的换行与缩进,pre、script、style 这些「空白即语义」的区块一个字不动,条件注释可以选择保留,压缩前后字节数当场对比。

原始795 字节
压缩后696 字节
节省99 字节
节省率12.5%
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>压缩演示页</title><!--[if lt IE 9]><script src="html5shiv.js"></script><![endif]--><style>
    .card {
      margin: 0 auto;
      padding: 12px;
    }
  </style><script>
    var t = "script 内部一个字都不动"; // 注释同样不动
  </script></head><body><header><h1>柳泉工具示例页</h1><nav><a href="/">首页</a><a href="/kaifazhegongju/htmlgeshihua/">还原排版</a></nav></header><pre>
    pre 里的换行与缩进
      全部原样保留
  </pre><blockquote>引用块里的 换行会折叠成一个空格。</blockquote><p>标签之间的换行与缩进 压缩后不再占字节。</p></body></html>

处理规则明细(示例页的命中情况)

输入片段压缩后依据
<!-- 说明 -->删除普通注释整段移除
<!--[if lt IE 9]>…<![endif]-->原样条件注释,IE 降级脚本靠它生效
标签之间的换行与缩进删除> 与 < 之间的空白直接去掉
文本里的连续空格、换行1 个空格折叠后渲染结果不变
<pre>…</pre>原样空白本身就是内容
<script>…</script>原样换行分隔着 // 注释与正则字面量
<style>…</style>原样避免碰到 calc() 等对空格敏感的值
<blockquote> 等文本块内换行1 个空格与正文同等折叠
<a>首页</a> <a>下一页</a>空格一并删除行内元素间距消失,需要 margin 补
属性之间的多余空格1 个空格属性分隔至少留一个
属性引号保留省引号在值含空格时会碎,风险见正文
<!DOCTYPE html>原样不是注释,删了会触发怪异模式
&#160; 等实体原样实体表达的是字符,不参与空白折叠
大写 <PRE>原样保护保护区块匹配大小写不敏感
未闭合的 <!--原样并警告找不到结束符不乱动,提示先修好

表里先显示 12 行,点「加载更多」展开全部 15 行;「复制对照表」复制制表符分隔文本,「导出 CSV」带 UTF-8 BOM,Excel 打开不乱码。

使用方法

  1. 页面打开时输入框里已经放好一个 32 行的示例页面,原始体积 795 字节;结果区给出的就是它压缩后的样子,696 字节,省下 99 字节、节省率 12.5%。先看一眼这段,就知道输出长什么样。
  2. 换成自己的页面时整段粘贴覆盖即可,不需要先手工整理。这个 HTML压缩工具按「区块」切分文本:pre、script、style、textarea 四种标签整体保护,其余部分才做注释与空白处理。
  3. 两个开关控制行为:「删除普通注释」勾着时,<!-- --> 会被移除,而 <!--[if …]> 开头的条件注释原样保留;取消勾选则连普通注释也留下。「折叠标签间空白」控制换行与缩进的去留,改完即时重算。
  4. 键盘党在输入框里按 Ctrl + Enter(macOS 用 Cmd + Enter)触发,Enter 留给换行。「复制结果」拿压缩后的文本,「下载 .html」存成文件直接可部署。
  5. 下面的「处理规则明细」表列出每类片段的去向。想核对「哪一处空白被删了」,看这张表比肉眼比对快。

这个HTML压缩工具能解决什么问题

一是给模板和静态页瘦身。示例页 795 字节压到 696 字节,省 99 字节(12.5%);真实的整页模板换行缩进更多,收益比例还会更高。这些字节在每次请求里都要重发一遍,对流量和首字节都有意义。

二是压缩后再叠加 gzip。示例文本单独 gzip 是 570 字节,先经本页压缩再 gzip 是 531 字节——HTML 的缩进空白本来就是 gzip 最擅长压的内容,所以两条路有重叠,但叠加后仍然省出 39 字节,等于每层各干各的活。

三是内联到别处的 HTML 片段。邮件模板、JS 里拼的 innerHTML 字符串、单文件 HTML demo,这些场景没有构建器代劳,粘贴进来压一遍是唯一现实的手工手段。

四是把「哪里不能压」实验清楚。把含 pre 或 script 的页面反复开关两个选项各压一次,立刻看清保护区块的边界在哪,比背规则直观。明细表会同步反映每次的命中情况。

本页不做这些事:不改写标签结构(不删可选闭合标签、不合并属性)、不省略属性引号、不压缩内联的 CSS/JS 内容、不做语法校验。要把压缩后的页面还原成可读排版,用页面底部的「HTML格式化」;要查语法错误,用「HTML校验」。

压缩原理:注释、空白与保护区块

核心流程是一刀切分、两路处理:先用一个带捕获组的正则把原文切成「自由段」与「保护区块」交替的序列——匹配 <pre>、<textarea>、<script>、<style> 四种开标签到对应闭标签的整段(大小写不敏感,跨行匹配)。捕获组让 String.split 把区块本身也留在数组里,下标为奇数的是区块,原样拼回;下标为偶数的自由段才做下面两步。

注释删除带一条例外。自由段里匹配 <!--(?!\\[if)[\\s\\S]*?--> 整段移除,负向先行断言 (?!\\[if) 排除 <!--[if 开头的条件注释——IE 的降级脚本(如 html5shiv)完全依赖它,删掉等于把老浏览器打回没有 HTML5 标签的时代。这也是「属性引号省略」同款的风险逻辑:省字节的空间存在,但破坏面不可控。示例页里有 1 条普通注释被删,而条件注释连内部脚本一起完整保留。

空白折叠分两步走。第一步把自由段里的连续空白(空格、换行、制表符)折成一个空格——HTML 渲染时连续空白本来就是一个空格,所以这一步视觉零影响;第二步把 > 与 < 之间的空白直接删掉——标签之间的空格不参与文本渲染,只对行内元素(a、span、em 等)的相邻间距有影响,示例页 nav 里两个链接之间的空格就是这样消失的。首尾残余空白最后裁掉。

保护区块是安全边界。pre 的空白就是内容本身;script 里的换行可能分隔着 // 注释、正则字面量或 ASI 依赖(省略分号的自动插值),删了就是改代码;style 里 calc(100% - 8px) 这类值对空格敏感。示例页共 4 个保护区块,全部逐字保留。

体积口径用 UTF-8 字节而不是字符数:encodeURIComponent 配合计数把多字节字符按 3 字节(CJK 常用区)计。压缩比 = 原始字节 ÷ 压缩后字节,节省率 =(原始 − 压缩后)÷ 原始,两个口径并列展示,避免「压缩率 40%」这种说不清基准的表述。

完整示例(数值仅作演示)

示例条件与页面打开时的默认状态完全一致:两个开关都勾选,输入是那个 32 行、795 字节的示例页。实测输出:

条件注释 <!--[if lt IE 9]><script src="html5shiv.js"></script><![endif]--> 在输出里一字不差——先按保护区块切走内部的 script,剩下的 <!--[if 与 <![endif]--> 分别落在两段自由文本里,都不匹配注释删除规则,于是完整存活。

输入范围与处理规则对照表

输入上限 20 万字符(maxlength 计),超出按具体数值报错。下面这张表列出各类片段在压缩时的去向,遇到「为什么这处没被压掉」,先在这里对一眼:

三个与输入有关的具体限制:输入没有任何 < 时判定「不是 HTML」并报错;压缩结果为空(只有注释或空白)时明确报错而不是给你空文件;检测到 <!-- 找不到配对的 --> 时保留原文并在提示区警告,绝不把半截注释后面的正文吞掉。这份 HTML压缩工具的原则是宁可少压、不能错删。

结果边界与字节口径

常见问题

为什么 script 和 style 里的内容一个字都不动?

script 里的换行可能承担语法职责:// 行注释靠换行结束,正则字面量与字符串里的空白有语义,省略分号的写法依赖自动分号插值。style 里 calc(100% - 8px) 的减号两侧空格是语法要求。对这些内容做折叠等于改代码,所以 HTML压缩工具把它们整段划为保护区块,原样拼回。

条件注释为什么能被识别并保留?

判断只看开头:注释删除的正则在 <!-- 后面跟了一个负向断言 (?!\[if),凡是以 [if 开头的注释一律跳过。条件注释内部的 <script> 又恰好被保护区块规则先行切走,所以从 <!--[if …> 到 <![endif]--> 整段完整存活。需要连条件注释也删掉时,取消勾选「删除普通注释」即可。

压缩后两个链接粘在一起了,怎么办?

那是「折叠标签间空白」删掉了行内元素之间的空格,块级标签之间没有这个问题。三个解法:给相邻行内元素加 margin 或 gap;关掉「折叠」开关只删注释;或者接受粘排、用 CSS 控制间距——生产环境的 HTML 本来就建议间距全部交给样式层。

压缩率是怎么算的?为什么和别的工具数字不一样?

本页给两个口径:节省率 =(原始字节 − 压缩后字节)÷ 原始字节,压缩比 = 原始字节 ÷ 压缩后字节。示例页分别是 12.5% 和 1.14。其他工具有的按字符数算、有的按去掉的字符数算,口径不同数字自然不同;对比时先确认是不是 UTF-8 字节口径。

会不会把我的 JS 或 CSS 压坏?

不会碰到内容本身,但有一个前提:</script> 与 </style> 必须完整。切分正则匹配到闭标签为止,闭标签缺失时该区块按普通文本折叠空白。工具会核对四类标签的开闭数量,不等就警告。另外 script 内部含 </script> 字符串的场景(拼接脚本标签的代码)属于已知的 HTML 解析级难题,本页与其他压缩器一样无法完美处理,建议先改写为 <\/script>。

能反向操作把压缩过的 HTML 还原吗?

可以,但不是在本页。压缩是有损排版、无损内容的操作:删掉的注释找不回来,折叠的空白也无法知道原来缩进几格。还原排版请用「HTML格式化」,它按标签结构重新缩进,输出干净的可读版本。两个工具一个管上线体积、一个管人读,来回配合用。

为什么中文页面的节省率看起来偏低?

字节口径下中文每字 3 字节,而注释和缩进大多是单字节的 ASCII——同样的「删掉一段」,分母里中文权重越高,节省率越低。示例页 795 字节压到 696 字节;换成纯英文模板,同比例的空白能算出更高的百分比。这不代表中文页省得少:绝对字节数一样,只是基准不同。

压缩会影响 SEO 或搜索引擎抓取吗?

不会。抓取器解析的是 DOM,标签之间的空白与缩进不参与语义;正文文字一个都没变。真正要留意的是别误删 <pre> 里的空白和条件注释——前者是页面内容的一部分,后者影响老浏览器的标签兼容,本页的保护规则就是为了这两条。

相关工具