react 16 以后 引入了Fiber,对核心算法进行重构,花一些时间来学习研究下,还是蛮有收获的。
大家都知道requestAnimationFrame,在canvas绘制动画方面使用较多,前面应该也对比过
requestAnimationFrame 和 setTimeout (setInterval) ,requestAnimationFrame一些性能优化点,比如说 窗口失去焦点后的区别;

requestIdleCallback 这个方法应该比较陌生了,
https://www.w3.org/TR/requestidlecallback/

requestIdleCallback 也是 react Fiber 实现的基础 api 。我们希望能够快速响应用户,让用户觉得够快,不能阻塞用户的交互,requestIdleCallback能使开发者在主事件循环上执行后台和低优先级的工作,而不影响延迟关键事件,如动画和输入响应。正常帧任务完成后没超过16ms,说明有多余的空闲时间,此时就会执行requestIdleCallback里注册的任务。

具体的执行流程如下,开发者采用requestIdleCallback方法注册对应的任务,告诉浏览器我的这个任务优先级不高,如果每一帧内存在空闲时间,就可以执行注册的这个任务。另外,开发者是可以传入timeout参数去定义超时时间的,如果到了超时时间了,浏览器必须立即执行,使用方法如下:window.requestIdleCallback(callback, { timeout: 1000 })。浏览器执行完这个方法后,如果没有剩余时间了,或者已经没有下一个可执行的任务了,React应该归还控制权,并同样使用requestIdleCallback去申请下一个时间片

requestIdleCallback(callback) callback收到默认参数 deadline 包含两个参数

  • didTimeout 是否超时
  • timeRemaining() 当前帧还剩多少毫秒

一帧执行多任务举例

let taskQueue = [() => {console.log('task1 start')console.log('task1 end')},() => {console.log('task2 start')// sleep(950)console.log('task2 end')},() => {console.log('task3 start')console.log('task3 end')}]const performUnitWork = (deadline) => {// 取出第一个队列中的第一个任务并执行console.log(`此帧的剩余时间为: ${deadline.timeRemaining()}`)taskQueue.shift()()
}const workloop = (deadline) => {// 如果此帧剩余时间大于0或者已经到了定义的超时时间(上文定义了timeout时间为1000,到达时间时必须强制执行),且当时存在任务,则直接执行这个任务// 如果没有剩余时间,则应该放弃执行任务控制权,把执行权交还给浏览器while ((deadline.timeRemaining() > 0 || deadline.didTimeout) && taskQueue.length > 0) {performUnitWork(deadline)}// 如果还有未完成的任务,继续调用requestIdleCallback申请下一个时间片if (taskQueue.length > 0) {window.requestIdleCallback(workloop, { timeout: 1000 })}
}
requestIdleCallback(workloop, { timeout: 1000 })

如果在每个任务sleep 大于16毫秒,就会多帧执行任务;

【reactjs】requestIdleCallback 和 requestAnimationFrame对比相关推荐

  1. Reactjs 踏坑指南1: 一些概念

    Reactjs 踏坑指南1: 知识点 什么是React 虚拟DOM JSX 组件 生命周期和状态 事件 单项数据流 Reactjs和Angularjs的对比 React简介 React是一个Faceb ...

  2. requestIdleCallback函数

    我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步.可中断,其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两 ...

  3. 你应该知道的requestIdleCallback

    作者:Randal 链接:https://juejin.im/post/6844903592831238157 来源:掘金 image 我们都知道React 16实现了新的调度策略(Fiber), 新 ...

  4. (中篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂

    感恩!~~没想到上篇文章能这么受大家的喜欢,激动不已.?.但是却也是诚惶诚恐,这也意味着责任.下篇许多知识点都需要比较深入的研究和理解,博主也是水平有限,担心自己无法承担大家的期待.不过终究还是需要摆 ...

  5. 震惊,使用imba.io框架,得到比 vue 快50倍的性能基准

    上图表示了vue, react 以及 imba 在 todo 这个项目中拥有60个 todoItem 不同进行 crud 操作的表现.可以看到 imba 达到了每秒操作5w次以上.如果你也想试一试该测 ...

  6. 你需要知道的网页渲染性能优化方法(上)

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 作者:晨风明悟 链接:https://zhuanlan.zhihu.com/p/39878259 性能优化 上文 ...

  7. _improve-1

    类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中,前 7 种类型为基础类型,最后 1 种(Object)为引用类型,也是你需要重点关注的,因为它在日常工作中是使用得 ...

  8. js初化加载页面时ajax会调用两次的原因_在前端开发中,有哪些因素会导致页面卡顿

    前端开发不像后端那样,很少出现有大量算法的场景,但是前端性能也是需要优化的.好的代码是保证网页平稳高性能运行的基础,结合以往开发中遇到的场景,本文对前端网页卡顿的原因进行了梳理和分析,并给出了对应的解 ...

  9. js获取今天剩余时间_js动画,setTimeout/setInterval的不准确

    先mark,后期在丰富... 1.前言 css能满足绝大多数的动画,但是还是有一小部分需要用到js.例如scroll setTimeout/setInterval的不准确 大家都知道.下面重点说说 r ...

最新文章

  1. 利用PyMySQL模块操作数据库
  2. 《大规模分布式系统架构与设计实战》
  3. 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例
  4. python数据标准类型_Python的标准数据类型(下)
  5. windows 根据端口杀死进程
  6. Android学习笔记---13_文件的操作模式.各个应用之间的文件权限
  7. vc无法连接的原因分析
  8. 如何在SQL Server中使用数据质量服务清除主数据服务数据
  9. java 子类调用父类内部类_java 如何在子类方法中实例化父类的内部类?
  10. ERPSYSTEM开发教程01 框架介绍
  11. 打破校史,发学校首篇Science的博士小姐姐,近日再发Nature!破解百年谜题
  12. ORACLE功能GREATEST功能说明具体实例
  13. 校园卡管理系统实验报告c语言,校园卡管理系统-C语言.doc
  14. C语言学生信息管理系统详细设计
  15. android手机分辨率整理
  16. goto解密PHP源码解密程序源码下载
  17. 尝试Ajax数据爬取微博
  18. 利用BSCScan获取账户交易记录
  19. 水货三星Android手机验机方法
  20. go系列-笔记(第五天)

热门文章

  1. 中职学校计算机专业宣传口号,中职学校宣传标语
  2. Tomcat startup.bat 打开闪退,添加pause后不报错但无法响应,以及 -Djava.endorsed.dirs=Tomcat\endorsed is not supported问题
  3. 来看看我给女朋友做的“小傻瓜”导航站点
  4. string.intern()方法理解
  5. deepin intellij安装console字体
  6. Java面试之RESTful风格接口
  7. [Android 12 CameraITS环境搭建]
  8. discuz!论坛修复站帮网vip插件bug:VIP会员到期后,重新开通永久会员时,所属的用户组没有切换到永久会员分组
  9. java launcher在哪_HomeLauncher启动
  10. 芜湖方特系统设计书php,芜湖方特东方神画之旅