广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >深入理解React调度(Scheduler)原理
  • 705
分享到

深入理解React调度(Scheduler)原理

2024-04-02 19:04:59 705人浏览 安东尼
摘要

目录异步调度时间分片异步调度原理总结异步调度 问题:由于对于大型的 React 应用,会存在一次更新,递归遍历大量的虚拟 DOM ,造成占用 js 线程,使得浏览器没有时间去做一些动

异步调度

问题:由于对于大型的 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 属性发送数据。

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

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

异步调度原理

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

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

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

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

1、scheduleCallback

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

正常更新任务:

scheduleCallback(Immediate,workLoopSync)

异步更新任务:


var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);
scheduleCallback(priorityLevel,workLoopConcurrent)

scheduleCallback() 函数执行过程

scheduleCallback 流程如下:

  • 创建一个新的任务 newTask。
  • 通过任务的开始时间( startTime ) 和 当前时间( currentTime ) 比较:当 startTime > currentTime, 说明未过期,存到 timerQueue,当 startTime <= currentTime,说明已过期, 存到 taskQueue。
  • 如果任务没有过期,用 requestHostTimeout 延时执行 handleTimeout
  • 如果任务过期,并且没有调度中的任务,那么调度 requestHostCallback
  • 本质上调度的是 flushWork

2、requestHostTimeout

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

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

3、handleTimeout

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

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

4、advanceTimers

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

5、flushWork

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

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

6、workLoop

workLoop 是调度中的 workLoop

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

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

调度流程图

总结

1、异步调度原因

2、时间分片和 requestIdleCallback

3、异步调度原理

4、调度流程

到此这篇关于深入理解React 调度(Scheduler)原理的文章就介绍到这了,更多相关React 调度内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入理解React调度(Scheduler)原理

本文链接: https://www.lsjlt.com/news/153341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入理解React调度(Scheduler)原理
    目录异步调度时间分片异步调度原理总结异步调度 问题:由于对于大型的 React 应用,会存在一次更新,递归遍历大量的虚拟 DOM ,造成占用 js 线程,使得浏览器没有时间去做一些动...
    99+
    2022-11-13
  • React调度系统Scheduler工作原理详解
    目录简介什么是Scheduler?Scheduler的工作原理使用Scheduler的场景代码示例1. 延迟执行任务2. 调整任务的优先级3. 批量更新状态总结简介 React是目...
    99+
    2023-03-13
    React Scheduler调度系统 React Scheduler
  • React为什么需要Scheduler调度器原理详解
    目录正文我们为什么需要Scheduler(调度器)Scheduler如何进行工作总结正文 最近在重学React,由于近两年没使用React突然重学发现一些很有意思的概念,首先便是Re...
    99+
    2022-11-13
    React Scheduler调度器 React Scheduler
  • React调度系统Scheduler工作原理是什么
    这篇文章主要介绍“React调度系统Scheduler工作原理是什么”,在日常操作中,相信很多人在React调度系统Scheduler工作原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React调度...
    99+
    2023-07-05
  • 深入理解React State 原理
    目录问题:setState 到底是同步还是异步的?类组件statesetState原理揭秘函数组件state问题:setState 到底是同步还是异步的? 如果对 React 底层有...
    99+
    2022-11-12
  • React深入了解原理
    目录VDOM(虚拟dom)Fiber架构初始化渲染更新时render阶段commit阶段VDOM(虚拟dom) react和vue都是基于vdom的前端框架。 web界面由DOM树来...
    99+
    2022-11-13
  • 从原生JavaScript到React深入理解
    目录从头开始理解 React原生 JavaScript 和 DOMReact 的基础咱老百姓也能学会的 JSX从头开始理解 React 作者:Stéphane B&ea...
    99+
    2022-11-13
  • React Diff原理深入分析
    目录Diffing 算法逐层比较对比同类型的组件元素对比同一类型的元素对子节点进行递归Keys在了解Diff前,先看下React的虚拟DOM的结构 这是html结构 <di...
    99+
    2022-11-12
  • 深入理解React Native核心原理(React Native的桥接(Bridge)
    在这篇文章之前我们假设你已经了解了React Native的基础知识,我们会重点关注当native和JavaScript进行信息交流时的内部运行原理。 主线程 在开始之前,我们需要知...
    99+
    2022-11-12
  • React Streaming SSR原理示例深入解析
    目录功能简介基本原理使用示例Streaming HTMLSelective Hydration降级逻辑JS 和 CSS 设置源码解析数据结构Segment Bou...
    99+
    2022-12-20
    React Streaming SSR React Streaming
  • 怎样深入理解react
    这篇文章给大家介绍怎样深入理解react,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。理解ReactElement和ReactClass的概念首先让我们理解两个概念:ReactElem...
    99+
    2022-10-19
  • React调度的原理是什么
    这篇文章主要介绍“React调度的原理是什么”,在日常操作中,相信很多人在React调度的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React调度的原理是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-02
  • 深入理解SpringMVC中央调度器DispatcherServlet
    目录SpringMVC请求处理过程:SrpingMVC容器和spring IOC容器关系基于maven创建的一个springmvc工程。1.创建maven项目中使用到了自动创建骨架2...
    99+
    2022-11-13
  • HDFS原理深入理解
    1.HDFS概述   1)数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就       是分布式文件管理系统。 2)是一种允许...
    99+
    2017-01-26
    HDFS原理深入理解
  • React框架核心原理全面深入解析
    目录前言第一章 基本概念第二章 createElement 函数第三章 render函数第四章 Concurrent Mode第五章 Fibers第六章 Render and Com...
    99+
    2022-11-16
    React框架的原理 React框架核心
  • Vue3生命周期Hooks原理与调度器Scheduler关系
    目录写在最前:本文章的目标Vue3生命周期的实现原理生命周期类型各个生命周期Hooks函数的创建创建生命周期函数createHookinjectHook函数生命周期Hooks的调用V...
    99+
    2022-11-13
  • MapReduce原理深入理解(一)
    1.MapReduce概念 1)MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. 2)MapReduce是分布式运行的,由两个阶段组成:Map和Reduce,Map阶段是一个独立的程...
    99+
    2019-09-24
    MapReduce原理深入理解(一)
  • React更新渲染原理深入分析
    目录ScheduleLegacy modeConcurrent mode时间切片任务的优先级获取最先处理的taskReconcile前置知识从jsx到dom双缓存fiber tree...
    99+
    2022-12-23
    React更新渲染 React更新 React渲染
  • React中Redux核心原理深入分析
    目录一、Redux是什么二、Redux的核心思想三、Redux中间件原理四、手写一个Redux总结一、Redux是什么 众所周知,Redux最早运用于React框架中,是一个全局状态...
    99+
    2022-11-16
    React使用Redux React Redux用法
  • 一文理解Goland协程调度器scheduler的实现
    目录1. 调度器scheduler的作用2. GMP模型3. 调度机制1. 调度器scheduler的作用 我们都知道,在Go语言中,程序运行的最小单元是gorouines。 然而程...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作