harttle/harttle.github.io

2019/01/16/how-eventloop-affects-rendering

Opened this issue · 10 comments

事件循环是如何影响页面渲染的? | Harttle Land

JavaScript 是单线程的,但提供了很多异步调用方式比如setTimeout,setInterval,setImmediate,Promise.prototype.then,postMessage,requestAnimationFrame,I...

https://harttle.land/2019/01/16/how-eventloop-affects-rendering.html

博主文章通俗易懂,理解深入,学习了。搜索GitHub徽章找进来的。
我的博客正在写Django搭建博客的教程,可否互加一个友链?
参观地址:www.dusaiphoto.com

你的照片都很棒!已添加链接,当前版本在: https://harttle.land/about.html

谢谢!
已添加友链博主写的很棒,会常来这里学习做客

目前来看最快的是 queueMicroTask

“setImmediate 意在让脚本有机会在 UA 事件和渲染发生后立即得到调用,从渲染的角度上类似于渲染之后调用的 requestAnimationFrame。”
这句话是不是写错了?
“从渲染的角度上类似于渲染之后调用的 requestAnimationFrame。”
应该是:
从渲染的角度上类似于渲染之前调用的 requestAnimationFrame。“”

感谢提出,这句话确实不明所以。干掉了。

document.body.style.background = 'red';
setTimeout(function () {
document.body.style.background = 'white';
})

这个代码在不同浏览器上表现不一致。在最新版的chrom( 版本:81.0.4044.138)浏览器中一直会闪烁,在火狐(版本:76.0.1)中会几率性出现闪烁。

vnues commented

你好,我想请教下:

  • 浏览器页面没有任何变化也会以每隔16ms左右进行 UI render吗
  • 执行一个宏任务就会触发一次UI render吗 (UI render里面不是也会产生很多宏任务 嗯嗯...这样一想不是一个死循环吗)
  • 16ms的相对时间怎么计算的,我怎么知道我这个交互触发是更好在一个16ms周期进行时,还是结束时
function mainTask() {

    requestAnimationFrame(function(e) {
        console.log('requestAnimationFrame',e)
        const bodyOffsetHeight = document.body.offsetHeight
        
    })
    console.log('mainTask')
    const bodyOffsetHeight = document.body.offsetHeight
    console.log('bodyOffsetHeight:' + bodyOffsetHeight)
    requestAnimationFrame(function(e) {
        console.log('requestAnimationFrame2',e)
    })
}
mainTask()
/*
输出结果:
mainTask
bodyOffsetHeight:8888

requestAnimationFrame 8232132.624
requestAnimationFrame2 8232132.624
*/

请教大佬。执行上面的代码,为什么两次requestAnimationFrame的回调在同一帧执行。
访问offsetHeight是否会引起重排(reflow),进而进入requestAnimationFrame回调执行阶段。

requestAnimationFrame 回调会在微任务结束之后调度,读 offsetHeight 是在当前任务中强制重新 layout(包括应用 CSS 来计算所有元素的位置大小),不会(也没办法)执行后面的微任务或 requestAnimation 回调。

可以看下这个

https://stackoverflow.com/questions/43050448/when-will-requestanimationframe-be-executed