浏览器事件循环-微任务和宏任务,调用栈,渲染队列:布局,绘制与合成

翻译计划: 2024.1 此文翻译自: https://blog.xnim.me/event-loop-and-render-queue#heading-task-queue 已经获取作者授权 此文主旨在于关注事件队列, 执行顺序 以及开发者如何优化代码。 完整思路如下: 事件队列 古老的操作系统不支持多线程, 那时候的事件循环就类似这样一个简单的循环: while (true) { if (execQueue.isNotEmpty()) { execQueue.pop().exec(); } } 在老的操作系统上, 这段代码会疯狂跑满全部cpu。 (真的吗? – 年轻的译者注) 现代操作系统调度器非常复杂, 包括优先级,执行队列, 和其他的技术。 我们可以把事件循环理解为一个圆圈,系统就一圈一圈地检查, 有没有待执行的任务 (pending task)。 下面这些行为, 都会在事件循环里生成任务: script 标签 延迟任务: setTimeout, setInterval, requestIdleCallback 浏览器的事件处理API: click, mousedown, input, blur 等等。 有一些事件是用户初始化的,比如点击事件, tab切换这种 有的事件是来自于代码, 比如 ajax 的响应啥的 promise 状态变化; (关于promise, 可以看这个文章, emmm这篇文章是我准备留给2月份翻译的) DOMMutationObserver, IntersectionObserver 这种 Observer 家族的 RequestAnimationFrame Almost everything we described above is planned through WebAPI (or browserAPI)....

January 12, 2024 · 3 min · 580 words · Jacob