今天通过对 DOM 模型、HTML 解释器和 JavaScript 的执行的介绍,来初步学习 HTML 解释器是如何将从网络或者本地文件获取的字节流转成 DOM 树的。

DOM 模型

1、DOM 标准

DOM (Document Object Model) 的全称是文档对象模型,它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。比如,Web开发中,用 JavaScript 语言来访问、创建、删除或者修改 HTML 的文档结构。

目前 W3C 已经定义了一系列 DOM 接口(三个版本的 DOM 接口,每一个版本都加入了一些新功能,有兴趣的同学请自行查阅),使用这些接口可以对 DOM 树结构进行操作。

2、 DOM 树

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

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

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

HTML 网页和它的 DOM 树表示

HTML 解释器

1、解释过程

HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。


从资源的字节流到 DOM 树

通过上图可以清楚的了解这一过程:首先是字节流,经过解码之后是字符流,然后通过词法分析器会被解释成词语(Tokens),之后经过语法分析器构建成节点,最后这些节点被组建成一颗 DOM 树。

在这个过程中,每一个环节都会调用对应的类去处理

  • 词法分析: HTMLTokenizer 类
  • 词语验证:XSSAuditor 类
  • 从词语到节点: HTMLDocumentParser 类、 HTMLTreeBuilder 类
  • 从节点到 DOM 树: HTMLConstructionSite 类

对于线程化的解释器,字符流后的整个解释、布局和渲染过程基本会交给一个单独的渲染线程来管理(不是绝对的)。由于 DOM 树只能在渲染线程上创建和访问,所以构建 DOM 树的过程只能在渲染线程中进行。但是,从字符串到词语这个阶段可以交给单独的线程来做,Chromium 浏览器使用的就是这个思想。在解释成词语之后,Webkit 会分批次将结果词语传递回渲染线程。

JavaScript 的执行

在 HTML 解释器的工作过程中,可能会有 JavaScript 代码需要执行,它发生在将字符串解释成词语之后、创建各种节点的时候。这也是为什么全局执行的 JavaScript 代码不能访问 DOM 的原因——因为 DOM 树还没有被创建完呢。

WebKit 将 DOM 树创建过程中需要执行的 JavaScript 代码交由 HTMLScriptRunner 类来负责,其利用 JavaScript 引擎来执行 Node 节点中包含的代码。

因为 JavaScript 代码可能会修改文档结构,所以代码的执行会阻碍后面节点的创建,同时也会阻碍后面的资源下载,这样就会导致资源不能并发下载的性能问题。所以一般建议:

1、在 “script“ 标签上加上 “async“ 或 “defer“ 属性。
2、将 “script“ 元素放在 “body“ 元素后面。

对于此,WebKit 也通过预扫描和预加载来实现对资源并发下载的优化。

具体过程就是当需要执行 JavaScript 代码的时候,WebKit 先暂停代码的执行,使用预扫描器 HTMLPreloadScanner 类来扫描后面的词语, 如果发现需要使用其他资源,那么就会使用与资源加载器 HTMLResourcePreloader 类来发送请求,在这之后,才执行 JavaScript 代码。由于预扫描器本身并不创建节点对象,也不会构建 DOM 树,所以速度比较快。就算如此,还是推荐不要在头部写入大量 JavaScript 代码,毕竟不是所有渲染引擎都做了这样的优化。

在 DOM 树构建完成后,WebKit 会触发 “DOMContentLoaded” 事件,当所有资源都被加载完成后,会触发 “onload” 事件。

参考

《webkit技术内幕》

DOM 树是如何构建的 ?相关推荐

  1. vue 如何生成一个dom元素_vue 学习心得——DOM树如何被构建

    代码编辑不够友好,为更好一点的阅读体验,还是推荐原文链接:https://www.yuque.com/longtengsong/blog/bu09tk DOM 树是 vue 在构建实例的时候,通过 $ ...

  2. 从Chrome源码看浏览器如何构建DOM树

    最近下了Chrome的源码,安装了一个debug版的Chromium研究了一下,虽然很多地方都一知半解,但是还是有一点收获,将在这篇文章介绍DOM树是如何构建的,看了本文应该可以回答以下问题: IE用 ...

  3. html解析生成dom树,浏览器的DOM树构建算法

    在创建解析器的同时,也会创建 Document 对象.在树构建阶段,以 Document 为根节点的 DOM 树也会不断进行修改,向其中添加各种元素.标记生成器发送的每个节点都会由树构建器进行处理. ...

  4. DOM树和CSSOM树的构建和渲染

    页面的渲染过程 当我们在浏览器里输入一个 URL 后,最终会呈现一个完整的网页.会经历以下几个步骤: 1.HTML 的加载 页面上输入 URL 后,会先拿到 HTML 文件.HTML是一个页面的基础, ...

  5. 深入理解 WKWebView (渲染篇) —— DOM 树的构建

    全文12003字,预计阅读时间24分钟 当客户端 App 主进程创建 WKWebView 对象时,会创建另外两个子进程:渲染进程与网络进程.主进程 WKWebView 发起请求时,先将请求转发给渲染进 ...

  6. DOM 树的解析渲染

    (结合TCP/IP五层网络模型,OSI是七层网络模型) 获取到html文件 第一步:用户在浏览器地址栏中输入url地址(输入url会发生什么:http://www.cnblogs.com/wenanr ...

  7. DOM系列:DOM树和遍历DOM

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

  8. Vue的Dom树的理解

    Dom树 浏览器收到一个html页面是如何解析成页面呈现给用户 浏览器使用html解析器解析html,解析后构建dom树,也可能是边解析边沟检查 css解析器解析css生成样式表 构建render树( ...

  9. 【读书笔记】【WebKit技术内 幕(二)】Chromium Webkit资源加载与网络栈、DOM树、HTML解释器、影子DOM、CSS解释器和样式布局、网页层次与渲染、绘图上下文、

    文章目录 前言 Something great 第4章 资源加载和网络栈 Webkit 资源加载 Chromium多进程资源加载 Chromium 网络栈 第5章 HTML解释器和DOM模型 DOM模 ...

最新文章

  1. linux下jdk/maven/tomcat
  2. 汇编和python-python与汇编
  3. js库prototype中的$()
  4. 自监督学习和对比学习
  5. failed to get the task for process XXX(解决方案)
  6. Mini T-block——数据中心界的U盘
  7. Chrome Elements 标签页 和 View Source 的显示为什么有差异
  8. java 反射 获取成员_java 反射获取成员
  9. android launcher分析和修改10,Android Launcher分析和修改10——HotSeat深入进阶
  10. 从memcpy到memmove,内存函数拷贝与内存重叠问题(重点内容)
  11. mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)
  12. TOJ 4008 The Leaf Eaters
  13. GBaseDataStudio管理工具
  14. jvisualVM调优案例
  15. linux的防火墙端口配置
  16. Excel如何快速生成随机姓名
  17. python如何生成app_python创建app
  18. 图片验证码识别教程技术原理分析
  19. 单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
  20. 13-zinx-Golang-MMO游戏Proto3协议

热门文章

  1. 怎么查看自己浏览器的User-Agent
  2. 720phi10p 和 720p有什么区别_除了情怀还剩什么?索尼Z5 Compact评测
  3. 2 Robotics: Computational Motion Planning 第2+3+4周 课后习题解答
  4. 成都理工大学计算机考研经历,09计算机考研的小小体会~
  5. select属性标签
  6. 视频融合云服务平台EasyCVR接入设备后播放FLV视频流,报错404是什么原因?
  7. Opencv图片锐化
  8. linux基本功系列之pwd命令实战
  9. Multimedia Event Extraction From News With a Unified Contrastive Learning Framework论文解读
  10. Delphi创建COM组件并分别用Delphi和html调用该组件的简单实例