React调度的原理是什么

异步调度

问题:由于对于大型的 React 应用,会存在一次更新,递归遍历大量的虚拟 DOM ,造成占用 js 线程,使得浏览器没有时间去做一些动画效果,伴随项目越来越大,项目会越来越卡。

对比Vue:

Vue 有这 template 模版收集依赖的过程,轻松构建响应式,使得在一次更新中,Vue 能够迅速响应,找到需要更新的范围,然后以组件粒度更新组件,渲染视图。

React 中,一次更新 React 无法知道此次更新的波及范围,所以 React 选择从根节点开始 diff ,查找不同,更新这些不同。

解决:

把 React 的更新,交给浏览器自己控制,浏览器先执行绘制任务,空闲时间执行更新任务,解决了卡顿问题。即采用异步调度的方法。

时间分片

React让浏览器控制React更新:浏览器每执行一次事件循环都会:处理事件,执行 js,调用requestAnimation,布局 Layout,绘制 Paint,在一次执行后,浏览器进入空闲时,可以执行更新任务

谷歌浏览器提供的一个 API, 在浏览器有空余的时间,浏览器就会调用 requestIdleCallback 的回调。

requestIdleCallback(callback,{ timeout })

  • callback 回调。浏览器空余时间执行回调函数。

  • timeout 超时时间。如果浏览器长时间没有空闲,那么回调就不会执行,为了解决这个问题,可以通过 requestIdleCallback 的第二个参数指定一个超时时间。

React 为了防止 requestIdleCallback 中的任务由于浏览器没有空闲时间而卡死,所以设置了 5 个优先级。

  • Immediate -1 需要立刻执行。

  • UserBlocking 250ms 超时时间250ms,一般指的是用户交互。

  • Normal 5000ms 超时时间5s,不需要直观立即变化的任务,比如网络请求。

  • Low 10000ms 超时时间10s,肯定要执行的任务,但是可以放在最后处理。

  • Idle 一些没有必要的任务,可能不会执行。

模拟requestdleCallback

条件:

  • 可以主动让出主线程,让浏览器去渲染视图。

  • 一次事件循环只执行一次,因为执行一个以后,还会请求下一次的时间片。

宏任务:在下次事件循环中执行,不会阻塞浏览器更新。且浏览器一次只会执行一个宏任务。

1、采用setTimeout(fn, 0),间隔时间会变成 4 毫秒左右,不是优异选方案

2、采用MessageChannel 接口,允许开发者创建一个新的消息通道,并通过它的两个 MessagePort 属性发送数据。

React调度的原理是什么

在一次更新中,向浏览器请求执行更新任务,调用 requesetHostCallbcak,将更新任务 函数callback赋值给 scheduleHostCallback,port2 向 port1 发起 postMessage消息通知。

port1 会通过 onmessage,接受来自 port2 消息,执行更新任务 scheduleHostCallback,执行完后,清空任务。

异步调度原理

React 发生一次更新,会统一走 ensureRootIsScheduled(调度应用)

对于 正常更新 会走 performSyncWorkOnRoot 逻辑,最后会走 workLoopSync

React调度的原理是什么

对于 低优先级的异步更新 会走 performConcurrentWorkOnRoot 逻辑,最后会走 workLoopConcurrent

React调度的原理是什么

区别:异步模式会调用一个 shouldYield(),如果当前浏览器没有空余时间, shouldYield 会中止循环,直到浏览器有空闲时间后再继续遍历,从而达到终止渲染的目的。解决了一次性遍历大量的 fiber ,导致浏览器没有时间执行一些渲染任务,导致了页面卡顿。

1、scheduleCallback

更新任务、异步更新任务都是由调度器 scheduleCallback 统一调度的

正常更新任务:

scheduleCallback(Immediate,workLoopSync)

异步更新任务:

/* 计算超时等级,就是如上那五个等级 */var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);scheduleCallback(priorityLevel,workLoopConcurrent)

scheduleCallback() 函数执行过程

React调度的原理是什么

scheduleCallback 流程如下:

  • 创建一个新的任务 newTask。

  • 通过任务的开始时间( startTime ) 和 当前时间( currentTime ) 比较:当 startTime > currentTime, 说明未过期,存到 timerQueue,当 startTime <= currentTime,说明已过期, 存到 taskQueue。

  • 如果任务没有过期,用 requestHostTimeout 延时执行 handleTimeout

  • 如果任务过期,并且没有调度中的任务,那么调度 requestHostCallback

  • 本质上调度的是 flushWork

2、requestHostTimeout

通过 setTimeout 来进行延时指定时间的。

React调度的原理是什么

延时执行 handleTimeoutcancelHostTimeout 用于清除当前的延时器。

3、handleTimeout

延时时间后,handleTimeout 会把任务重新放在 requestHostCallback 调度。

React调度的原理是什么

通过 advanceTimers 将 timerQueue 中过期的任务转移到 taskQueue 中。然后调用 requestHostCallback 调度过期的任务。

4、advanceTimers

React调度的原理是什么

如果任务已经过期,那么将 timerQueue 中的过期任务,放入 taskQueue。

5、flushWork

requestHostCallback ,放入 MessageChannel 中的回调函数是flushWork。

React调度的原理是什么

flushWork 如果有延时任务执行的话,那么会先暂停延时任务,然后调用 workLoop ,去真正执行超时的更新任务。

6、workLoop

workLoop 是调度中的 workLoop

React 的更新任务最后都是放在 taskQueue 中

React调度的原理是什么

workLoop 会依次更新过期任务队列中的任务

调度流程图

React调度的原理是什么

到此,关于“React调度的原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

文章标题:React调度的原理是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/28156

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月21日 下午10:45
下一篇 2022年9月21日 下午10:47

相关推荐

  • Linux环境下怎么使用Docker搭建Jenkins容器

    需要提前准备的条件 Maven环境 Docker环境 JDK环境(Centos8 自带JDK环境去除,重装的JDK) Step1:安装Jenkins镜像 用docker查询jenkins镜像 docker search jenkins 我们选择下载第二个,jenkins/jenkins,下载命令 d…

    2022年9月20日
    75100
  • windows谷歌浏览器开发者模式如何打开

    谷歌浏览器开发者模式打开方法: 1、点击右上角的图标先。 2、随后选择更多工具中的“开发者工具”。 3、随后即可进入“开发者模式”。 4、点击上方的选项可以设置开发者工具的位置。 关于“windows谷歌浏览器开发者模式如何打开”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“windows…

    2022年9月8日
    3.4K00
  • 如何分析APP测试及流程

    目前工作中,测试App会涉及到一下几个方面:客户端、小程序、h6页面等,看似不同却又大相径庭。 点击添加图片描述(非常多60个字) 1、功能模块测试:功能模块测试其实最重要的是考察测试者的逻辑思维能力和对需求的理解能力以及一些页面交互性,输入输出的考虑等,所以以上三者是共通的,没有太大的区别。 2、…

    2022年9月2日
    56300
  • 子网掩码和ip地址的关系介绍

    子网掩码和ip地址的关系:1、子网掩码是用来判断两台计算机的ip地址是否属于同一子网络的根据,也即子网掩码和ip地址可以确定少数地址的关系;2、把子网掩码和ip地址进行二进制换算进行and算法,就是对外的少数地址;3、子网掩码可以用于区分网络地址和主机地址。 子网掩码和ip地址的关系是什么 IP地址…

    2022年9月13日
    1.7K00
  • 疫情期间,HR团队是如何实行远程办公的?

    2020年的春节是个不平常的春节,新型冠状病毒突如其来,为了控制病毒传播,国务院办公厅宣布延长2020年春节假期至2月2日,各地政府也相继出台了延期开工政策。 Worktile积极响应国家政策,保障每位员工的身体健康,决定全体员工先在家远程办公。为了战胜疫情,实现真正有效率有成果的远程办公,公司HR…

    2022年3月20日
    65300
  • SQL窗口函数怎么使用

    什么是窗口函数 SQL窗口函数为在线分析处理(OLAP)和商业智能(BI)提供了复杂分析和报表统计的功能,例如产品的累计销售额统计、分类排名、同比/环比分析等。这些功能通常很难通过聚合函数和分组操作来实现。 窗口函数(Window Function)可以像聚合函数一样对一组数据进行分析并返回结果,二…

    2022年9月21日
    63700
  • vlookup函数如何使用

    vlookup函数使用方法 vlookup 的作用: vlookup 用于查找指定值所对应的另一个值。例如:查找某件产品的价格,某个同学的某科成绩等。 vlookup 函数表示: =vlookup(要查找的值,查找区域,返回值所在列号,精确匹配或近似匹配) 参数说明: 1、要查找的值:可以引用单元格…

    2022年9月21日
    73300
  • windows ventoy进不了引导如何解决

    ventoy进不了引导解决方法: 方法一: 1、首先,确保你在bios设置里将U盘设置为启动项了。 2、如果没有设置,那么重启电脑,进入bios的“boot”选项下进行设置。 方法二: 1、如果设置后还不行,那么可能是u盘问题。 2、可以尝试回到系统,右键u盘选择“格式化” 3、然后选择“NTFS格…

    2022年8月27日
    4.5K00
  • easyrecovery如何恢复回收站数据

    easyrecovery恢复回收站数据的方法 1、进入软件之后,选择你要恢复的数据类型,点击下一步。 2、进入从恢复的界面后,点击“选择位置”,在弹出的文件夹空白处点击鼠标右键, 选择其中的“显示隐藏文件” 3、选择弹出的“Recycle”文件夹,点击扫描。 4、数据扫描完成后,可以点击左侧的“文件…

    2022年9月26日
    55000
  • mysql的配置文件是哪个

    Windows操作系统中的MySQL配置文件是“my.ini”,位置一般在MySql安装的根目录下,也有可能在隐藏文件夹“ProgramData”下面;而Linux操作系统中的MySQL配置文件是“my.cnf”,位置一般在“/etc/my.cnf”或“/etc/mysql/my.cnf”目录下。 …

    2022年9月20日
    3.4K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部