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命令备份文件夹

    linux命令能备份文件夹。有两种命令用于备份文件夹:1、cp命令,该命令用于复制文件或文件夹,语法为“cp [options] source dest”;2、dump命令,该命令用于备份文件系统,语法为“dump [-cnu][-0123456789]…”。 linux命令备份文件夹 …

    2022年6月29日
    2.2K00
  • ​CSS如何写出三角形

    CSS 写出三角形 /* create an arrow that points up */div.arrow-up { width:0px; height:0px; border-left:5px solid transparent; /* left arrow slant */ border-r…

    2022年9月1日
    14900
  • MySQL在grant时报错ERROR 1064 (42000)如何解决

    网上查到的grant方式大多会报错,主要原因是MySQL版本8.0后不能再使用原来的方式 查询MySQL版本 SELECT version(); 在8.0版本下 grant all privileges on test.* to test@’%’ identified by ‘123456’; 报错…

    2022年8月27日
    98000
  • word文档怎么转换成pdf格式

    word文档转换成pdf格式方法: 1、打开word,打开需要转换的文档。 2、点击左上角的文件选项,如图。 3、选择导出功能。 4、选择创建PDF/XPS文档,点击创建 5、选择合适的位置,自定义文件的名称即可。 6、此时打开文件的格式就已经被转换为PDF文件。 到此,相信大家对“word文档怎么…

    2022年9月19日
    20000
  • vue项目打包后怎么部署到服务器

    一 ,打包项目 1 , vscode打开你的vue项目 — > 点终端- > 新终端- >输入npm run build 按回车 , 显示正在打包..稍等一会 2 , 打包成功 , 生成了dist文件夹, 打包好的文件存放在里面 二 , 用一个工具, 把打包好的文件上传…

    2022年9月20日
    1.3K00
  • 电脑中的五角星怎么打出

    电脑中的五角星打出方法: 1、由于键盘上没有五角星,所以我们需要借助输入法。 2、不同输入法界面略有不同,下面以搜狗输入法为例。 3、首先打开语言栏,点击最右边的图标,打开“智能输入助手” 4、打开后,找到并点开“符号大全” 5、然后进入左上角的“特殊符号” 6、最后在其中点击“五角星”符号就可以打…

    2022年8月31日
    30900
  • 怎样进行Apache Solr最新RCE漏洞分析

    引言 Apache Solr爆出RCE 0day漏洞(漏洞编号未给出),这里简单的复现了对象,对整个RCE的流程做了一下分析,供各位看官参考。 漏洞复现 复现版本:8.1.1 实现RCE,需要分两步,首先确认,应用开启了某个core(可以在Core Admin中查看),实例中应用开启了mycore,…

    2022年9月15日
    34600
  • 电脑黑白打印机打印图片底色黑如何解决

    解决方法 方法一: 1、首先在“Photoshop”中打开想要打印的图片。 2、打开后,点击左上角“图像”,选择“自动色调” 3、软件会自动为你调整背景色,如果还是觉得黑,可以继续调节。 4、继续点击“图像”,打开“调整”下的“色阶”选项。 5、打开后,按住图示位置的滑块,向左滑动。(根据预览情况自…

    2022年9月24日
    59400
  • vlookup函数条件怎么填写

    vlookup函数条件填写方法 1、名列前茅个条件,选择需要查找的单元格,这里为“张三” 2、第二个条件,选中需要查找内容的列。 3、第三个条件,查看所需查找内容在第几列,这里工资在第三列,所以填“3” 4、第四个条件,如果要查找精确数据,就选择“0”,要模糊查找就用“1” 5、最后按下回车,就可以…

    2022年9月22日
    1.8K00
  • windows pcstory常见问题怎么解决

    pcstory是什么 答:pcstory是一款游戏下载软件。 1、其中有着大量的优异正版单机游戏可以下载,各种游戏应有尽有。 2、而且软件有着优异的下载通道,即使上百GB的游戏也能很快下载。 3、软件还自带了游戏管理服务,可以移动、卸载在这里下载到的游戏。 4、此外,pcstory还拥有免费更新功能…

    2022年9月20日
    1.4K00
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部