当前位置:网站首页>重新认识浏览器的渲染过程
重新认识浏览器的渲染过程
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。
参考资料
边栏推荐
- ML's yellowbrick: A case of interpretability (threshold map) for LoR logistic regression model using yellowbrick based on whether Titanic was rescued or not based on the two-class prediction dataset
- 使用tf.image.resize() 和tf.image.resize_with_pad()调整图像大小
- leetcode/子串中不能有重复字符的最长子串
- V8中的快慢数组(附源码、图文更易理解)
- Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
- 【并发编程】ReentrantLock的lockInterruptibly()方法源码分析
- ML之yellowbrick:基于titanic泰坦尼克是否获救二分类预测数据集利用yellowbrick对LoR逻辑回归模型实现可解释性(阈值图)案例
- 3D 语义分割——2DPASS
- First domestic open source framework 】 【 general cloud computing framework, any program can be made into cloud computing.
- 【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
猜你喜欢

MiniAPI of .NET6 (14): Cross-domain CORS (Part 1)

What is the difference between the generator version and the viewer version?

逆波兰表达式求值

rosbridge-WSL2 && carla-win11

射频芯片(RFIC)的协议之5G及其调制

Creo 9.0二维草图的诊断:重叠几何

Another MySQL masterpiece published by Glacier (send the book at the end of the article)!!

密码学基础以及完整加密通讯过程解析

冰河又一MySQL力作出版(文末送书)!!

ML之interpret:基于titanic泰坦尼克是否获救二分类预测数据集利用interpret实现EBC模型可解释性之全局解释/局部解释案例
随机推荐
Click the icon in Canvas App to generate PDF and save it to Dataverse
Unity2021发布WebGL雾效消失问题
P1449 后缀表达式
双目IMU标定kalibr
Take an example of a web worker
Testng listener
栈的压入、弹出序列
websocket多线程发送消息报错TEXT_PARTIAL_WRITING--自旋锁替换synchronized独占锁的使用案例
Shell 用法梳理总结
V8中的快慢数组(附源码、图文更易理解)
Analysys Analysis: The transaction scale of China's online retail B2C market in Q2 2022 will reach 2,344.47 billion yuan
What is memoization and what is it good for?
RSS feeds WeChat public - feed43 asain
[2022强网杯] polydiv和gamemaster
SolidEdge ST8安装教程
用队列模拟实现栈
RSS订阅微信公众号初探-feed43
Scala基础【正则表达式、框架式开发原则】
Unity 截取3D图像 与 画中画PIP的实现
Creo9.0 绘制中心线