浏览器消息循环

news/2025/2/8 16:48:25/文章来源:https://www.cnblogs.com/is-DW/p/18704615

浏览器事件循环的完整与准确叙述(依据 W3C/WHATWG 规范)


一、核心机制

JavaScript 的 单线程模型 通过 事件循环(Event Loop) 管理异步操作,其设计核心如下:

  1. 非阻塞执行:允许主线程在等待 I/O、定时器等操作时继续处理其他任务。
  2. 优先级调度任务(Task)微任务(Microtask) 的分级调度,确保高优先级代码优先执行。
  3. 与渲染流程同步:事件循环在每个循环中可能触发页面渲染,维持用户界面的流畅性。

二、严格术语定义

根据 WHATWG HTML 标准 (HTML Living Standard):

  • 任务(Task):独立的、按顺序执行的工作单元,例如:
    • <script> 同步代码、setTimeout/setInterval 回调、用户事件处理(点击、键盘等)。
  • 微任务(Microtask):在当前任务完成后 立即执行 的高优先级回调,例如:
    • Promise.thenPromise.catchMutationObserver 回调。
  • 渲染步骤(Rendering Steps):浏览器在适当时机更新页面显示的流程,包含:
    • 执行与渲染相关的回调(如 requestAnimationFrame)。
    • 计算样式(Style)、布局(Layout)、绘制(Paint)和合成(Composite)。

三、事件循环的详细处理流程

每轮事件循环(Event Loop Iteration)包含以下规范化步骤:

阶段 1:选择一个任务(Select a Task)

  1. 从任务队列中取出最早的任务
    • 任务队列可能有多个(如定时器队列、网络请求队列),但每个队列按先进先出(FIFO)顺序处理。
  2. 执行该任务
    • 运行至完成(Run to Completion),期间不会被其他任务中断。
    • 同步代码中对其他任务的调度(如新的 setTimeout)会被加入相应队列。

阶段 2:执行微任务检查点(Perform a Microtask Checkpoint)

  1. 清空微任务队列
    • 循环执行微任务队列中的所有微任务。
    • 若处理微任务期间生成 新的微任务,会持续执行直至队列为空。
  2. 关键规则
    • 微任务会在 当前任务结束后、渲染步骤开始前 全部完成。

阶段 3:渲染更新(Update the Rendering)

由浏览器决定是否在本轮循环执行渲染(通常依据屏幕刷新率,如 60Hz):

  1. 触发与渲染相关的回调
    • requestAnimationFrame 回调:在样式计算和布局前执行,确保动画逻辑与垂直同步信号(VSync)对齐。
    • 其他渲染相关操作:例如 ResizeObserver 回调、MediaQuery 变更监听。
  2. 渲染管线(Rendering Pipeline)
    • 样式计算(Style):确定每个节点的计算样式。
    • 布局(Layout):计算节点在视口中的几何位置。
    • 绘制(Paint):将布局结果转换为屏幕像素。
    • 合成(Composite):将各图层合并为最终图像提交给屏幕。

阶段 4:处理空闲时间(Idle Period)

  • 若存在空闲时段,触发 requestIdleCallback 回调,执行低优先级任务(如日志上报、预加载)。

四、执行顺序验证案例

console.log('Script Start'); // 任务-1(同步代码)setTimeout(() => {console.log('setTimeout'); // 任务-2(新任务)
}, 0);Promise.resolve().then(() => {console.log('Promise'); // 微任务-1
});requestAnimationFrame(() => {console.log('rAF'); // 渲染步骤回调
});console.log('Script End'); // 任务-1(同步代码结束)

输出顺序与解析

  1. Script Start → Script End
    • 主任务(任务-1)依次执行同步代码。
  2. Promise
    • 当前任务结束后,清空微任务队列。
  3. rAF
    • 进入渲染步骤,执行 requestAnimationFrame 回调。
  4. setTimeout
    • 新任务(任务-2)在下一轮事件循环执行。

五、关键规则总结

  1. 任务与微任务的优先级
    • 微任务队列的优先级高于任务队列。
  2. 不可中断性
    • 每个任务和微任务执行时不可中断,直至代码运行完成。
  3. 渲染的主动权在浏览器
    • 并非每轮事件循环都会触发渲染,浏览器会根据优化策略(如页面是否可见、动画是否活跃)控制渲染频率。
  4. 输入响应的优化
    • 用户交互触发的任务(如点击事件)可能被优先调度。

六、术语对比表(社区 vs 规范)

社区常用术语 规范标准术语 解释
宏任务(MacroTask) 任务(Task) 基本调度单位,如 setTimeout 回调
微任务(MicroTask) 微任务(Microtask) 高优先级回调,在任务结束后立即执行
渲染队列 渲染步骤(Rendering Steps) 包含 rAF 和渲染管线操作

七、开发者实践指南

  1. 避免阻塞主线程
    • 拆分长任务:超过 50ms 的任务应将工作分割为小块,通过 setTimeoutrequestIdleCallback 分散执行。
  2. 合理利用微任务
    • 快速响应异步结果:利用 Promise 进行链式调用,避免不必要的渲染延迟。
  3. 动画与性能优化
    • 始终使用 requestAnimationFrame:替代 setTimeout 执行动画,确保与浏览器渲染节奏同步。
  4. 避免布局抖动
    • 在渲染步骤前批量读取布局属性,减少强制同步布局(Forced Synchronous Layout)。

八、流程图解


九、标准文档依据

  • 任务与微任务:HTML Standard - Event Loops
  • 渲染步骤:HTML Standard - Update the Rendering
  • requestAnimationFrame:HTML Standard - Animation Frames

通过以上规范化的叙述,可准确理解浏览器事件循环的核心机制,避免因术语混淆导致的开发误区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880879.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析实体-关系模型(ER 图):理论与实践全解析

title: 深入剖析实体-关系模型(ER 图):理论与实践全解析 date: 2025/2/8 updated: 2025/2/8 author: cmdragon excerpt: 实体-关系模型(ER 模型)是一种用于描述现实世界中对象及其关系的概念模型,作为数据库设计的重要工具,ER 模型以图形方式表示数据之间的联系。通过…

系统调用之SysWhispers

一、介绍 SysWhispers 是一个通过直接系统调用绕过系统调用钩子的工具。SysWhispers 有多个版本,具有不同的特性。本文将分析各个版本之间的改进。SysWhispers是64 位系统生成了支持直接系统调用的头文件/ASM 文件植入。它支持从 Windows XP 到 Windows 10 19042(20H2)的系统…

服务部署操作之nssm

1、使用背景: 之前在windows server IIS管理器中部署程序操作复杂,参考各位大佬以后发现还有更好的方法;2、nssm介绍: 作为服务封装程序,可以将exe封装成服务,实现开机自启动,简单易上手,功能强大;3、nssm配置详情: 官网地址:https://nssm.cc/download 下载完成以后…

[羊城杯 2024]你这主函数保真么 _wp

main函数确实没有什么内容但是看函数名的时候可以发现有encrypt和rot13两种加密 还有tcf在_GLOBAL__sub_I_flag中,可以看到程序的执行逻辑,但是顺序是不对的,大概也猜得出来是什么样的顺序首先输入并且判断长度rot13加密一维DCT加密 DCT加密的特点就是嵌套循环里面的内容将加…

乐刻运动:基于 RocketMQ + MQTT 实现健身产业数字化升级

乐刻运动通过采用阿里云的云消息队列 RocketMQ 版和云消息队列 MQTT 版,不仅提升了系统的实时数据处理能力,还增强了系统的可扩展性、可靠性和性能,为业务的持续发展和流畅的用户体验,提供了坚实的技术支持,进一步推动了数字经济与健身产业的深度融合。作者:吉宪、稚柳 乐…

AI 在软件测试中的应用

软件测试人员,在工作中的任务流程: 测试计划-测试用例设计(脚本)-测试执行-测试报告一个新的技术, 带来的变革分为四种:替代,加强, 修改, 重塑 目前AI并不能替代软件测试人员, 但可以对测试流程进行加强, 修改, 和重塑 加强:把AI当做测试助手, 帮助解决一些测试…

30N06-ASEMI中低压N沟道MOS管30N06

30N06-ASEMI中低压N沟道MOS管30N06编辑:ll 30N06-ASEMI中低压N沟道MOS管30N06 型号:30N06 品牌:ASEMI 封装:TO-252 批号:最新 最大漏源电流:30A 漏源击穿电压:60V RDS(ON)Max:24mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道…

P5266 【深基17.例6】学籍管理(map)

首先要注意score的范围,所以要用long long int,其次OK两个字母都是大写,并且插入和修改后都要输出Ok #include<iostream> #include<set> #include<map> #define int long long using namespace std; signed main() {map<string, int>mapstudent;int…

Rust编程Bug解决

Brainfuck工程,遇到版本以来错误: https://github.com/mohanson/brainfuck/tree/master1. cargo update 的详细解释 cargo update 是 Cargo(Rust 的包管理器)的一个命令,用于更新项目的依赖版本。以下是它的具体行为和作用: (1) 更新 Cargo.lock 文件Rust 项目有两个关键…

唯品会联盟唯享客-各种广告平台推广下的DeepLink链接与UniversalLink链接生成及下单转化归因ROI联调等对接技术的实现

唯品会联盟&唯享客-各种广告平台推广下的DeepLink链接与UniversalLink链接生成及下单转化归因ROI联调等对接技术的实现。 唯品会电商作为国内第四大电商平台,以做品牌为主,佣金相当与淘宝京东拼多多较高一些。但是限制也较多点。比如不允许投流推广,发现了轻则警告扣除部…

.Net9中通过HttpClient简单调用Ollama中的DeepSeek R1模型

本文主要使用.Net9中的HttpClient组件,调用本地部署的Ollama提供的API接口,获取对应的问答信息。1、🥇测试环境VS2022;.Net9控制台程序;HttpClient组件;本地部署的Ollama环境DeepSeek R1模型(deepseek-r1:1.5b)关于本地部署的Ollama环境,可参见文章【通过Ollama本地部…

变革管理的黄金法则:五大模型+工具,助你轻松应对项目管理挑战

变革模型与项目管理工具的结合运用可以形成一个系统化、高效化的变革管理体系。通过明确变革需求与目标、执行变革计划、评估与反馈以及持续优化改进等步骤,可以确保变革的顺利实施和成功落地。项目管理中的变革模型是指一系列指导和管理组织内部变革过程的框架和方法。这些模…