HTML解析阶段对HTML源代码中冗余空格的合并算法与性能开销实战

大磊酱_2672

大磊酱_2672

2026-06-23

416人浏览

原创

浏览器解析时将标签间连续空白折叠为单个空格,但仅限普通文本节点;pre、script、style等特殊上下文保留原始空白;dom构建后残留的空文本节点需用element.normalize()显式清理。

html解析阶段对html源代码中冗余空格的合并算法与性能开销实战

浏览器解析时怎么处理标签间的空格和换行

HTML 解析器对空白的处理不是“删除”,而是“折叠”:多个空格、制表符、换行符在文本节点中被合并为单个空格;但仅限于普通文本内容区域。
关键点在于,这个折叠发生在 DOM 构建阶段,且只影响 Text 节点的 nodeValue,不改变节点结构本身。

  • <div>\n <p>hello</p>\n</div> 中的换行和缩进会被忽略,div 的 childNodes 仍包含一个空 Text 节点(哪怕它只含换行符)
  • <pre class="brush:php;toolbar:false;"> a b </pre> 内部空白完全保留,因为 pre 是预格式化上下文
  • <script></script> 和 <style></style> 内部也按原始字符串解析,不折叠

所以,“冗余空格是否被合并”取决于它所处的上下文类型,而非一概而论。

normalize() 不是解析器的一部分,但它能清理解析后残留的空文本节点

element.normalize() 是 DOM 方法,不是 HTML 解析流程中的自动步骤。它只在你显式调用时运行,作用是:

  • 合并相邻的 Text 节点(如 "a" + "b" → "ab")
  • 移除 nodeValue === '' 的空 Text 节点(比如只含换行或空格的节点)

常见误用:

  • 对未挂载的元素提前调用:const el = document.createElement('div'); el.normalize(); —— 无子节点,什么也不做
  • 对字符串直接调用:htmlString.normalize() —— 不存在该方法,会报错
  • 期望它压缩文本内部空格:"a b" 不会变成 "a b",得用 .replace(/\s+/g, ' ').trim()

正确姿势是:

  • 先把 HTML 字符串注入 template.innerHTML
  • 再对 template.content 调用 normalize()
  • 最后取 template.innerHTML 或遍历 content.childNodes

用 html-minifier 压缩源码时 collapseWhitespace 的真实行为

collapseWhitespace: true 并非简单删掉所有空白,它模拟了浏览器的折叠逻辑,但更激进:

  • 安全移除标签之间的空白(如 <div> <p> 中的换行)</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="overflowclass">Wechat HTML Publisher</a> <p class="overflowclass">直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <li>把块级元素间的多个空白(包括换行+空格)压缩为单个空格或直接删除,取决于上下文</li> <li>默认<strong>不触碰</strong> <code><pre class="brush:php;toolbar:false;"></pre>、<textarea></textarea>、<script></script>、<style></style> 内容
  • 若开启 conservativeCollapse: false(默认),还会合并内联元素间的空白,可能导致 <span>a</span> <span>b</span> 渲染为 "ab"(无空格)
  • 性能方面:

    • 单次压缩耗时通常在毫秒级,对构建流水线影响极小
    • 但若在服务端每次响应都实时压缩(如 Express 中间件),需注意正则匹配开销,尤其大文件时建议缓存结果

    为什么服务器端 gzip 比手动删空格更值得优先投入

    HTML 文件中,纯空白字符(空格、换行、制表符)在 gzip 压缩下几乎不占体积 —— 因为它们高度重复,LZ77 算法能高效编码。实测显示:

    • 一个 12KB 的未压缩 HTML,手动删空格后变 9KB,再 gzip → 3.1KB
    • 同样 12KB 原始 HTML 直接 gzip → 3.2KB

    差距不到 3%,而删空格可能引入布局风险(如 inline-block 元素间换行导致像素间隙)。

    真正影响传输体积的是:

    • 未压缩的图片(尤其是 PNG/JPEG)
    • 未 tree-shake 的 JS/CSS
    • 重复引入的字体文件或图标雪碧图

    所以,与其花时间写正则清理空格,不如确认 Nginx 开启了 gzip_static on,并检查资源是否已启用 Brotli(比 gzip 高约 15% 压缩率)。

    实际项目里,DOM 层面的空文本节点问题,往往比源码空白更隐蔽:它们不增加体积,却让 textContent 提取不准、childNodes.length 失真、遍历时多出无效项 —— 这才是 normalize() 最该出场的地方。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

html解析 html

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5595

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3192

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2850

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2879

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4739

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2821

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2629

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2348

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2368

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

DOM操作与实战案例
DOM操作与实战案例

共14课时 | 2.3万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.5万人学习