我正在尝试理解为什么Chrome开发者工具报告了多个“长帧”。
火焰图中的第一行(调用栈顶部)主要是由计时器触发
事件组成,这些事件是由执行一堆$(function(){ });
准备函数的jQuery.Deferred()
引起的。
如果我深入研究jQuery源代码,并将它们对setTimeout
的使用替换为requestAnimationFrame
,那么火焰图并没有太大变化,我仍然会得到许多rAF在单个帧内触发(如开发工具所报告),导致长时间的帧。我本来期望做以下伪代码:
window.requestAnimationFrame(function() {
// do stuff
});
window.requestAnimationFrame(function() {
// do more stuff
});
是否在两个不同的动画帧上执行?这不是这样吗?
正在执行的所有JS都是必要的,但我该如何将其作为“微任务”执行(如此处所示提示但未加说明https://developers.google.com/web/fundamentals/performance/rendering/optimize-javascript-execution),当setTimeout
和rAF
似乎无法实现时应该怎么办。
更新
这是一个放大的截图,显示了一个没有任何重排(强制或其他)的长帧。为什么所有rAF回调都在一个帧中执行?