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

简介: 宏任务和微任务是浏览器事件循环中的两种任务类型。宏任务包括整体代码块、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代码的同时,尽可能流畅地进行渲染工作。

相关文章
|
7月前
|
Web App开发 Java 测试技术
多任务一次搞定!selenium自动化复用浏览器技巧大揭秘
多任务一次搞定!selenium自动化复用浏览器技巧大揭秘
|
2月前
|
存储 前端开发 开发者
|
23天前
|
存储 人工智能 数据库
Codel:AI代理工具,支持在终端、浏览器、编辑器执行复杂任务和项目
Codel是一款全自主AI代理工具,支持在终端、浏览器和编辑器中执行复杂任务和项目。它运行在沙盒化的Docker环境中,具备自主操作能力,内置浏览器和文本编辑器,所有操作记录存储于PostgreSQL数据库。Codel能够自动完成复杂任务,如创建项目结构、进行网络搜索等,适用于自动化编程、研究与开发、教育与培训以及数据科学与分析等多个领域。
59 11
Codel:AI代理工具,支持在终端、浏览器、编辑器执行复杂任务和项目
|
2天前
|
人工智能 API 数据库
Browser Use:开源 AI 浏览器助手,自动完成网页交互任务,支持多标签页管理、视觉识别和内容提取等功能
Browser Use 是一款专为大语言模型设计的智能浏览器工具,支持多标签页管理、视觉识别、内容提取等功能,并能记录和重复执行特定动作,适用于多种应用场景。
74 0
Browser Use:开源 AI 浏览器助手,自动完成网页交互任务,支持多标签页管理、视觉识别和内容提取等功能
|
1月前
|
JavaScript 前端开发 API
浏览器渲染过程中如何处理异步任务
在浏览器渲染过程中,异步任务通过事件循环机制处理。JS执行时,同步任务在主线程上执行,形成一个执行栈。异步任务则被推入任务队列中,待主线程空闲时按顺序调用,确保页面流畅渲染与响应。
|
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 前端开发
浏览器渲染:理解页面加载的幕后工作
浏览器渲染:理解页面加载的幕后工作
|
4月前
|
存储 JavaScript
纯Vue实现网页日常任务清单小功能(数据存储在浏览器)
这篇文章介绍了如何使用纯Vue实现一个网页日常任务清单的小功能,数据存储在浏览器中以保持数据持久化。文章内容包括功能描述、效果演示、核心代码修改方法,以及已经打包好的项目源码下载链接。作者还提供了友情提示,指出了数据存储到浏览器的核心代码部分,方便读者快速理解和应用。
|
7月前
|
存储 人工智能 应用服务中间件
Web应用是一种通过互联网浏览器和网络技术在互联网上执行任务的计算机程序
【5月更文挑战第30天】Web应用是一种通过互联网浏览器和网络技术在互联网上执行任务的计算机程序
116 2