当前位置:网站首页>重新认识浏览器的渲染过程
重新认识浏览器的渲染过程
2022-08-03 23:31:00 【yellowbird的飞行日记】
前言
之前我写过的文章一文解答web性能优化中提及了重排和重绘的性能消耗问题,那时候只是一笔带过,而我只是大概的了解而已。为了下一阶段的学习对它能有更清晰的认知,我又重新去看了这一块的内容。
一、浏览器的渲染进程
浏览器的进程有很多:如Browser进程(主线程)、渲染进程、GPU进程和插件进程。
这里主要讲一下渲染进程,这是和前端的工作息息相关的。
渲染进程又划分了多个线程:
1、GUI线程
负责渲染页面。我们所知道的解析HTML和CSS,构建DOM树、CSSOM树和render树和绘制布局的过程都在这一个线程中进行。只要界面需要重绘或者重排时,就会执行该线程。
2、JS引擎线程
负责解析并运行JS代码。值得注意的是,它与GUI线程是互斥的关系。当JS代码执行的时间过长,会阻塞页面渲染。这也就是为什么我们常常把JS代码放到代码的末端执行的原因。
3、事件触发线程
这个线程并不属于JS引擎线程中,而是单独的一条线程,负责控制事件循环,就是我们常说的event loop。在事件触发时,会将对应的事件添加到处理队列的对尾,等待Js引擎处理。
4、计时器触发线程
这个线程同样时不属于Js引擎线程的。负责计时,计时完毕后,将事件添加到事件队列,等待Js引擎处理。
5、异步HTTP请求线程
在XMLHttpRequest连接后,浏览器会创建一个异步请求线程来监测请求的状态变更。
二、页面渲染过程
先放一个非常常见的图,能够快速看懂这个过程。

1、 解析HTML和CSS
HTML解析过程是一个深度遍历的过程,它会遍历一个节点下的所有子节点才会开始解析下一个兄弟节点,最后构建出一个DOM树。
CSS同样也会解析并构建成为CSSOM树。
2、构建render树
第二步,浏览器会拿着已经构建好的DOM和CSSOM来构建一个新的树,称之为render树。
值得一提的是,这个过程会筛选掉那些不可视的元素,如含有“display:none”的元素。
另外,那种脱离文档流的元素在render树和Dom树的位置也不尽相同。
所以,render树和Dom树并不是一一对应的,只能说他们是有着对应关系的。
3、布局和绘制
到了这个阶段,渲染树的节点是没有位置和大小的,计算元素的位置和大小的这个过程,称之为布局(layout)。
而之后根据渲染树内容绘制在浏览器上。
这个过程比较消耗性能,所以浏览器会试着用最小的响应来应对元素的变化,如当元素的颜色发生变化时,并不会引起重新布局,而只是重新绘制而已。只有在Dom节点发生较大的变化,才会引发重新布局,也就是我们常说的重排,也叫回流。
结语
重看了一遍相关的知识,觉得自己对浏览器的认识再次加深了一些。为什么各大框架都喜欢用虚拟DOM?其实答案就是为了减少重排和重绘带来的性能问题,不过仅仅是为了解决更新的性能问题,毕竟第一次挂载的时候,仍要深度遍历我们所写的HTML。
参考资料
边栏推荐
- Republish the lab report
- MCS-51单片机,定时1分钟,汇编程序
- Pytest learn-setup/teardown
- 电子邮件安全或面临新威胁!
- 简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
- The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
- 牛客2022 暑期多校3 H Hacker(SAM + 线段树查询区间内部最大子段和)
- SolidEdge ST8安装教程
- 走迷宫 BFS
- HNUCM 您好中国
猜你喜欢
射频芯片ATE测试从入门到放弃之参数测试
密码学基础以及完整加密通讯过程解析
设置工作模式与环境(下):探查和收集信息
First domestic open source framework 】 【 general cloud computing framework, any program can be made into cloud computing.
Shell 用法梳理总结
获国际权威认可 | 云扩科技入选《RPA全球市场格局报告,Q3 2022》
RSS feeds WeChat public - feed43 asain
Another MySQL masterpiece published by Glacier (send the book at the end of the article)!!
AOSP CameraLatencyHistogram的原理与使用
- the skip/skipif Pytest learning
随机推荐
【MySQL —— 索引】
完全二叉树问题
Cloud platform construction solutions
2022/8/3 考试总结
689. 三个无重叠子数组的最大和
Minimized installation of debian11
Click the icon in Canvas App to generate PDF and save it to Dataverse
【LeetCode】最长公共子序列(动态规划)
Scala basics [regular expressions, framework development principles]
jav一键生成数据库文档
Pytest学习-skip/skipif
log4j-slf4j-impl cannot be present with log4j-to-slf4j
Work Subtotal QT Packing
2022/8/3 Exam Summary
utils timer
3D 语义分割——2DPASS
ts用法大全
七夕?new一个对象
智能座舱的「交互设计」大战
走迷宫 BFS