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

05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

布局阶段
样式计算
构建DOM树
渲染模块
HTML、CSS和JavaScript
渲染流程

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

上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练使用开发者工具,因为能够理解开发者工具里面大部分项目的含义,能优化页面卡顿问题,使用 JavaScript 优化动画流程,通过优化样式表来防止强制同步布局,等等。
既然它的功能这么强大,那么今天,我们就来好好聊聊渲染流程
通常,我们编写好 HTML、CSS、JavaScript 等文件,经过浏览器就会显示出漂亮的页面(如下图所示),但是你知道它们是如何转化成页面的吗?这背后的原理,估计很多人都答不上来。
渲染流程示意图
从图中可以看出,左边输入的是 HTML、CSS、JavaScript 数据,这些数据经过中间渲染模块的处理,最终输出为屏幕上的像素。
这中间的渲染模块就是我们今天要讨论的主题。为了能更好地理解下文,你可以先结合下图快速抓住 HTML、CSS 和 JavaScript 的含义:
HTML、CSS 和 JavaScript 关系图
从上图可以看出,HTML 的内容是由标记和文本组成。标记也称为标签,每个标签都有它自己的语义,浏览器会根据标签的语义来正确展示 HTML 内容。比如上面的<p>标签是告诉浏览器在这里的内容需要创建一个新段落,中间的文本就是段落中需要显示的内容。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了HTML、CSS和JavaScript转化为页面的渲染流程,包括渲染流水线的各个子阶段,如构建DOM树、样式计算和布局。在样式计算部分,详细讲解了CSS继承和层叠规则,以及如何通过Chrome开发者工具查看样式继承过程和最终计算样式。接着介绍了布局阶段的创建布局树和布局计算,以及Chrome团队正在进行的布局代码重构。总结了前三个阶段的要点,强调了浏览器对HTML数据的处理流程,以及每个节点拥有自己的样式和布局信息。最后留下思考题,引发读者思考和互动。整体内容详实,适合想深入了解页面渲染原理的读者阅读。

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

全部留言(78)

  • 最新
  • 精选
  • mfist
    关于下载css文件阻塞的问题,我理解 1 不会阻塞dom树的构建,原因Html转化为dom树的过程,发现文件请求会交给网络进程去请求对应文件,渲染进程继续解析Html。 2 会阻塞页面的显示,当计算样式的时候需要等待css文件的资源进行层叠样式。资源阻塞了,会进行等待,直到网络超时,network直接报出相应错误,渲染进程继续层叠样式计算

    作者回复: 借这里解答下留的题目: 当从服务器接收HTML页面的第一批数据时,DOM解析器就开始工作了,在解析过程中,如果遇到了JS脚本,如下所示: <html> <body> 极客时间 <script> document.write("--foo") </script> </body> </html> 那么DOM解析器会先执行JavaScript脚本,执行完成之后,再继续往下解析。 那么第二种情况复杂点了,我们内联的脚本替换成js外部文件,如下所示: <html> <body> 极客时间 <script type="text/javascript" src="foo.js"></script> </body> </html> 这种情况下,当解析到JavaScript的时候,会先暂停DOM解析,并下载foo.js文件,下载完成之后执行该段JS文件,然后再继续往下解析DOM。这就是JavaScript文件为什么会阻塞DOM渲染。 我们再看第三种情况,还是看下面代码: <html> <head> <style type="text/css" src = "theme.css" /> </head> <body> <p>极客时间</p> <script> let e = document.getElementsByTagName('p')[0] e.style.color = 'blue' </script> </body> </html> 当我在JavaScript中访问了某个元素的样式,那么这时候就需要等待这个样式被下载完成才能继续往下执行,所以在这种情况下,CSS也会阻塞DOM的解析。 所以JS和CSS都有可能会阻塞DOM解析,关于详细信息我们会在后面的章节中详细介绍。

    2019-08-15
    35
    280
  • Angus
    这节讲的有些过于省略了,好多东西没有深入去讲。我记得是DOM树和CSSOM树并行构建合成渲染树。从这个角度来说,不会阻塞DOM树的构建,但是会阻塞页面显示,因为页面显示需要完整的渲染树去完成布局计算。

    作者回复: 和DOM不一样,在源码里面并没有CSSOM这个词,你说的CSSOM 应该是就是styleSheets,这个styleSheets是能直观感受的到的。 渲染树也是16年之前的东西了,现在的代码完全重构了,你可以把LayoutTree看成是渲染树,不过和之前的渲染树还是有一些差别的。

    2019-08-15
    3
    87
  • Bean
    老师,渲染进程的工作原理您是从哪知道的,看浏览器的源码吗? 有链接吗来一个

    作者回复: 这个链接有一些参考资料你可以参考下:https://time.geekbang.org/column/article/116572

    2019-08-15
    19
  • William
    请问老师,为什么没有清晰地将输入内容和输出内容区分开来不好,我们平时编码过程中,应该尽量做到将输入内容和输出内容区分开来吗?

    作者回复: 分开来,结构会更加清晰,目前布局操作都是在主线程执行执行的,如果将布局的输入结构和输出结构分开来,那么可以在另外一个线程上执行布局操作,解析完把结果提交给主线程,这样会减轻主线程的压力。 所将输入结构和输出结构分开,后续就可以更好地重构渲染模块的代码了! 这也是Chrome渲染团队目前在做的一件事。

    2019-08-15
    7
    17
  • why.
    dom 树解析在前,合成在后,既然解析阶段都阻塞了,合成那就更不用说了啊,阻塞,可以这样理解吗?

    作者回复: 是的,理解的没问题

    2019-08-25
    3
  • 哎姆哦剋
    答案到底是什么,老师给个标准答案啊!

    作者回复: 已经回复了,看下评论

    2019-08-20
  • 潮汐
    对留言顶部第一条基本赞成。 但有个疑问:css文件的下载是在网络进程中进行,成功或失败,都是在通知准备渲染进程时已经确定了的吧,还是说渲染过程中会并行下载文件。如果是前者,应该没有阻碍的问题,最多延迟进入准备渲染阶段,也相当于阻塞了页面加载;如果是后者,猜测会阻碍布局树的生成。 提个建议:如果上一节课的问题有标准的对与错答案,下节课开头,老师能不能给一个解答或提及。

    作者回复: 我尽量在留言区回答问题吧,在正式文章里面回答问题会暂用比较多的时间。 另外CSS和JS下载都是异步的,也就是在解析DOM的过程中下载的。 这块内容我会在后面的页面模块做详细介绍。

    2019-08-15
  • XWL
    应该不会阻塞,link加载CSS样式本身是异步进行的,所以并不会影响浏览器继续解析之后的DOM的标签,最后由CSS树和DOM树合成render树,然后由render树渲染成页面,所以CSS的下载不阻塞DOM树,但阻塞着最后页面的渲染。 这是我的理解,有错误请指出。。。 另外,老师为什么不讲讲回流和重绘

    作者回复: 重绘和重排这些概念会在06节介绍,要等渲染流水线介绍完。

    2019-08-15
  • 刘大夫
    这节讲的真好,什么 CSSOM、渲染树不是不讲,而是真的过时了,现在就是分层、光栅化和合成
    2020-05-25
    1
    36
  • 海骅薯条
    下载CSS文件阻塞了,原则上会阻塞页面的显示,但是浏览器可以有自己的容错机制,例如下载超时后,均采用user-agent stylesheet 默认样式进行渲染就可以啦,虽然丑点,但是内容在HTML都显示出来啦
    2019-08-20
    35
收起评论
显示
设置
留言
78
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部