1. 浏览器的渲染进程
浏览器的渲染进程又称为浏览器内核,内部是多线程的。主要负责页面渲染,脚本之行,事件处理等
1.1. GUI渲染线程
负责渲染浏览器界面,解析html,css,构建DOM树和RenderObject树,布局和绘制等。 当界面需要重绘或者回流的时候,线程就会执行。
1.2. js引擎线程
也称为js内核负责解析js脚本,运行代码。 js引擎一直等待着任务队列中的任务到来,然后加以处理,一个Tab页(render进程)中只有一个js线程在执行程序,js引擎线程与GUI渲染线程是互斥的,js执行的时候GUI线程就会被挂起,GUI更新会被保存在一个队列中,等待js引擎空闲时再执行
2. 浏览器渲染流程
- 解析html文件,构建Dom树,同时浏览器主进程负责下载css文件。
- css文件下载完成,解析css文件并结合DOM树合并称RenderObject树
- 布局渲染树,计算尺寸与位置
- 绘制渲染树,绘制页面信息
- GPU进程合并图层并显示出页面
2.1 为什么js是单线程的?
如果js是多线程的方式操作UI 和 DOM,在多线程的交互下,处于UI的DOM节点就可能成为一个临界资源,加入有两个线程同时操作一个DOM,一个负责修改一个负责删除,就需要浏览器来裁决哪一个生效,当然我们可以通过加锁来解决,但是这样又增加了复杂性。
2.2为什么js会阻塞页面加载
由于js是可以操作DOM的,如果在修改元素属性的时候同时渲染界面,那么渲染进程前后的数据就可能不一致了,为了防止不可控的结果,浏览器设置了GUI渲染线程与js引擎为互斥关系