宏任务和微任务在浏览器渲染过程中的执行顺序

简介: 宏任务和微任务是浏览器事件循环中的两种任务类型。宏任务包括整体代码块、setTimeout等,微任务有Promise.then、MutationObserver等。每个宏任务执行完毕后,会先执行完所有微任务,再进行下一轮渲染或执行下一个宏任务。
  1. 浏览器渲染过程概述与事件循环基础

    • 浏览器渲染主要包括构建DOM树、构建CSSOM(CSS对象模型)、生成渲染树、布局和绘制等阶段。在这个过程中,JavaScript的执行是穿插其中的,并且JavaScript代码的执行会受到事件循环(Event Loop)机制的控制。
    • 事件循环机制管理着宏任务队列(Macro - Task Queue)和微任务队列(Micro - Task Queue)。宏任务队列包含如script(整体脚本)、setTimeoutsetIntervalI/O操作(像Ajax请求)等任务;微任务队列包含Promise.then()MutationObserverprocess.nextTick(在Node.js环境下)等任务。
  2. 执行顺序规则

    • 初始脚本执行作为首个宏任务:当浏览器开始加载一个网页时,解析HTML遇到的第一个script标签内的代码被视为第一个宏任务。在这个宏任务执行过程中,如果遇到同步代码,会直接执行;如果遇到异步宏任务(如setTimeout),会将其回调函数添加到宏任务队列的末尾;如果遇到微任务(如Promise.then),会将其回调函数添加到微任务队列。
    • 宏任务执行间隙检查微任务队列:当一个宏任务执行完毕后,浏览器不会立即执行下一个宏任务,而是先检查微任务队列。如果微任务队列中有任务,会按照先进先出(FIFO)的顺序依次执行微任务队列中的所有任务。只有当微任务队列清空后,才会从宏任务队列中取出下一个宏任务并执行。
  3. 具体示例说明

    • 假设我们有以下代码:
      ```html
      <!DOCTYPE html>








```

  • 执行过程如下:
    • 首先,浏览器将script标签内的代码作为第一个宏任务(Macro Task 1)开始执行。
      • 打印Script start (Macro Task 1)
      • 遇到promise1,将其.then回调函数添加到微任务队列(这是微任务1)。
      • 遇到setTimeout,将其回调函数添加到宏任务队列(这将是Macro Task 2)。
      • 打印Script end (Macro Task 1),此时Macro Task 1执行完毕。
    • 接着,因为宏任务1结束,浏览器检查微任务队列。发现有微任务1,开始执行微任务队列中的任务。
      • 执行promise1.then回调函数,打印Promise data 1,然后更新idcontent的DOM元素的文本内容,将Promise 1 data added.添加进去。此时微任务1执行完毕。
    • 微任务队列清空后,浏览器从宏任务队列中取出下一个宏任务(Macro Task 2)执行。
      • 执行setTimeout的回调函数,打印Timeout callback (Macro Task 2)
      • 遇到promise2,将其.then回调函数添加到微任务队列(这是微任务2)。此时Macro Task 2中的同步代码执行完毕。
    • 因为宏任务2中的同步代码执行完毕,浏览器再次检查微任务队列。发现有微任务2,开始执行微任务队列中的任务。
      • 执行promise2.then回调函数,打印Promise data 2,然后更新idcontent的DOM元素的文本内容,将Promise 2 data added.添加进去。此时微任务2执行完毕。

在浏览器渲染过程中,这种宏任务和微任务的执行顺序确保了一些对及时性要求较高的操作(如微任务中的DOM更新)能够及时执行,同时又能合理地安排一些可以延迟执行的操作(如宏任务中的定时器回调),从而使浏览器能够在处理JavaScript代码的同时,尽可能流畅地进行渲染工作。

相关文章
|
2月前
|
存储 前端开发 开发者
|
2月前
|
缓存 自然语言处理 前端开发
浏览器渲染
【10月更文挑战第28天】浏览器渲染涉及将HTML、CSS和JavaScript代码转换为可视网页,主要步骤包括:解析HTML构建DOM树、解析CSS构建CSSOM树、合并DOM与CSSOM生成渲染树、布局确定元素位置和尺寸、绘制元素到屏幕、合成图层形成最终图像。此过程不断优化以提升性能。
|
2月前
|
前端开发 JavaScript 异构计算
简述浏览器的渲染原理
浏览器渲染原理主要包括以下步骤:1)解析HTML文档生成DOM树;2)解析CSS生成CSSOM树;3)结合DOM与CSSOM生成渲染树;4)布局计算(回流)确定元素大小和位置;5)绘制(Paint)将节点转为图形内容;6)合成(Composite)多层图像。整个过程从文档解析到最终输出完整网页,并通过优化技术提升性能。
|
7月前
|
缓存 JavaScript 前端开发
浏览器渲染:理解页面加载的幕后工作
浏览器渲染:理解页面加载的幕后工作
|
6月前
|
移动开发 前端开发 JavaScript
浏览器端图表渲染技术SVG, VML HTML Canvas
浏览器端图表渲染技术SVG, VML HTML Canvas
40 0
|
7月前
|
前端开发 JavaScript 数据可视化
探索浏览器的内心世界:渲染机制的奥秘
探索浏览器的内心世界:渲染机制的奥秘
探索浏览器的内心世界:渲染机制的奥秘
|
7月前
|
消息中间件 JavaScript 前端开发
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)
106 0
|
7月前
|
消息中间件 前端开发 Java
【面试题】前端必修-浏览器的渲染原理
【面试题】前端必修-浏览器的渲染原理
|
Web App开发 存储 监控
浏览器基础原理-安全: 渲染进程-安全沙盒
浏览器基础原理-安全: 渲染进程-安全沙盒
72 0
|
存储 缓存 前端开发