浏览器核心线程
浏览器在渲染网页是一个复杂的过程, 整个过程由多个独立线程协作
- GUI渲染线程
- JS引擎线程
- 事件触发线程
- 定时触发器线程
- 异步HTTP请求线程
线程能力
GUI渲染线程
-
作用:负责渲染浏览器界面,包括解析、构建、布局、绘制等功能,并最终将数据展示到屏幕
-
特点:
- 执行在主线程
- GUI渲染线程受JS引擎线程执行影响,当JS引擎线程执行时,会将GUI渲染线程挂起,等待JS引擎执行完成会重新激活(因为JS执行可能会修改dom,影响渲染流程)。
- 当页面发生重排(reflow)、重绘(repaint)时,会唤起GUI渲染线程。
-
补充:浏览器渲染流程的几个重要流程皆由GUI渲染线程负责
JS引擎线程
-
作用:解析和执行JS代码,调用各类API(DOM API、Navigator API等)操作页面
-
工作机制:实时监听JS任务队列,对任务分类、调度和执行
-
特点:
- 执行在主线程
- 一旦JS引擎开始执行任务,GUI渲染线程将被挂起,直到任务执行完成
事件触发线程
-
作用:监听用户交互行为,如鼠标点击、键盘输入、用户触摸等行为
-
工作机制:与IO外设接口打交道,监听到用户交互行为则向任务队列中添加任务
-
特点:
- 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)
定时触发器线程
-
作用:处理定时器(如setTimeout、setInterval)行为
-
工作机制:作为计时器,计时完成则向任务队列中添加任务
-
特点:
- 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)
- HTML5规范要求小于4ms的定时默认为4ms(delay < 4ms ? 4ms : delay)
异步HTTP请求线程
-
作用:处理异步请求(XMLHttpRequest、fetch)行为
-
工作机制:
- 由主线程任务(GUI渲染、JS执行时)唤起
- 客户端与服务端连接、通信和断开
- 按照参数组装请求包、读取响应包并做初步处理(错误响应状态拦截、缓存保存和读取 等)
- 响应数据处理完成后将向任务队列中添加任务
-
特点:
- 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)
总结
-
GUI渲染线程和JS引擎线程执行在主线程,GUI渲染线程受JS引擎影响(JS执行时间过长影响页面渲染)
-
事件触发线程、定时触发器线程、异步HTTP请求线程作为辅助线程,它们相对独立,负责各自任务,执行完成任务后都将结果通过任务形式添加到任务队列
- 可以把主线程理解为一个组装厂,辅助线程理解为供应不同物料的供应商,这些供应商互相独立。组装厂开始运行时会拟一个组装手册,记录如何组装,需要哪些物料,其中如何组装是组装厂需要处理的事,而物料则通知各个供应商,各供应商开始生产,生产完成后运到组装厂,组装厂在不同组装步骤使用到不同物料,最终生产出一个完整的物品