说下你对DOM树的理解

2022-11-19
11554 分钟
...
  • 概念:DOM 是表述 HTML 的内部数据结构,它会将 Web 页面和 JavaScript 脚本连接起来,并过滤一些不安全的内容。

  • DOM 的生成:通过浏览器渲染引擎内部的 HTML 解析器,将 HTML 字节流转换为 DOM 结构

    • HTML 解析器并不是等整个文档加载完成之后再解析的,而是网络进程加载了多少数据,HTML 解析器便解析多少数据
  • DOM 生成简单过程:HTML 字节流 -> 分词器 -> DOM 节点 -> DOM 树节点

    • 通过分词器将字节流转换为 Token。(有点类似于虚拟 DOM 的结构)
    • 至于后续的第二个和第三个阶段是同步进行的,需要将 Token 解析为 DOM 节点,并将 DOM 节点添加到 DOM 树中。

知识拓展

  • JavaScript 文件的下载过程会阻塞 DOM 解析

  • 优化 JavaScript 影响 DOM 树生成的策略:

    • CDN 来加速 JavaScript 文件的加载
    • 压缩 JavaScript 文件的体积
    • 异步加载
      • defer:脚本并行加载,等待HTML解析完成之后,按照加载顺序执行脚本,执行时机在DOMContentLoaded事件派发之前
      • async:使用 async 标志的脚本文件一旦加载完成,会立即执行,执行时机不确定,仍有可能阻塞HTML解析,执行时机在load事件派发之前
  • DOM 树在浏览器内部生成是用的什么算法

    • DFS(深度优先算法):可以参考chromium 源码-dom 渲染
    • C++ 代码示例:
    // In C++
    
    // Traverse a children.
    for (Node* child = parent.firstChild(); child; child = child->nextSibling()) {
      ...
    }
    
    // ...
    
    // Traverse nodes in tree order, depth-first traversal.
    void foo(const Node& node) {
      ...
      for (Node* child = node.firstChild(); child; child = child->nextSibling()) {
        foo(*child);  // Recursively
      }
    }
    复制代码
    • HTML 解析器维护了一个 Token 栈结构,该 Token 栈主要用来计算节点之间的父子关系,在第一个阶段中生成的 Token 会被按照顺序压到这个栈中。具体的处理规则如下所示:
      • 如果压入到栈中的是 StartTag Token,HTML 解析器会为该 Token 创建一个 DOM 节点,然后将该节点加入到 DOM 树中,它的父节点就是栈中相邻的那个元素生成的节点。
      • 如果分词器解析出来是文本 Token,那么会生成一个文本节点,然后将该节点加入到 DOM 树中,文本 Token 是不需要压入到栈中,它的父节点就是当前栈顶 Token 所对应的 DOM 节点。
      • 如果分词器解析出来的是 EndTag 标签,比如是 EndTag div,HTML 解析器会查看 Token 栈顶的元素是否是 StarTag div,如果是,就将 StartTag div 从栈中弹出,表示该 div 元素解析完成。
    • 个人理解:
      • DOM 生成流程,先解析 html 流,转成 token,完事之后在生成 node ,之后是 stack 栈的逻辑
      • 如果是 stack 栈的话,有点像 DFS 的感觉,因为 html 流里面如果一个元素嵌套了子元素,那按照代码的顺序,应该会先把子节点给 push 进去

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
html2024-07-24
前端面试题汇总之HTML篇(含答案)
1、什么是 DOCTYPE(⽂档类型),有何作用 (1) 解释(是什么) DOCTYPE是是HTML5的文档声明,一种标准 的 。 (2)DOCTYPE的作用包括: 1. 告知浏览器使用哪个HTML版本 :定义和声明HTML文档的类型和版本, 告诉浏览器(解析器)应该以什么样(html或xhtml)的文档类型定义来解析文档 ,例如, 声明表示文档是基于HTML5的。不同的HTML版本可能具有不同的语法和功能支持,因此DOCTYPE有助于...
学习面试
html2023-06-18
Cookie与Session傻傻分不清楚
一、Cookie与 的区别 Cookie和Session都是用于在Web应用程序中跟踪用户的状态的机制。 Cookie和Session都是用于跟踪用户状态的机制 虽然Cookie和Session都可以用于存储用户的数据,可用于跟踪用户身份和行为 , 但它们的工作方式/实现方式有所不同,具有不同的优缺点。 1.1 Cookie 1.1.1 Cookie是什么? Cookie是一种存储在用户计算机上的小文件,用于跟踪用户的身份和行为。 Co...
面试
html2022-12-02
H5新特性有哪些?
H5拥有6种新特性 1. 语义化标签,例如header,footer,section,article等 语义化标签的作用:提升页面的阅读性(结构性增强),更有利于SEO,对于使用屏幕阅读器的人来说会更友好(有明显的语气差别,例如strong标签内的内容会重读); 2. 新增媒体元素,audio、video audio和video标签能够很容易的输出音频或视频流,提供便利的获取文件信息的API 更多详细属性参考 3.用于绘画的canvas...
面试
html2022-12-01
什么是响应式设计?响应式设计的基本原理是什么?如何做?
简介 我这么理解:响应式布局就是一个网站能够兼容多个设备,可以根据屏幕的大小自动调整页面的展示方式以及布局,我们不用为每一个设备做一个特定的版本。响应式网站的特点: 同时适配PC+平板+手机等 网站的布局会根据视口来调整模块的大小和高度 响应式设计的基本原理是通过媒体查询检测不同的设备屏幕尺寸做处理来设置差异化的css样式 一、是什么? 响应式网站设计(Responsive Web Design)是一种网络页面设计布局,页面的设计与开发...
面试面试官
html2022-11-23
前端性能优化 - 用RAIL模型分析性能
RAIL是一个以用户为中心的性能模型,它把用户的体验拆分成几个关键点(例如,tap,scroll,load),并且帮你定义好了每一个的性能指标。 有以下四个方面: Response Animation Idle Load <img width="676" height="245" src="../../ resources/1734894ee7aaf2b6 tplv t2oaga2asx 2e5a8010c5bb40479.webp"/...
面试
html2022-11-23
网站图片加载慢怎么优化
一个页面上有大量的图片,加载很慢,你有哪些方法优化这些图片的加载? <a id="t1" </a <a id="1 Sprites 2" </a 1、使用 Sprites 图片技术 它将一个页面涉及到的所有零星图片都包含到一张大图中去,然后利用 CSS 技术展现出来。这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了,可以减少了整个网页的图片大小,并且利用 能很好地减少网页的 请求,从而大大的提高页面的性能。...
面试

评论

请登录后发表评论

去登录
加载评论中...

目录