
本文介绍在 go 语言中实现 html 压缩的实用方法,重点解决去除无意义空白符(如缩进、换行)而不破坏语义的问题,并推荐成熟可靠的第三方库及使用示例。
HTML 压缩(minification)并非简单地全局替换空格或换行符——例如 <pre>、<textarea> 或 style="white-space: pre" 内的空白需保留;属性值中的空格(如 class="btn primary")、文本节点内的连续空格(浏览器会折叠为单个空格,但完全删除可能影响 或 white-space: pre-wrap 行为)也需谨慎处理。因此,手写正则替换(如 strings.ReplaceAll(html, "\n", ""))极易出错,不推荐用于生产环境。
推荐使用经过充分测试的专业库:
✅ github.com/tdewolff/minify/v2(推荐首选)
功能最完整,支持 HTML、CSS、JS、SVG 等多格式,严格遵循 HTML 解析规范,能智能识别可安全移除的空白(如标签间空白、注释、冗余属性空格),同时保留必需内容。
安装:
go get github.com/tdewolff/minify/v2 go get github.com/tdewolff/minify/v2/html
使用示例:
立即学习“前端免费学习笔记(深入)”;
package main
import (
"bytes"
"fmt"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/html"
)
func HtmlMinify(html string) string {
m := minify.New()
m.AddFunc("text/html", html.Minify)
src := []byte(html)
dst := &bytes.Buffer{}
err := m.Minify("text/html", dst, bytes.NewReader(src))
if err != nil {
return html // fallback on error
}
return dst.String()
}
func main() {
htmlExample := `<li>
<a>Hello</a>
</li>`
minifiedHtml := HtmlMinify(htmlExample)
fmt.Println(minifiedHtml) // 输出: <li><a>Hello</a></li>
}✅ github.com/dchest/htmlmin(轻量备选)
更轻量,专注 HTML,适合简单场景。但已多年未活跃维护,不支持 HTML5 新特性(如自闭合 SVG 标签)及复杂空白逻辑,建议仅用于原型或低风险内部工具。
⚠️ 注意事项:
- 避免在动态生成 HTML 后实时压缩(如每次 HTTP 响应都调用),应结合缓存(如 sync.Pool 复用 minify.Minifier 实例)提升性能;
- 压缩前确保 HTML 语法正确,否则解析器可能 panic 或静默失败;
- 若需保留调试用注释(如 <!-- DEV: ... -->),可在 html.Options 中配置 KeepComments: true(tdewolff/minify 支持);
- 模板渲染阶段(如 html/template)后压缩效果最佳,避免在字符串拼接层处理。
综上,优先选用 tdewolff/minify/v2/html ——它以标准 HTML 解析器为基础,兼顾安全性、兼容性与性能,是 Go 生态中 HTML 压缩的事实标准方案。











