一、客户端容器
1.浏览器构架对比
2.常见浏览器内核
3.渲染进程(多线程构架)
内部是多线程实现,主要负责页面渲染,脚本执行,事件处理,网络请求等
- js引擎线程: 负责解析js脚本,运行js程序,每个渲染进程下面只有一个js引擎线程。与GU|渲染线程互斥,如果js任务执行事件过长,会导致页面卡顿
- GUI渲染线程: 负责渲染浏览器界面,解 析html、css,构建dom树和render树、布局、绘制,和js引擎线程互斥,GUI更新会在js引擎空闲时立即执行
- 事件触发: 由宿主环境提供,用于控制事件循环,不断地从事件队列里取出任务执行
- 网络线程: 在XHR、Fetch等发起请求后新开一个网络线程请求,如果设置了回调函数,在状态变更时,将回调放入事件队列,等待js引擎执行
- 定时器线程: 定时器所在线程,setTimeout、setInterval计时完毕后,将回调添加到事件队列,等待js引|擎执行
4.渲染引擎、js引擎
一个完整的浏览器包含浏览器内核和浏览器的外壳(shell),内核分成两部分:渲染引擎和js引擎。由于js引擎越来越独立,内核就倾向于只指渲染引擎。
浏览器一般由七个模块组成,User Interface(用户界面)、Browser engine(浏览器引擎)、Rendering engine(渲染引擎)、Networking(网络)、JavaScript Interpreter(js解释器)、UI Backend(UI 后端)、Date Persistence(数据持久化存储)
5.工作流程
1. 网络线程负责加载网页资源
2. JS引擎解析JS脚本并且执行
3. JS解析引擎空闲时,渲染线程立即工作
4. 用户交互、定时器操作等产生回调函数放入任务队列中
5. 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行