简单理解渲染引擎和事件循环机制

简介: 简单理解渲染引擎和事件循环机制

简单理解渲染引擎和事件循环机制


浏览器既是搬运工,也是翻译官。

  • 将枯燥的网络资源(html css js)从服务器“搬”到本地
  • 将资源“翻译”成五彩的页面
  • 接受并反馈用户的交互

渲染引擎

翻译的工作,最主要是由,浏览器的渲染引擎做的。

翻译的过程如下:

  • 访问网址的时候,服务器一般会首先返回 html 文件
  • 渲染引擎,开始解析html文件,生成DOM树。在这过程中遇到其他资源(css img js),会发出新的请求
  • 识别并加载所有的 CSS 样式信息,生成CSSOM树,注意这里的样式会添加到DOM树的各个节点
  • DOM树和CSSOM树合并,将不可见的元素剔除,生成render 树(:after :before 伪元素会在此时被构建到 DOM 树中)
  • 计算页面中所有元素的相对位置、大小等信息,就有了盒模型
  • 开始把每一个页面图层转换为像素,并对所有的媒体文件进行解码,然后五彩的页面就显示出来了

总结下:DOM树 => CSSOM树 => render树 => 布局 => 绘制

重绘、重排、图层

页面不会一成不变的,JS 可以随意操作 DOM,从而会让渲染引擎再次翻译。

不同的操作,翻译成本不同,主要分为两种操作:

  • 重排(回流):操作引发了 DOM 几何尺寸的变化(修改元素的宽高或隐藏元素等)时,于是需要重新计算元素 的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再绘制出来。 对应的流程:可能更新DOM树 => 更新CSSOM树 => 更新render树 => 重新布局 => 重新绘制
  • 重绘:操作只修改了未影响元素几何属性的样式(比如修改了颜色或背景色)时,就会跳过计算、直接绘制。 对应的流程: 更新CSSOM树 => 更新render树 => 重新绘制

引发重排的操作:

  • 修改元素的几何属性
  • 改变 DOM 的结构,增减、移动等
  • 获取一些特定属性的值:offsetTop|Left|Width|Height、scrollTop|Left|Width|Height、 clientTop|Left|Width|Height,这些属性均通过即时计算得到,于是浏览器为了获取这些值,也会进行回流

重排的代价很昂贵,尽量减少重排的操作,频繁引发重排,会让页面卡顿滴~

事件循环机制 event-loop

以上还没提到 JS 文件的翻译,JS 是由 JS 引擎翻译的。

先提一些名词:

  • 宏任务(macro-task)队列:script(整体代码)、setTimeout、setInterval 等
  • 微任务(microtask) 队列:Promise 等
  • 函数调用栈

JS 引擎从开始执行 Script 脚本的时候,这本身就是一个宏任务,然后创建全局上下文,进栈

  • 如果遇到Promisethen代码,不会直接执行,会在此宏任务的内部,开启一个微任务队列,这个then任务就是排队的第一人
  • 如果遇到setTimeout/setInterval,不会直接执行,会另外开启一个宏任务,排在当前宏任务的后面,如果这个setTimeout里面再遇到then,也会在它的内部开启一个微任务队列
  • 如果当前的宏任务的同步代码执行完了,会依次执行当前宏任务内部的,微任务队列里的任务
  • 如果当前的宏任务的同步代码执行完了,微任务队列里的任务也执行完了,就会执行下一个宏任务
  • 函数调用栈,每次执行一个函数,就创建了函数上下文,进栈,执行完,出栈,没啥说的,之前说过了
function app() {
  // s-1
  setTimeout(() => {
    console.log("1-1");
    // p-1
    Promise.resolve().then(() => {
      console.log("2-1");
    });
  });
  console.log("1-2");
  // p-2
  Promise.resolve().then(() => {
    console.log("1-3");
    // s-2
    setTimeout(() => {
      console.log("3-1");
    });
  });
}
app();
// 1-2 1-3 1-1 2-1 3-1

画了个图,希望能帮助读者理解:

网络异常,图片无法展示
|

目录
相关文章
|
1月前
|
存储 前端开发 JavaScript
事件循环机制是如何工作的
【8月更文挑战第3天】事件循环机制是如何工作的
29 1
|
1月前
|
存储 前端开发 JavaScript
事件循环机制是什么
【8月更文挑战第3天】事件循环机制是什么
28 1
|
1月前
|
前端开发 JavaScript
前端搞懂事件循环机制
【8月更文挑战第3天】前端搞懂事件循环机制
31 1
|
2月前
|
存储 JavaScript 前端开发
在?聊聊浏览器事件循环机制
在?聊聊浏览器事件循环机制
21 0
|
4月前
|
开发框架 JavaScript 前端开发
JavaScript的事件循环机制是其非阻塞I/O的关键
【5月更文挑战第13天】JavaScript的事件循环机制是其非阻塞I/O的关键,由调用栈、事件队列和Web APIs构成。当异步操作完成,回调函数进入事件队列,待调用栈空时,事件循环取队列中的任务执行。在游戏开发中,事件循环驱动游戏循环更新,包括输入处理、游戏逻辑更新和渲染。示例代码展示了如何模拟游戏循环,实际开发中则常使用游戏框架进行抽象处理。
72 4
|
4月前
|
前端开发 JavaScript UED
JavaScript 的事件循环机制是其非阻塞 I/O 模型的核心
【5月更文挑战第9天】JavaScript的事件循环机制是其非阻塞I/O的关键,通过单线程的调用栈和任务队列处理异步任务。当调用栈空时,事件循环从任务队列取出一个任务执行,形成循环。异步操作完成后,回调函数进入任务队列,等待被事件循环处理。微任务如Promise回调在每个宏任务结束后执行。此机制确保JavaScript能高效处理异步操作,不阻塞主线程,提供流畅的用户体验。
38 2
|
4月前
|
消息中间件 存储 前端开发
理解JavaScript事件循环机制
理解JavaScript事件循环机制
31 1
|
4月前
|
小程序 算法 UED
【专栏】小程序图片合成就绪渲染的转变,从异步并发渲染到同步阻塞渲染
【4月更文挑战第29天】本文探讨了小程序图片合成就绪渲染的转变,从异步并发渲染(提高效率,并发处理但可能导致资源竞争和顺序难控)到同步阻塞渲染(顺序可控,资源管理更精细,可能引起界面卡顿)。同步阻塞通过任务队列和阻塞机制确保顺序,解决并发问题。注意避免长时间阻塞,及时释放资源,优化任务效率,并结合异步处理。选择合适方案取决于实际需求,以平衡效率与一致性。
62 1
|
4月前
|
编解码 Dart UED
Flutter单线程异步及Isolate使用过程遇到的问题
Flutter单线程异步及Isolate使用过程遇到的问题 在Flutter中,所有的代码都运行在单线程中。这意味着如果我们的代码执行时间过长,就会导致UI线程卡顿,影响用户体验。因此,Flutter提供了一些异步机制来解决这个问题。
127 0
|
Dart 调度
Dart事件循环机制
Dart事件循环机制
88 0