深入解析DOM树的加载

2 篇文章 0 订阅

DOM树

        在介绍 DOM 树之前,首先要清楚,DOM 规范中,对于文档的表示方法并没有任何限制,因此,DOM 树只是多种文档结构中的一种较为普遍的实现方式。

DOM 结构构成的基本要素是 “节点“,而文档的结构就是由层次化的节点组成。在 DOM 模型中,节点的概念很宽泛,整个文档 (Document) 就是一个节点,称为文档节点。除此之外还有元素(Element)节点、属性节点、Entity节点、注释(Comment)节点等。

了解了 DOM 的结构是由各种的子节点组成的,那么以 HTMLDocument 为根节点,其余节点为子节点,组织成一个树的数据结构的表示就是 DOM树。

DOM树的加载

  1. 在服务器中输入url,交给DNS域名解析,找到IP,向服务器发起请求(里面还有缓存,http协议,TCP…)
  2. 向服务器返回数据,浏览器接收文件(html,css,img…),生成的是二进制文件

html: 二进制转化为html, 例如Index.html

构建DOM树:HTML解析器

        过程: Token->Node->DOM

         Token语法解析,根是“document”节点(对象)

         Node: 生成节点,例如HTMLDivElement接口--对应div元素

         DOM:构建DOM树,接口和标签是一一对应的

 

        解析过程:

  1. 遇到link的外部css,遇到css的代码会进行css的加载,并行操作
  2. 遇见script标签时,会先执行js代码,直至脚本完成,然后继续构建DOM树

        这就是在底部加入JavaScript代码的原因。或者可以在头部引用,但前提是要加上async、defer,或window.onload;

        解析器遇到async属性的script时,开始下载脚本并继续解析文档。脚本会在下载完成后尽快执行(页面未必解析完毕),但解析器不会停下来等他下载(异步操作);与defer不同:先下载完等整个页面都解析完毕后再执行

        如果有多个script标签设置了async属性,则浏览器会异步下载该文件并且不会影响到后续DOM的渲染,如果有多个script标签设置了defer,则会按照顺序执行所有script脚本;

        如果您的脚本不会改变文档的内容,可将 defer 属性加入到 <script> 标签中,以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止。

Defer脚本会在文档渲染完毕后。DOMContentLoaded事件调用前执行;脚本会被延迟到整个页面都解析完毕后再运行

         构建css树:从css解析器

每个css文件解析为样式表对象CSSStyleSheet,每个对象都包含CSSRule;CSSRule包含选择器和声明对象,以及其他与css对应的语法

Token解析:css 的词法及语法文法

Node->CSSOM

         构建render树 :渲染树=DOM树+CSS树

 

        布局layout与绘制paint:计算对象之间的大小,确定每个节点在屏幕的确切坐标;使用UI后端层绘制每个节点

        reflow(回流):当元素属性发生改变且影响布局时(宽度、高度、内外边距等),产生回流,相当于刷新页面

        repaint (重绘):当元素改变且不影响布局时(背景颜色、透明度…)发生重绘,相当于不刷新页面,动态更新内容

重绘不一定引起回流,回流必将引起重绘

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟DOM(Virtual DOM)是一种在前端开发中优化渲染性能的技术。它是通过在内存中构建一个轻量级的DOM来代替真实的DOM,然后通过比较新旧两个虚拟DOM的差异(Diff算法),仅对差异部分进行实际的DOM操作,最终减少了浏览器重绘和回流的次数,提高了页面渲染的性能。 虚拟DOM的工作原理可以简单概括为以下几个步骤: 1. 初始化阶段:将真实的DOM构建成一个初始的虚拟DOM。 2. 更新阶段:当应用状态发生变化,生成新的虚拟DOM,并与旧的虚拟DOM进行比较。 3. Diff算法:Diff算法是虚拟DOM的核心部分,它通过逐个节点比较新旧虚拟DOM的差异,找出需要更新的部分。这个过程会尽量减少DOM操作的次数和范围,提高性能。 4. 执行更新:根据差异信息,对真实的DOM进行更新操作。 5. 渲染阶段:将更新后的虚拟DOM渲染到真实的DOM中。 Diff算法是虚拟DOM性能优化的关键,常见的Diff算法有两种:深度优先遍历和双端比较。 深度优先遍历算法是最简单的一种Diff算法,它会递归地比较新旧虚拟DOM的节点,找出差异并更新DOM。但是这种算法在处理列表类型的节点,性能不佳。 双端比较算法是一种更高效的Diff算法,它将新旧虚拟DOM的节点按照顺序进行比较,并将差异信息记录下来。在比较过程中,如果发现节点类型相同,则进行属性比较;如果节点类型不同,则直接替换节点。这种算法在处理列表类型的节点,可以减少很多不必要的比较和更新操作,提高性能。 总结起来,虚拟DOM和Diff算法深入解析可以帮助我们理解前端性能优化的原理和方法,通过最小化DOM操作的次数和范围,提高页面渲染的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值