什么是 HTML 压缩?
HTML 压缩是在不改变浏览器渲染效果的前提下缩小 HTML 文档体积的过程。HTML 压缩工具会移除仅供开发者阅读的字符:标签之间的空白、注释、可选的闭合标签以及冗余的属性值。输出结果在功能上与源代码完全相同,但字节数更小,这意味着更快的下载速度和更短的首屏渲染时间。
浏览器将 HTML 解析为 DOM 树时会丢弃大多数空白。两个 div 标签之间的连续空格和换行符对渲染页面没有任何视觉影响。注释也会被解析器忽略。压缩正是利用了这些规则,提前去除解析器本就会丢弃的内容,从而避免这些数据通过网络传输。
HTML 压缩的节省效果因文档而异。大量注释的模板、深层缩进的服务端渲染页面以及带有内联样式的 CMS 输出,仅靠压缩通常可减少 15-30% 的体积。对于小文档,绝对节省量有限,但对于高流量网站,每次页面加载节省的几千字节,在数百万次请求中会积累成可观的带宽节省。
为什么使用此 HTML 压缩工具?
粘贴 HTML 即可立即获得压缩输出。无需安装构建工具,无需配置文件,无需注册账号。
HTML 压缩工具使用场景
HTML 压缩会删除什么
完整功能的 HTML 压缩工具会在空白移除之外应用多种转换。下表列出了最常见的技术,从最安全(始终无损)到最激进(盲目应用可能导致边缘情况出错)排序。
| 技术 | 压缩前 | 压缩后 |
|---|---|---|
| Whitespace between tags | <div> <p> text </p> </div> | <div><p>text</p></div> |
| HTML comments | <!-- TODO: fix later --> | (removed entirely) |
| Redundant attribute quotes | class="main" | class=main |
| Boolean attribute values | disabled="disabled" | disabled |
| Empty attribute values | id="" | (attribute removed) |
| Optional closing tags | </li>, </td>, </p> | (removed when safe) |
| Type on script/style | type="text/javascript" | (removed — default) |
| Protocol in URLs | https://cdn.example.com | //cdn.example.com |
压缩 vs. Gzip 压缩
开发者有时会问,当服务器已启用 Gzip 或 Brotli 压缩时,是否还有必要进行 HTML 压缩。简短的回答是:有必要,两者结合效果最佳。
HTML 压缩减少了 Gzip 处理的输入量,因此压缩输出也更小。Google 的 PageSpeed 指南建议同时应用两者。在典型页面上,HTML 压缩可节省原始大小的 15-25%,Gzip 再将结果压缩 60-80%。综合来看,总传输大小可降至原始未压缩文档的 10-20%。
代码示例
以下是四种环境中 HTML 压缩的实用示例,每个示例均删除注释并折叠空白。
import { minify } from 'html-minifier-terser'
const html = `
<div class="card">
<!-- user profile -->
<p> Hello, world! </p>
</div>
`
const result = await minify(html, {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
removeEmptyAttributes: true,
})
// → '<div class="card"><p>Hello, world!</p></div>'import htmlmin html = """ <div class="card"> <!-- user profile --> <p> Hello, world! </p> </div> """ result = htmlmin.minify(html, remove_comments=True, remove_empty_space=True) # → '<div class="card"><p>Hello, world!</p></div>'
package main
import (
"fmt"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/html"
)
func main() {
m := minify.New()
m.AddFunc("text/html", html.Minify)
input := `<div class="card">
<!-- user profile -->
<p> Hello, world! </p>
</div>`
result, _ := m.String("text/html", input)
fmt.Println(result)
// → <div class=card><p>Hello, world!</div>
}# Install globally npm install -g html-minifier-terser # Minify a file html-minifier-terser --collapse-whitespace --remove-comments input.html -o output.html # Pipe from stdin cat index.html | html-minifier-terser --collapse-whitespace --remove-comments # With all common optimizations html-minifier-terser \ --collapse-whitespace \ --remove-comments \ --remove-redundant-attributes \ --remove-empty-attributes \ --minify-css true \ --minify-js true \ input.html -o output.min.html