1. GUI线程
GUI
线程是浏览器线程之一,它的作用主要是以下几点:
- 解析
html
文档生成DOM
。 -
CSS
代码转换为CSSOM
。 - 结合
DOM
和CSSOM
生成渲染树。 - 生成布局
layout
。 - 将布局绘制
paint
在屏幕上。
屏幕刷新频率
GUI
线程渲染的结果不会立刻呈现在屏幕上,等屏幕刷新时才会呈现出来。屏幕刷新频率一般60HZ
,即16.6ms
刷新一次屏幕。
2. JS事件循环与DOM渲染
DOM
渲染是在GUI
线程中处理的,在下次宏任务执行前,GUI
渲染线程开始工作,对页面进行渲染。
JS
引擎和GUI
线程是互斥的,因为JS
引擎可能频繁修改DOM
样式,等一轮事件循环完毕之后再统一执行GUI
线程,这也是一种优化手段。来看一道题来加深理解:
new Promise((resolve) => {
resolve();
}).then((res) => {
console.log("微任务");
});
console.log("同步任务");
for (i = 0; i < 2000000000; i++) {};
const box = document.getElementById("box");
box.style.backgroundColor = "blue";
setTimeout(() => {
console.log("宏任务");
}, 0);
以上代码的执行流程是:
- 先执行同步任务,输出同步任务。
- 等待
2000000000
次循环执行完毕。 - 输出微任务。
-
id
为box
的元素变成蓝色。 - 输出宏任务。