一.浏览器渲染进程(注意是进程不是线程!关于二者区别可以百度了解!)
目录
一.浏览器渲染进程(注意是进程不是线程!关于二者区别可以百度了解!)
二.浏览器渲染流程
1.GUI渲染线程:
构建网页布局,Css,Html,建立Dom树,布局等;
此外GUI渲染线程与JS引擎都是独立线程,由于Js被设计为单线程,两者之间的关系是互斥的;
2.JS引擎线程:
进程下执行一个JS线程;
通常我们会把JS线程放在GUI线程之后,因为过大的JS线程处理可能时间较长,引起DOM内容树的构建;
3.事件触发线程:
和大部分语言一样,JS也有时间控制的循环,判断,等语句;
进程等待JS单线程处理;
4.定时触发器线程:
也就是我们JS常用到的setTimeout和setInterval线程;
这两个都是需要等待一定计时时间触发;
这么说JS引擎线程是不可能一直处于等待计时阶段,等待计时完毕,所以这部分其实由浏览器帮助计算的;
5.异步http请求:
通过Requset请求浏览器新开一个线程的请求,异步的线程请求将会被放到JS引擎线程队列中等待处理;
流程图:
注意:GUI引擎线程和JS引擎是互斥的;
二.浏览器渲染流程
目的是想记录我一直被提到的浏览器渲染步骤,这次就简单记录一下:
1.浏览器输入URL地址,浏览器加载一个新的进程;
2.对Http请求进行处理:包括解析IP地址,DNS查询,进行浏览器缓存搜索等;tcp协议;GET,POST请求;等等.....关于网络协议之类的东西;
3.等待响应,获取内容:
a:构建html创建Dom树,解析CSS构建render树(结合DOM合并渲染)
b:网页布局,对Layout/reflow各元素尺寸,位置的计算;
c:绘制don树元素,绘制关于页面像素之间的像素信息;
d:浏览器将完成信息发送给GPU,GPU引擎将进行合并处理显示在浏览器上;
4.Dom树渲染结束后,将对load事件,最后当然是Js代码部分处理;
流程图: