我试图理解为什么我有几个由 Chrome 开发工具报告的长帧。
火焰图中的第一行(调用堆栈的顶部)主要是Timer Fired
事件,由jQuery.Deferred()
s 执行一堆$(function(){ });
准备好的函数触发。
如果我深入研究 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 回调都是在一帧内执行的?