DOM树的构建

article/2025/10/31 16:16:07

1、是什么?

DOM是表述HTML的内部数据结构,它会将web页面和JavaScript脚本连接起来,并过滤一些不安全的内容。

2、作用?

从页面角度来看,DOM是生成页面的基础数据结构;从JavaScript角度来看,通过DOM提供给JavaScript的接口,JavaScript可以对DOM进行访问,从而改变文档的结构、样式和内容;从安全视角看,DOM是一道安全防护线,一些不安全的内容在DOM解析阶段就被拒之门外了。

3、DOM树如何生成?

渲染引擎内部有一个HTML解析器模块,负责将HTML字节流转换为DOM结构。HTML解析器如何工作:网络进程加载了多少数据,HTML解析器便解析了多少数据。

HTML解析过程:网络进程在收到响应头之后,根据请求头中的content-type判断文件类型。如果是text/html,那么浏览器会判断出这是一个HTML类型的文件,然后为该请求选择或者创建一个渲染进程。渲染进程准备好之后,网络进程和渲染进程之间会建立一个共享数据的管道,网络进程接收到数据后就放入共享管道中,渲染进程从管道的另一端进行读取数据,并同时将读取到的数据给HTML解析器,HTML解析为DOM。

字节流转换为DOM:字节流Bytes-->分词器Tokens-->生成节点Node-->DOM。

字节流转换为DOM的过程:通过分词器将字节流转换为Token,Token分为Tag Token和文本Token。Tag Token又分为StartTag和EndTag,TagToken会压入到栈中的是StartTag Token,HTML解析器会为该Token(Start Token)创建一个DOM节点,然后将该节点加入到DOM树中,父节点即栈中相邻的元素生成的节点。如果解析的是文本Token,会生成一个文本节点,然后将该节点加入到DOM树中,文本Token是不需要压入到栈中的。它的父节点就是当前栈顶Token对应的DOM节点。如果分词器解析的是EndTag div,HTML解析器会查看当前栈顶元素是否是StartTag div,如果是则将栈顶元素从栈中弹出,表示该div元素解析完成。通过分词器产生的新Token就这样不停地压栈和出栈,整个解析过程就这样一直持续下去,直到分词器将所有字节流分词完成。

4、JavaScript对DOM树构建和渲染的影响

4.1、JavaScript脚本在页面中

<div>1</div>
<script>
let div1=document.getElementsByTagName('div')[0]
div1.innerText='script time'
</script>
<div>2</div>

在两段div中间插入了一段JavaScript脚本,即还未解析完字节流文件,就出现了script标签。

此时HTML解析器暂停工作,JavaScript引擎介入,并执行script标签中的脚本。脚本执行完成之后,HTML解析器恢复解析过程,继续解析后续的内容,直至生成最终的DOM。

4.2、html页面引入JavaScript文件

<div>1</div>
<script type="text/javascript" src="foo.js"></script>
<div>2</div>

和第一种情况一样,执行到JavaScript标签时,暂停整个DOM解析,执行JavaScript代码。此时需要先下载文件。下载过程会阻塞DOM解析,且下载又是非常耗时的,会受到网络环境、JavaScript文件大小等因素的影响。

一些优化:

Chrome浏览器有作预解析优化,当渲染引擎收到字节流之后,会开启一个预解析过程,用来分析HTML文件中包含的JavaScript、CSS等相关文件,解析到相关文件之后,预解析线程会提前下载这些文件。

使用CDN来加速JavaScript文件的加载,压缩JavaScript文件的体积。

如果JavaScript文件中没有操作DOM相关代码,可以将该JavaScript脚本设置未异步加载,通过async或defer来标记代码。<script async type="text/javascript" src="foo.js"></script>或<script defer type="text/javascript" src="foo.js"></script>

async:脚本并行加载,加载完成之后立即执行,执行时机不确定,仍有可能阻塞HTML解析,执行时机在load事件派发之前。

defer:脚本并行加载,等待HTML解析完成之后,按照加载顺序执行脚本,执行时机在DOMContentLoaded事件派发之前。

async和defer的相同点:
都是异步加载script,加载的过程都不会阻塞html的解析。async和defer的不同点:
①执行时机不同:async是在加载完后立即执行,执行过程中仍会阻塞html的解析;defer是在html解析完,DomContentLoaded之前执行。
②是否阻塞html的标签:async会阻塞,defer不会阻塞。
③script标签的执行顺序:async不能保证script标签的执行顺序(谁先加载完谁先执行),defer在html解析完成后按顺序执行。

5、CSS对DOM树构建的影响

//main.css
div{color:coral;background-color:black;
}<html>
<head><link href="main.css" rel="stylesheet"></head>
<body><div>12e44</div><script>console.log('hello world')</script><div>fdsfg</div>
</body>
</html>

含有CSS的页面渲染过程:首先发起主页面的请求(发起方可能是渲染进程、浏览器进程),发起的进程会到网络进程中去执行。网络进程接收到返回的HTML数据后,将其发送给渲染进程,渲染进程会解析HTML数据并创建DOM。请求HTML数据和构建DOM中间有一段空闲时间,这个空闲时间有可能称为页面渲染的瓶颈。

当渲染进程接收HTML文件字节流时,会先开启一个预解析线程,如果有遇到JavaScript文件或者CSS文件,那么预解析线程会提取下载这些数据。对于上面的代码,预解析线程会解析外部的main.css文件,并发起main.scss的下载。这里也会有一个空闲时间,即DOM构建结束之后,main.css文件还未下载完成的这段时间内,渲染流水线无事可做,因为下一步是合成布局树,而合成布局树需要CSSDOM和DOM,所以这里需要等待CSS加载结束并解析成CSSOM。

CSSOM的作用:①提供给JavaScript操作样式表的能力②为布局树的合成提供基础的样式信息。

等DOM和CSSOM都构建好之后,渲染引擎就会构造布局树。布局树的结构基本就是复制DON的结构,区别在于会过滤DOM树中不需要显示的元素(如display:none的元素、head、script标签等)复制好基本的布局树结构之后,渲染引擎会为对应的 DOM 元素选择对应的样式信息,这个过程就是样式计算样式计算完成之后,渲染引擎还需要计算布局树中每个元素对应的几何位置,这个过程就是计算布局。通过样式计算和计算布局就完成了最终布局树的构建。

6、影响页面展示的因素以及优化策略

渲染流水线影响到了首次页面展示的速度,而首次页面展示的速度又直接影响到了用户

7、从发起URL请求开始,到首次显示页面的内容

①从请求发出去到提交数据阶段,页面展示的还是原来的内容。

②提交数据之后渲染进程会创建一个空白页面,通常把这段时间称为解析白屏,并等待CSS文件和JavaScript文件的加载完成,生成CSSOM和DOM,然后合成布局树,最后还要经过一系列的步骤准备首次渲染。

③首次渲染完成之后,就开始进入完整页面的生成阶段了,然后页面会一点点被绘制出来。

第二个阶段的主要问题是白屏时间,这个阶段主要任务有解析HTML、下载 CSS、下载 JavaScript、生成 CSSOM、执行 JavaScript、生成布局树、绘制页面一系列操作。

优化策略有:

  • 通过内联 JavaScript、内联 CSS 来移除这两种类型的文件下载,这样获取到 HTML 文件之后就可以直接开始渲染流程了。

  • 但并不是所有的场合都适合内联,那么还可以尽量减少文件大小,比如通过webpack 等工具移除一些不必要的注释,并压缩 JavaScript 文件。

  • 还可以将一些不需要在解析 HTML 阶段使用的 JavaScript 标记上 sync 或者 defer。

  • 对于大的 CSS 文件,可以通过媒体查询属性,将其拆分为多个不同用途的 CSS 文件,这样只有在特定的场景下才会加载特定的 CSS 文件。


http://chatgpt.dhexx.cn/article/reF2aPFf.shtml

相关文章

DOM(一)——DOM树和查找元素

文章目录 一、DOM二、DOM树三、查找元素1. 不需要查找&#xff0c;就可直接获得元素/对象2. 按节点间关系查找a. 节点树(不建议使用)b. 元素树 3. 按HTML特征查找1) 按id名查找一个元素2) 按标签名查找多个元素3) 按class名查找多个元素4)按name名查找多个表单元素: 4. 按选择器…

DOM树和CSSOM树的构建和渲染

页面的渲染过程 当我们在浏览器里输入一个 URL 后&#xff0c;最终会呈现一个完整的网页。会经历以下几个步骤&#xff1a; 1、HTML 的加载 页面上输入 URL 后&#xff0c;会先拿到 HTML 文件。HTML是一个页面的基础&#xff0c;所以会在最开始的时候下载它&#xff0c;下载…

深入解析DOM树的加载

DOM树 在介绍 DOM 树之前&#xff0c;首先要清楚&#xff0c;DOM 规范中&#xff0c;对于文档的表示方法并没有任何限制&#xff0c;因此&#xff0c;DOM 树只是多种文档结构中的一种较为普遍的实现方式。 DOM 结构构成的基本要素是 “节点“&#xff0c;而文档的结构就是由层…

DOM树节点解析

目录(?)[] 转自&#xff1a;http://blog.csdn.net/skyer518/article/details/37904787 DOM是解析XML文件的官方标准&#xff0c;它与平台和语言无关。DOM解析将整个XML文件载入并组装成一棵DOM节点树&#xff0c;然后通过遍历、查找节点以读取XML文件中定义的数据。由于DOM解析…

JavaScript之DOM树

一、什么是DOM树&#xff1f; DOM &#xff08;Document Object Model&#xff09;是指文档对象模型&#xff0c;通过它&#xff0c;可以访问HTML文档的所有元素。 DOM树是结构&#xff0c;所谓层级结构是指元素和元素之间的关系&#xff1a;父子&#xff0c;兄弟。 文档&am…

JavaScript的DOM 树是如何构建的 ?

今天通过对 DOM 模型、HTML 解释器和 JavaScript 的执行的介绍&#xff0c;来初步学习 HTML 解释器是如何将从网络或者本地文件获取的字节流转成 DOM 树的。 DOM 模型 1、DOM 标准 DOM (Document Object Model) 的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言…

DOM系列:DOM树和遍历DOM

上一节&#xff0c;咱们整理了DOM系列中的第一篇&#xff0c;主要介绍浏览器与DOM相关的知识。从标题中我们可以看出来&#xff0c;今天所要学的东西包含两个部分&#xff0c;第一部分是DOM树&#xff0c;第二部分是遍历DOM。如果你和我一样对于DOM树和遍历DOM是初次接触&#…

DOM树的理解【面试常问】

前言 vue和react框架被广泛应用&#xff0c;封装了DOM操作但是DOM操作一直都是前端工程师的基础、必备知识只会vue而不懂DOM操作的程序员&#xff0c;不会长久 DOM 全称为文档对象模型&#xff08;Document Object Model&#xff09;。有这几个概念&#xff1a; 文档、元素…

DOM树知识点梳理

为什么会提到Dom树呢,或许它对于我们很好地理解网页各个元素,标签和控件搭配,以及各种js,css等的加载会有一些帮助。笔者在工程中遇到了一些小问题,本质就是dom树的东西掌握的不扎实。所以借此来梳理一下。 1.HTML DOM ok, 我们先来看一下W3school中怎么解释这个概念和结…

浏览器-DOM树

前言&#xff1a; 在渲染流水线中直接或者间接地依赖于 DOM 结构&#xff0c;本文按着网络数据流路径来介绍 DOM 树是如何进行构建的。 节点&#xff08;Node&#xff09;&#xff1a; 节点&#xff08;Node&#xff09;原本是网络术语&#xff0c;表示网络中的连接点。一个网…

Dom树,什么是dom树?

相信很多初学前端的小伙伴&#xff0c;学了html, css, js之后&#xff0c;会遇到 一个名词 DOM树。 首先说一下DOM是什么&#xff1f; DOM 是 Document Object Model&#xff08;文档对象模型&#xff09;的缩写。 举个例子 我们日常生活中&#xff0c;经常会遇到一些写文档…

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的&#xff0c;所以要将其转化为渲染引擎能够理解的内部结构&#xff0c;这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中&#xff0c;DOM 有三个层面的作用&#xff1a; …

DOM初探(9)——DOM结构树

document一回车&#xff0c;他就代表整个文档&#xff1b;Document一回车&#xff0c;他代表的是一个函数&#xff0c;什么函数需要首字母大写&#xff1f;构造函数吧&#xff0c;只不过这个Document有点特殊&#xff0c;你不能new他&#xff0c;这时系统留给自己new的。那这个…

dom树是如何生成的

页面得渲染流程总得俩说就五步&#xff0c;创建 DOM 树——创建 StyleRules——创建 Render 树——布局Layout&#xff08;重排&#xff09;——绘制 Painting&#xff08;重绘&#xff09; 第一步&#xff0c;用 HTML 分析器&#xff0c;分析 HTML 元素&#xff0c;构建一颗 D…

Dom树 CSS树 渲染树(render树) 规则、原理

前端不可不学的浏览器渲染机制&#xff0c;阿里年年问&#xff0c;去一个栽一个。听说百度也在考这个&#xff0c;你还不准备学吗&#xff1f; 首先你要了解浏览器渲染的顺序&#xff1a;   1.构建dom 树   2.构建css 树   3.构建渲染树   4.节点布局   5.页面渲染 什么…

HTML-DOM树篇

一、什么是DOM DOM&#xff08;Document Object Model&#xff09; 文档对象模型&#xff0c;是HTML和XML文档的编程接口 DOM 以树结构表达 HTML 文档&#xff0c;树的每个分支的终点都是一个节点&#xff0c;每个节点都包含着对象DOM 将web页面与脚本或编程语言链接起来&#…

DOM结构(DOM树)

DOM 文档类型DOM&#xff08;Document Object Model&#xff09;主要用于HTML文档和XML文档的内容进行操作。DOM描绘了一个层次化的节点树&#xff0c;通过节点的操作&#xff0c;来实现对文档内容进行增删改查。 1.DOM&#xff08;Document Object Model&#xff09;&#x…

DOM(一)概述、dom树、查找元素

目录 一、DOM 概述 二、DOM树 二、查找元素 1. 无需查找的元素 2. 按节点间关系查找 3. 按 HTML 特征查找 三、案例&#xff1a;通过DOM实现购物车效果 一、DOM 概述 DOM全称 Document Object Model&#xff0c;是专门操作网页内容的一套对象和函数的总称。由于 ES 标准…

DOM深入学习 --- DOM 树介绍,如何遍历 DOM 树节点(一)

DOM 树 HTML 文档的主干是标签&#xff08;tag&#xff09;。 根据文档对象模型&#xff08;DOM&#xff09;&#xff0c;每个 HTML 标签都是一个对象。嵌套的标签是闭合标签的“子标签&#xff08;children&#xff09;”。标签内的文本也是一个对象。 所有这些对象都可以通…

什么是DOM?你了解DOM树吗?

在找工作的过程中&#xff0c;看到了招聘信息上有写这么一条信息&#xff1a; 掌握WEB前端开发技术&#xff1a;JavaScript(含ES6)、HTML、CSS、DOM等 看见这条信息我心里安心了不少&#xff0c;都是一些基础问题&#xff0c;但是乍一看DOM&#xff0c;脑子有点短路了&#x…