React18源码: React中的LanePriority和SchedulerPriority

工控上位机开发学习路线与核心技术解析 工控上位机开发是工业自动化领域的关键技术,通过计算机软件实现对工业设备的监控与控制。其核心在于掌握工业通信协议(如Modbus、OPC UA)、数据处理算法和可视化开发三大能力。上位机系统需要高效解析设备通信协议,处理实时数据,并提供直观的人机交互界面。在智能制造浪潮下,掌握C#语言和工业协议开发能力成为工程师的核心竞争力。典型应用场景包括生产线监控、设备远程运维等。本文基于工业现场实践经验,详解从协议解析到界面优化的全链路开发要点,特别针对Modbus协议调优、WPF性能优化等高频问题提供解决方案。 阅读详情

优先级区别和联系

  • 在源码中,3种优先级位于不同的js文件,是相互独立的
  • 注意:
    • LanePriority 和 SchedulerPriority 从命名上看,它们代表的是优先级
    • ReactPriorityLevel 从命名上看,它代表的是等级而不是优先级
      • 它用于衡量 LanePriority 和 Schedulerpriority

LanePriority

  • LanePriority: 属 react-reconciler 包,定义于 ReactFiberLane.js

    export const SyncLanePriority: LanePriority = 15;
    export const SyncBatchedLanePriority: LanePriority = 14;
    
    const InputDiscreteHydrationLanePriority: LanePriority = 13;
    export const InputDiscreteLanePriority: LanePriority = 12;
    
    // ...
    
    const OffscreenLanePriority: LanePriority = 1;
    export const NoLanePriority: LanePriority = 0;
    
  • 与fiber构造过程相关的优先级(如fiber.updateQueue,fiber.lanes)都使用LanePriority.

  • 由于本节重点介绍优先级体系以及它们的转换关系,关于Lane(车道模型)在fiber树构造时使用

SchedulerPriority

  • SchedulerPriority,属于scheduler包,定义于 SchedulerPriorities.js 中

    export const NoPriority = 0;
    export const ImmediatePriority = 1;
    export const UserBlockingPriority = 2;
    export const NormalPriority = 3;
    export const LowPriority = 4;
    export const IdlePriority = 5;
    
  • 与scheduler调度中心相关的优先级使用 SchedulerPriority

ReactPriorityLevel

  • reactPriorityLevel, 属于react-reconciler包,定义于 SchedulerWithReactIntegration.js中

    export const ImmediatePriority: ReactPrioritylevel = 99;
    export const UserBlockingPriority: ReactPriorityLevel = 98;
    export const NormalPriority: ReactPriorityLevel = 97;
    export const LowPriority: ReactPriorityLevel = 96;
    export const IdlePriority: ReactPriorityLevel = 95;
    // NoPriority is the absence of priority. Also React-only.
    export const NoPriority: ReactPriorityLevel = 90;
    
  • LanePriority 与 SchedulerPriority 通过 ReactPriorityLevel 进换

转换关系

  • 为了能协同调度中心(scheduler 包) 和 fiber树构造(react-reconciler包)中对优先级的使用

  • 则需要转换 SchedulerPriority 和 LanePriority, 转换的桥梁正是 ReactPriorityLevel

  • 在 SchedulerWithReactIntegration.js 中,可以互转 SchedulerPriority 和 ReactPriorityLevel

    // SchedulerPriority 转换成 ReactPrioritylevel
    export function getCurrentPriorityLevel(): ReactPriorityLevel {
      switch(Scheduler_getCurrentPriorityLevel()) {
        case Scheduler_ImmediatePriority:
          return ImmediatePriority;
        case Scheduler_UserBlockingPriority:
          return UserBlockingPriority;
        case Scheduler_NormalPriority:
          return NormalPriority;
        case Scheduler_LowPriority:
          return LowPriority;
        case Scheduler_IdlePriority:
          return IdlePriority;
        default:
          invariant(false, 'Unknown priority level.');
      }
    }
    
    // ReactPriorityLevel 转换成 SchedulerPriority
    function reactPriorityToSchedulerPriority(reactPrioritylevel) {
      switch(reactPriorityLevel) {
        case ImmediatePriority:
          return Scheduler_ImmediatePriority;
        case UserBlockingPriority:
          return Scheduler_UserBlockingPriority;
        case NormalPriority:
          return Scheduler_NormalPriority;
        case LowPriority:
          return Scheduler_LowPriority;
        case IdlePriority:
          return Scheduler_IdlePriority;
        default:
          invariant(false, 'Unknown priority level.');
      }
    }
    
  • ReactFiberLane.js中,可以互转 LanePriority 和 ReactPriorityLevel

    export function schedulerPriorityToLanePriority(
      schedulerPriorityLevel: ReactPriorityLevel,
    ): LanePriority {
      switch(schedulerPriorityLevel) {
        case ImmediateSchedulerPriority:
          return SyncLanePriority;
        // ...省略部分代码
        default:
          return NoLanePriority;
      }
    }
    
    export function lanePriorityToSchedulerPriority(
      lanePriority: LanePriority,
    ): ReactPriorityLevel {
      switch (lanePriority) {
        case SyncLanePriority:
        case SyncBatchedLanePriority:
          return ImmediateSchedulerPriority;
          //...省略部分代码
        default:
          invariant(
            false,
            'Invalid update priority: %s. This is a bug in React.',
            lanePriority,
          );
      }
    }
    

优先级使用

  • 通过 reconciler 运作流程中的归纳,reconciler 从输入到输出一共经历了4个阶段
  • 在每个阶段中都会涉及到与优先级相关的处理,正是通过优先级的灵活运用
  • React实现了可中断渲染,时间切片(timeslicing),异步渲染(suspense)等特性
【QT+VS】如何在现有VS项目中添加Qt界面?【全网最详细】 VS项目有了,就缺个QT界面,怎么办呢?这篇文章帮你一键搞定! 阅读详情

相关推荐

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 388

一文搞懂React18原理

可能一直在写代码的路上,大多数时候就是个工具人。今天一起看看react18的实现原理,持续学习中。

相信自己,没有攀不过去的高山! 1801

从仿真到实战:PMOS缓启动与栅极泄放电路的优化设计

本文深入探讨了PMOS缓启动与栅极泄放电路的优化设计,通过立创EDA仿真和实物调试,解决了关断速度慢和耐压问题。文章详细介绍了电路改进方案和低功耗优化技巧,为工程师提供了实用的工程实践建议,帮助提升电源开关电路的性能和可靠性。

weixin_28721917的博客 261

React18源码: Fiber树中的优先级与帧栈模型

针对fiber对象或update对象,只要它们的优先级(如:fiber.lanes和update.lane)比渲染优先级低,都将会被忽略。在前文 double buffering 中分析过,HostRootFiber.alternate 是正在构造的fiber树的根节点。可以看到,无论是应用初始化或者发起组件更新,创建update.lane的逻辑都是一样的。此处返回的lanes会作为全局渲染的优先级,用于fiber树构造过程中。所以每次fiber树构造是一个独立的过程,需要独立的一组全局变量。

Wang的专栏 1324

C#上位机实战:借助NetToPLCSim与西门子S7-1200仿真通信全攻略

本文详细介绍了如何使用C#开发上位机程序,通过NetToPLCSim与西门子S7-1200进行仿真通信的全过程。从环境准备、PLC仿真环境搭建、网络配置到C#代码实现,提供了完整的实战指南和常见问题解决方案,帮助开发者快速掌握工业自动化通信技术。

weixin_30596343的博客 441

保姆级教程:在华为云Ubuntu服务器上快速搭建RAGflow开发环境(避坑指南)

本文提供了一份在华为云Ubuntu服务器上快速搭建RAGflow开发环境的保姆级教程。针对网络拉取镜像等常见问题,详细介绍了从服务器选型、系统优化、Docker配置到RAGflow部署与验证的全流程,并给出生产环境调优建议,帮助开发者高效避坑,快速构建企业级应用环境。

weixin_29250403的博客 87

react div 事件优先级_React原理解析fiber、diff

资源1. React中文网:https://react.docschina.org2. React源码:https://github.com/facebook/react学习目标1. 掌握虚拟dom、diff策略2. 掌握fiber原理及实现reconciliation协调地址:https://zh-hans.reactjs.org/docs/reconciliation.html设计动...

weixin_39933895的博客 241

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2886

React中的4种优先级

来源 |http://www.fly63.com/article/detial/10072UI产生交互的根本原因是各种事件,这也就意味着事件与更新有着直接关系。不同事件产生的更新,它们...

web前端开发 2542

On the convergence of FedAvg on non-iid data

On the convergence of FedAvg on non-iid data

Lyn_S的博客 7082

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。

码农17年的博客 1078

剖析React内部运行机制-「译」React Fiber 架构

原文: React Fiber Architecture 介绍 React Fiber是React核心算法的持续再实现,这是React团队两年多研究的成果。 React Fiber的目标是增强其在动画、布局和手势等领域的适用性。它的主要特性是增量渲染:能够将渲染工作分割成块,并将其分散到多个帧中。 其他关键功能包括暂停、中止或重启更新工作的能力;为不同类型的更新分配优先级的能力;以及新的并发单元...

weixin_45189747的博客 580

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

React源码剖析

React源码剖析宏观包宏观上来看,React一共有35个包(v18.0.2),其中与Web开发相关的核心包一共有四个reactreact 基础包, 只提供定义 react 组件()的必要函数, 一般来说需要和渲染器(react-dom)一同使用. 在编写react应用的代码时, 大部分都是调用此包的 api.react-domreact 渲染器之一, 是 react 与 web 平台连接的桥梁(可以在浏览器和 nodejs 环境中使用), 将中的运行结果输出到 web 界面上. 在编写。

nuotianQAQ的博客 874

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

react 优先级策略

React内部对于优先级的管理, 根据功能的不同分 LanePriority SchedulerPriority ReactPriorityLevel LanePriority fiber优先级(LanePriority): 位于react-reconciler包, 也就是基于Lane(车道模型). export const SyncLanePriority: LanePriority = 15; export const SyncBatchedLanePriority: LanePriority =

weixin_43294560的博客 1096

Fix signatures do not match the previously installed version

报错信息FAILURE: Build failed with an exception.* What went wrong: Execution failed for task ':app:installDebug'. > com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Fai

Wang的专栏 2万+

在react中 实现 base64的图片转换成formdata格式并实现上传功能

如果不想要服务端实现处理base64格式的图片的转换,那么在浏览器端来实现,部分属于伪代码,仅作为开发参考,请勿直接拷贝使用

Wang的专栏 8836

快速解决gradle下载慢的问题的小技巧

在ionic run 或build 或clean命令的时候,如果没有下载过gradle, 需要重新下载一次,而通过CLI的方式下载很慢,即使科学上网后,下载还是存在一些问题。这里总结一下,快速的下载安装方式。 步骤 本地安装 http-server 包, 通过 $ npm i -g http-server 的方式安装到全局 在官网上下载自己的版本,目前自带的版本是 2.14.1,其他版本可能在执行过

Wang的专栏 6714

React 实现 2D 画板功能

在移动端或者PC端我们来模拟画板的实现, 支持清除和导出功能,此处简单实现,仅作开发参考。 效果演示 主要代码演示 /* 此模块用于实现签名绘图功能 */ // 需要用到的变量定义 let clickX = new Array(); let clickY = new Array(); let clickDrag = new Array(); let paint; let point...

Wang的专栏 4325

React16源码: React中LegacyContext的源码实现

对于在 beginWork 中的 context 操作,可以看上述判断成立的条件下的代码,即便有符合跳过更新的操作,依然 需要 push 和 pop 操作。如果我们可以跳出组件的更新,也就是代表着当前这个 classComponent,它的state它的props都应该是没有任何变化的。对于子组件来说,它的所有子树所获取到的context肯定是经过子组件,和上层的父组件合并的 context 了, 也就是。所以,先 push 一个老的值进去再说, 然后到后面,如果发现这个组件它是要更新的,就调用这个。

Wang的专栏 2803

Fix babel-preset-react-native TransformError

错误环境新版本存在不兼容,在运行 react-native run-android 的时候,发生的错误分析: babel-preset-react-native version : @3.0.0 $ react-native -v :react-native-cli: 2.0.1 react-native: 0.47.1$node -v : v7.8.0 $ npm -v :4.4.4 解决方案

Wang的专栏 2800

React18原理: 再聊Fiber架构下的时间分片

react的任务可以被打断,其实就是基于时间分片的,人眼最高能识别的帧数不超过30帧,电影的帧数差不多是在24,浏览器的帧率一般来说是60帧,也就是每秒60个画面, 平均一个画面大概是16.5毫秒左右,浏览器正常的工作流程是运算渲染,运算,渲染运算渲染,在浏览器里面一个运算,加上一个渲染就是一帧

Wang的专栏 2796

在react项目中修改webpack中本地服务器架设的目录

一个产品的上线往往会有很多的问题,现在就出现一个需求,我们是在服务器下的某个目录进行发布,而不是根服务器,服务端不想为一个项目配置ip地址,而在react项目中,默认是走的根路径,现在我们就开始修改一下它。 前提说明 如果我们需要修改手动配置webpack, 那么根据现在的版本, 我们只能执行 npm run eject, 之后就可以着手修改了。 webpack中与需求相关的...

Wang的专栏 2397

React18源码: React调度中的3种优先级类型和Lane的位运算

可以看得出来lane&-lane的结果是SyncLane,所以通过lane&-lane就能分离出最高优先级的任务。即A(cpu)>B(IO)>C(cpu).此时的需求需要将任务B从group中分离出来,先处理cpu任务A和C。在新版本的React中,还有一个新特性,就是render阶段可能被中断,在这个期间会产生一个更高优先级的任务。如上就是通过 lanes & -lanes 分离出最高优先级的任务的,我们来看一下具体的流程。也即是说lane的代表的数值越小,此次更新的优先级就越大。

Wang的专栏 2394

React18原理: 核心包结构与两大工作循环

react中的工作循环,这是它的一个最顶层的一个流程图,在这张图里面,有两个核心的大循环,第一大循环是 react-reconciler 提供的,它的核心是构建fiber树,生成任务,第二大循环是 scheduler 提供的, 它的核心是任务调度(处理任务的优先级),react的原理实际上就是两大工作循环

Wang的专栏 2356

React18原理: 生命周期中特别注意事项

生命周期就是一个组件从诞生到销毁的全过程(包含错误捕获,这里暂且不聊这个)react 在组件的生命周期中注册了一系列的钩子函数支持开发者在其中嵌入代码,并在适当的时机运行生命周期本质上就是组件中的钩子函数,主要有三个主要的钩子挂载更新卸载。

Wang的专栏 2244

React16源码: React中的beginWork的源码实现

定位到 packages/react-reconciler/src/ReactFiberBeginWork.js。整个文件 export 出去的只有 beginWork 方法。

Wang的专栏 2140

React16源码: React中的reconcileChildren的源码实现

在更新了一个节点之后,拿到它的props.children, 要根据这个children里面的 ReactElement 来去创建子树的所有的 fiber 对象, 要根据 props.children 来生成 fiber 子树,然后判断 fiber 对象它是否是可以复用的

Wang的专栏 2133
上一篇: React18源码: React调度中的3种优先级类型和Lane的位运算
下一篇: React18源码: schedule任务调度messageChannel
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值