浏览器工作原理与实践
李兵
前盛大创新院高级研究员
56402 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
浏览器工作原理与实践
15
15
1.0x
00:00/00:00
登录|注册

22 | DOM树:JavaScript是如何影响DOM树构建的?

CSS文件下载阻塞JavaScript执行
优化策略
阻塞DOM解析
脚本执行后恢复解析
暂停DOM解析
Token栈结构
HTML代码解析过程
Token解析为DOM节点
Token生成
代码执行结果
XSSAuditor
JavaScript和样式表文件的影响
加速DOM生成方案
JavaScript对CSSOM的影响
外部JavaScript文件加载
内嵌JavaScript脚本
示例分析
HTML解析器
思考时间
安全检查模块
总结
JavaScript影响
DOM树生成
DOM树生成和JavaScript影响

该思维导图由 AI 生成,仅供参考

在上一篇文章中,我们通过开发者工具中的网络面板,介绍了网络请求过程的几种性能指标以及对页面加载的影响。
而在渲染流水线中,后面的步骤都直接或者间接地依赖于 DOM 结构,所以本文我们就继续沿着网络数据流路径来介绍 DOM 树是怎么生成的。然后再基于 DOM 树的解析流程介绍两块内容:第一个是在解析过程中遇到 JavaScript 脚本,DOM 解析器是如何处理的?第二个是 DOM 解析器是如何处理跨站点资源的?

什么是 DOM

从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。DOM 提供了对 HTML 文档结构化的表述。在渲染引擎中,DOM 有三个层面的作用。
从页面的视角来看,DOM 是生成页面的基础数据结构。
从 JavaScript 脚本视角来看,DOM 提供给 JavaScript 脚本操作的接口,通过这套接口,JavaScript 可以对 DOM 结构进行访问,从而改变文档的结构、样式和内容。
从安全视角来看,DOM 是一道安全防护线,一些不安全的内容在 DOM 解析阶段就被拒之门外了。
简言之,DOM 是表述 HTML 的内部数据结构,它会将 Web 页面和 JavaScript 脚本连接起来,并过滤一些不安全的内容。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript对DOM树构建的影响是本文的核心内容。文章首先介绍了DOM的生成流程和HTML解析器的工作方式,强调了JavaScript在DOM生成过程中的作用。通过详细解释字节流转换为DOM的三个阶段,以及示例代码演示了DOM树的生成过程,为读者提供了清晰的技术概览。文章还讨论了JavaScript脚本对DOM生成的阻塞影响,以及外部CSS文件对JavaScript执行的影响。此外,还介绍了一些加速生成DOM的方案,以及渲染引擎的安全检查模块XSSAuditor。总体而言,本文深入浅出地介绍了JavaScript对DOM树构建的影响,为读者提供了技术上的深入理解和优化方案。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《浏览器工作原理与实践》
,新⼈⾸单¥59
立即购买
登录 后留言

全部留言(66)

  • 最新
  • 精选
  • 忘忧草的约定
    老师请问一下:主线程在parseHtml时,是不是没办法执行执行paint等操作、那这时候页面又是如何绘制出来的呀?

    作者回复: 如果正在执行ParserHTML,那么页面只会显示之前绘制好的内容,举个极端点的例子,比如ParserHTML占用了主线程10秒,那么这10秒内,页面都不会发生新的绘制操作,也就是页面卡顿了10秒!

    2019-11-16
    4
    11
  • 叫我大胖就好了
    我看MDN写的是defer在DOMContentLoaded 前执行

    作者回复: 你是对的,我写错了。

    2019-09-26
    4
  • 木瓜777
    您好,网络进程接收到响应头之后,会根据请求头中的 content-type 字段来判断文件的类型,比如 content-type 的值是“text/html”! 这个地方应该是根据响应头判断文件类型吧?

    作者回复: 嗯 是响应头,我改过来

    2019-09-27
    2
  • Luke
    CSS不阻塞dom的生成。 CSS不阻塞js的加载,但是会阻塞js的执行。 js会阻塞dom的生成,也就是会阻塞页面的渲染,那么css也有可能会阻塞页面的渲染。 如果把CSS放在文档的最后面加载执行,CSS不会阻塞DOM的生成,也不会阻塞JS,但是浏览器在解析完DOM后,要花费额外时间来解析CSS,而不是在解析DOM的时候,并行解析CSS。 并且浏览器会先渲染出一个没有样式的页面,等CSS加载完后会再渲染成一个有样式的页面,页面会出现明显的闪动的现象。 所以应该把CSS放在文档的头部,尽可能的提前加载CSS;把JS放在文档的尾部,这样JS也不会阻塞页面的渲染。CSS会和JS并行解析,CSS解析也尽可能的不去阻塞JS的执行,从而使页面尽快的渲染完成。
    2019-09-25
    27
    123
  • Angus
    会显示time.geekbang和test,JavaScript代码执行的时候第二个div还没有生成DOM节点,所以是获取不到div2的,页面会报错Uncaught TypeError: Cannot set property 'innerText' of undefined。 另外复习了下async和defer: async:脚本并行加载,加载完成之后立即执行,执行时机不确定,仍有可能阻塞HTML解析,执行时机在load事件派发之前 defer:脚本并行加载,等待HTML解析完成之后,按照加载顺序执行脚本,执行时机在DOMContentLoaded事件派发之前
    2019-09-24
    8
    51
  • Geek_93f234
    网络进程加载了多少数据,HTML 解析器便解析多少数据。这里有一个问题,如果是边加载边解析,那么一个标签还在网络传输过程中,浏览器还没有接受到script这个词段,那么浏览器又是怎么预加载的呢?
    2020-05-02
    10
    20
  • 欣欣向荣的万七七
    讲得太赞了!一直以来我都只记着加载表现结果(大部分文章都并不知道细节原因,而只能从做测试得到的结果来推测)。而老师的视角则可以从运行时进行讲解 这种知识是很难得的呀~
    2019-10-02
    6
  • mfist
    开始看文章的时候就在想如果js获取的dom还没有解析出来,会如何处理,结果思考题就是这个。 会两行显示,一行是time.geekbang 另外一行是test。原因是script脚本执行的时候获取想不到第二个div,所以不会对后来的div有影响。 今日总结: 1. 首先介绍了什么是DOM(表述渲染引擎内部数据结构,它将Web页面和JavaScript脚本连接起来,并过滤不安全内容)、DOM树如何生成(网络进程和渲染进程建立一个流式管道,HTML解析器直接解析,不需要等待text/html类型的接口 接受完毕再进行解析),第一步:通过分词器将字节流转换为Token;第二步:将Token解析为DOM节点;第三步:将DOM节点添加到DOM树中。 2. JavaScript是如何影响DOM生成的?暂停html解析,下载解析执行完毕js之后再进行html解析(如果这期间使用到了cssDom,需要等待相应css过程)。预解析线程的优化(提前加载相应js css文件) 3. 渲染引擎还有一个安全检查模块XSSAuditor用来检测词法安全的
    2019-09-24
    1
    6
  • HoSalt
    老师,CSSOM的生成依赖于DOM吗?
    2020-04-11
    2
    4
  • sky
    有个问题,网络传输过程中,传输包有可能是乱序的,如果index.html没有加载完,怎么保证传输回来的index.html字节流不是乱序的呢。这样边加载边解析不会有问题吗?
    2021-06-01
    2
    3
收起评论
显示
设置
留言
66
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部