React19源码系列之FiberRoot节点和Fiber节点
在上一篇文章,看了createRoot函数的大致流程。
createContainer函数创建并返回了FiberRoot。FiberRoot是由createFiberRoot函数创建,createFiberRoot函数还将FiberRoot和根Fiber通过current属性建立起了联系。- 将
FiberRoot作为参数传给ReactDOMRoot构造函数,返回带有_internalRoot属性(其实就是参数FiberRoot),render和unmount方法的ReactDOMRoot实例对象。
下面就继续来看一下 FiberRoot 和 Fiber 是如何创建以及他们的各自的属性都具体什么含义。
FiberRootNode 构造函数
FiberRootNode用于创建一个 FiberRootNode 实例,这个实例包含了与整个 React 应用渲染过程相关的各种状态和信息,如挂载的 DOM 容器、当前的 Fiber 树、优先级管理、错误处理回调、表单状态等,为 React 协调器管理和调度整个应用的渲染工作提供了基础。
函数参数含义:
●containerInfo:表示挂载 React 应用的 DOM 容器的信息,通常是一个 DOM 元素,如 document.getElementById(‘root’) 返回的元素。
●tag:用于标识 React 应用的启动模式,可能是并发模式或传统模式。
●hydrate:与服务端渲染的水合(hydration)相关的参数,用于指示是否进行水合操作。
●identifierPrefix:标识符前缀,可能用于生成唯一的标识符。
●onUncaughtError:未捕获错误的回调函数,当应用中出现未捕获的错误时会调用该函数。
●onCaughtError:捕获错误的回调函数,用于处理已捕获的错误。
●onRecoverableError:可恢复错误的回调函数,用于处理可以恢复的错误。
●formState:表单状态,可能包含表单的输入值、验证状态等信息。
function FiberRootNode(this: $FlowFixMe,containerInfo: any,// $FlowFixMe[missing-local-annot]tag,hydrate: any,identifierPrefix: any,onUncaughtError: any,onCaughtError: any,onRecoverableError: any,formState: ReactFormState<any, any> | null,
) {// 启动模式和容器this.tag = disableLegacyMode ? ConcurrentRoot : tag;//启动模式: 1并发模式,0传统模式this.containerInfo = containerInfo;// 挂载DOM容器的信息// fiberthis.pendingChildren = null;// 指向下一个 Fiber 节点树的指针,通常在更新过程中用于存储待处理的子节点。this.current = null;//指向当前 Fiber 节点的指针,代表当前正在渲染的 Fiber 树。this.pingCache = null;// 用于缓存 FiberNode 的引用,以便快速访问。this.finishedWork = null;//存储完成的 Fiber 节点,通常在渲染完成后更新。// 超时和取消this.timeoutHandle = noTimeout;// 处理超时的句柄,初始值为 noTimeout,用于管理渲染过程中的超时情况。this.cancelPendingCommit = null;// 用于取消挂起的提交操作的函数,初始值为 null。//上下文this.context = null; // 当前的上下文对象,用于在组件树中传递数据。this.pendingContext = null;// 当前挂起的上下文,在上下文更新时使用。// 链表this.next = null; // 指向下一个 FiberRootNode 对象的指针,用于构建链表结构。// 回调this.callbackNode = null;// 指向回调函数的 Fiber 节点的指针,用于管理回调函数的执行。this.callbackPriority = NoLane;// 回调优先级this.expirationTimes = createLaneMap(NoTimestamp);// 一个存储各个 Lane 过期时间的映射,通过 createLaneMap 函数创建,初始值为 NoTimestamp。//优先级this.pendingLanes = NoLanes; // 代表待处理的车道集合。NoLanes 表明目前没有待处理的更新任务。this.suspendedLanes = NoLanes; // 表示被挂起的车道集合。在某些情形下,更新任务可能会因为数据未就绪等原因而被挂起。this.pingedLanes = NoLanes;//指需要处理的车道集合。当某个车道被标记为需要处理时,会被添加到这个集合中。this.warmLanes = NoLanes;// 与预热渲染相关的车道集合。预热渲染一般用于提前准备数据或进行一些预计算。this.expiredLanes = NoLanes; // 代表已过期的车道集合。若某个更新任务的优先级较低,且等待时间过长,就可能会过期。this.finishedLanes = NoLanes; // 表示已完成的车道集合。当某个更新任务成功完成后,对应的车道会被添加到这个集合中。this.errorRecoveryDisabledLanes = NoLanes;// 表示禁用错误恢复的车道集合。在某些情况下,可能会禁用某些车道的错误恢复机制。this.shellSuspendCounter = 0;// 挂起计数器this.entangledLanes = NoLanes;// 相关联的 Lanethis.entanglements = createLaneMap(NoLanes);// 相关联的 Lane 的映射this.hiddenUpdates = createLaneMap(null); // 隐藏更新的 Lane 的映射this.identifierPrefix = identifierPrefix; // 标识符前缀// 回调this.onUncaughtError = onUncaughtError;this.onCaughtError = onCaughtError;this.onRecoverableError = onRecoverableError;// 可恢复错误的回调函数// 如果 enableCache 为 true,则初始化缓存相关的属性,包括缓存的 FiberNode 和缓存的 Lane。if (enableCache) {this.pooledCache = null; // 缓存的 FiberNodethis.pooledCacheLanes = NoLanes;// 缓存的 Lane}// 如果 enableSuspenseCallback 为 true,则初始化水合回调函数相关的属性。if (enableSuspenseCallback) {this.hydrationCallbacks = null;// 用于注水的回调函数}this.formState = formState; // 表单状态// 一个 Map 对象,用于存储未完成的过渡信息。this.incompleteTransitions = new Map();// 未完成的过渡的映射// 如果 enableTransitionTracing 为 true,则初始化过渡回调函数和过渡 Lane 映射。if (enableTransitionTracing) {this.transitionCallbacks = null;const transitionLanesMap = (this.transitionLanes = []);for (let i = 0; i < TotalLanes; i++) {transitionLanesMap.push(null);}}// 如果 enableProfilerTimer 和 enableProfilerCommitHooks 都为 true,则初始化性能分析相关的属性,用于记录副作用和被动副作用的持续时间。// if (enableProfilerTimer && enableProfilerCommitHooks) {// this.effectDuration = -0;// this.passiveEffectDuration = -0;
// }// 如果 enableUpdaterTracking 为 true,则初始化更新跟踪相关的属性,包括存储已记忆的更新器和每个 Lane 的待处理更新器集合。if (enableUpdaterTracking) {this.memoizedUpdaters = new Set();const pendingUpdatersLaneMap = (this.pendingUpdatersLaneMap = []);for (let i = 0; i < TotalLanes; i++) {pendingUpdatersLaneMap.push(new Set());}}
}

createFiber 函数
createFiber函数,根据组件类型调用不同的函数,默认enableObjectFiber为true,调用createFiberImplObject函数,否则调用createFiberImplClass函数。
const createFiber = enableObjectFiber? createFiberImplObject: createFiberImplClass;
createFiberImplObject
createFiberImplObject 函数是用于创建一个 Fiber 对象的具体实现,Fiber 对象是 React Fiber 架构中的核心数据结构,代表了一个 React 元素或组件的工作单元。该函数根据传入的参数初始化 Fiber 对象的各种属性,这些属性用于描述组件的状态、结构以及在渲染过程中的相关信息。
函数参数含义:
●tag:类型为 WorkTag,表示 Fiber 节点的类型,例如 HostComponent、FunctionComponent 等,不同的类型决定了 Fiber 节点在渲染过程中的不同处理方式。
●pendingProps:类型为 mixed,表示即将传递给组件的属性,这些属性可能会在后续的渲染过程中被使用。
●key:类型为 null 或 string,用于唯一标识 Fiber 节点,在 React 进行列表渲染时,key 可以帮助 React 更高效地进行元素的更新和重排。
●mode:类型为 TypeOfMode,表示 Fiber 节点的模式,例如并发模式、严格模式等,不同的模式会影响 React 的渲染行为。
function createFiberImplObject(tag: WorkTag,// 3代表根节点pendingProps: mixed,// 即将传递给组件的属性。 key: null | string,mode: TypeOfMode,// 渲染模式 并发模式或者传统模式
): Fiber {// 初始化 Fiber 对象const fiber: Fiber = {// Instance// tag, key - defined at the bottom as dynamic propertieselementType: null,// 通常存储 React 元素的类型,如函数组件、类组件或 DOM 元素类型,初始化为 null。type: null,// 与 elementType 类似,但在某些情况下可能会有不同的含义,初始化为 null。stateNode: null,// 存储与 Fiber 节点关联的实际 DOM 节点或组件实例,初始化为 null。// Fiberreturn: null,// 指向父 Fiber 节点,用于在渲染完成后返回上一级。child: null,// 指向第一个子 Fiber 节点。sibling: null,// 指向下一个兄弟 Fiber 节点。index: 0,// 表示当前 Fiber 节点在兄弟节点中的索引位置,初始化为 0。ref: null,// 用于存储 ref 对象,方便获取组件或 DOM 节点的引用。refCleanup: null,// 用于清理 ref 相关的资源,初始化为 null。// pendingProps - defined at the bottom as dynamic propertiesmemoizedProps: null,// 上一次渲染时使用的属性,初始化为 null。updateQueue: null,// 存储组件的更新队列,初始化为 null。memoizedState: null,// 存储组件的状态,初始化为 null。dependencies: null,// 存储组件的依赖项,初始化为 null。// Effectsflags: NoFlags,// 表示 Fiber 节点的副作用标记,初始化为 NoFlags,表示没有副作用。subtreeFlags: NoFlags,// 表示子树的副作用标记,初始化为 NoFlags。deletions: null,// 存储需要删除的子 Fiber 节点,初始化为 null。lanes: NoLanes,// 表示当前 Fiber 节点的优先级车道,初始化为 NoLanes。childLanes: NoLanes,// 表示子 Fiber 节点的优先级车道,初始化为 NoLanes。alternate: null,// 双缓存,指向的另一个版本的fiber// dynamic properties at the end for more efficient hermes bytecodetag,// fiber类型key,// 用于唯一标识 Fiber 节点pendingProps,// 即将传递给组件的属性。 mode,// Fiber 节点的模式,例如并发模式、严格模式等};// 启用了性能分析器if (enableProfilerTimer) {fiber.actualDuration = -0;// 表示 Fiber 节点实际渲染所花费的时间fiber.actualStartTime = -1.1;// 表示 Fiber 节点开始渲染的时间fiber.selfBaseDuration = -0;// 表示 Fiber 节点自身的基本渲染时间fiber.treeBaseDuration = -0;// 表示 Fiber 节点及其子树的基本渲染时间}// 返回 Fiber 对象return fiber;
}
createFiberImplClass
createFiberImplClass 函数是用于创建 Fiber 节点的另一种实现方式,它通过实例化 FiberNode 类来创建一个 Fiber 对象。
function createFiberImplClass(tag: WorkTag,pendingProps: mixed,key: null | string,mode: TypeOfMode,
): Fiber {// $FlowFixMe[invalid-constructor]: the shapes are exact here but Flow doesn't like constructorsreturn new FiberNode(tag, pendingProps, key, mode);
}
FiberNode 构造函数
FiberNode 是一个构造函数,用于创建 React 的 Fiber 节点。
函数参数含义:
●tag: WorkTag:tag 是一个 WorkTag 类型的值,用于标识 Fiber 节点的类型,例如是函数组件、类组件、原生 DOM 元素等。不同的 tag 值对应不同的处理逻辑。
●pendingProps: mixed:pendingProps 表示当前节点的待处理属性,是一个任意类型的值。这些属性是从父组件传递过来的,在节点的处理过程中可能会被更新。
●key: null | string:key 是一个可选的字符串,用于帮助 React 识别哪些元素发生了变化,提高列表渲染的性能。如果没有提供 key,则为 null。
●mode: TypeOfMode:mode 表示节点的模式,它定义了节点的一些行为和特性,例如是否处于严格模式等。
function FiberNode(this: $FlowFixMe,tag: WorkTag,pendingProps: mixed,key: null | string,mode: TypeOfMode,
) {// Instancethis.tag = tag;this.key = key;this.elementType = null;this.type = null;this.stateNode = null;// 存储与该 Fiber 节点对应的实际 DOM 节点或组件实例,初始化为 null。// Fiberthis.return = null;this.child = null;this.sibling = null;this.index = 0;this.ref = null;this.refCleanup = null;this.pendingProps = pendingProps;this.memoizedProps = null;this.updateQueue = null;this.memoizedState = null;this.dependencies = null;this.mode = mode;// Effectsthis.flags = NoFlags;this.subtreeFlags = NoFlags;this.deletions = null;this.lanes = NoLanes;this.childLanes = NoLanes;this.alternate = null;// if (enableProfilerTimer) {// this.actualDuration = -0;// this.actualStartTime = -1.1;// this.selfBaseDuration = -0;// this.treeBaseDuration = -0;
// }}
相关文章:
React19源码系列之FiberRoot节点和Fiber节点
在上一篇文章,看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建, createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…...
每天看一篇漏洞报告
前言: 内容来源于乌云漏洞 今日思考xss漏洞, 今天看到一篇文章,里面详细说了xss的绕过技巧,虽然时间久了,没有去尝试,待会有时间去测试一下 以下是整理后的文章,原文在下面 文章链接&#…...
采用贝塞尔函数,进行恒定束宽波束形成算法
matlab采用贝塞尔函数,进行恒定束宽波束形成算法 beselle.m , 1452 20191225160928.png , 43700 20191225160935.png , 45238 20191225161010.png , 76862...
TCP协议的多线程应用、多线程下的网络编程
DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式,一个服务端对应一个客户端,实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类,多线程接收socket对象 public class ServerSocketNable implements Run…...
华为中小型企业项目案例
实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...
LabVIEW VI Scripting随机数波形图自动生成
通过LabVIEW VI Scripting 技术,实现从零开始编程化创建并运行一个随机数波形监测VI。核心功能包括自动化生成VI框架、添加控件与函数、配置数据流逻辑及界面布局优化,适用于批量生成测试工具、教学模板开发或复杂系统的模块化构建。通过脚本化操作&…...
MATLAB 控制系统设计与仿真 - 26
状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论,它用状态变量来刻画系统的内部特征,用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…...
Python----计算机视觉处理(Opencv:图像镜像旋转)
一、图像镜像旋转 图像的旋转是围绕一个特定点进行的,而图像的镜像旋转则是围绕坐标轴进行的。图像镜像旋转,也可 以叫做图像翻转,分为水平翻转、垂直翻转、水平垂直翻转三种。 通俗的理解为,当以图片的中垂线为x轴和y轴时&#x…...
C++从入门到入土(八)——多态的原理
目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中,我们介绍了C三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将…...
国产编辑器EverEdit - 语法着色文件的语法
1 语法着色定义(官方文档) 1.1 概述 EverEdit有着优异的语法着色引擎,可以高亮现存的绝大多数的编程语言。在EverEdit的语法着色中有Region和Item两个概念,Region表示着不同的区块。而Item则代表着这些区块中不同的部分。一般情况下,Region…...
vue3当中使用Pinia的store的组件化开发模式
一、安装与初始化 安装Pinia npm install pinia # 或 yarn add pinia目的:引入Pinia核心库,为状态管理提供基础支持。 挂载Pinia实例 在main.js中初始化并注入Vue应用: import { createApp } from vue import { createPinia } from pinia i…...
PyCharm安装redis,python安装redis,PyCharm使用失败问题
报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…...
保姆级离线TiDB V8+解释
以前学习的时候还是3版本,如今已经是8版本了 https://cn.pingcap.com/product-community/?_gl1ujh2l9_gcl_auMTI3MTI3NTM3NC4xNzM5MjU3ODE2_gaMTYwNzE2NTI4OC4xNzMzOTA1MjUz_ga_3JVXJ41175MTc0MTk1NTc1OC4xMS4xLjE3NDE5NTU3NjIuNTYuMC41NDk4MTMxNTM._ga_CPG2VW1Y4…...
PyTorch 深度学习实战(17):Asynchronous Advantage Actor-Critic (A3C) 算法与并行训练
在上一篇文章中,我们深入探讨了 Soft Actor-Critic (SAC) 算法及其在平衡探索与利用方面的优势。本文将介绍强化学习领域的重要里程碑——Asynchronous Advantage Actor-Critic (A3C) 算法,并展示如何利用 PyTorch 实现并行化训练来加速学习过程。 一、A…...
【服务器知识】Nginx路由匹配规则说明
Nginx路由匹配规则说明 **一、Nginx路由匹配核心机制****二、匹配规则语法详解**1. **精确匹配 ()**2. **前缀匹配 (^~ 或 /)**3. **正则匹配 (~ 或 ~*)**4. **通配符匹配 (*)** **三、路由匹配优先级顺序****四、高级路由技巧**1. **条件判断 (if语句)**2. **路径重写 (rewrit…...
Docker换源加速(更换镜像源)详细教程(2025.3最新可用镜像,全网最详细)
文章目录 前言可用镜像源汇总换源方法1-临时换源换源方法2-永久换源(推荐)常见问题及对应解决方案1.换源后,可以成功pull,但是search会出错 补充1.如何测试镜像源是否可用2.Docker内的Linux换源教程 换源速通版(可以直…...
OpenAI--Agent SDK简介
项目概述 OpenAI Agents SDK 是一个轻量级但功能强大的框架,用于构建多智能体工作流。它主要利用大语言模型(LLM),通过配置智能体、交接、护栏和跟踪等功能,实现复杂的工作流管理。以下是对其各个部分运行过程和代码流…...
pytorch小记(十三):pytorch中`nn.ModuleList` 详解
pytorch小记(十三):pytorch中nn.ModuleList 详解 PyTorch 中的 nn.ModuleList 详解1. 什么是 nn.ModuleList?2. 为什么不直接使用普通的 Python 列表?3. nn.ModuleList 的基本用法示例:构建一个包含两层全连…...
SpringData Redis:RedisTemplate配置与数据操作
文章目录 引言一、Redis概述与环境准备二、RedisTemplate基础配置三、连接属性配置四、操作String类型数据五、操作Hash类型数据六、操作List类型数据七、操作Set类型数据八、操作ZSet类型数据九、事务与管道操作总结 引言 Redis作为高性能的NoSQL数据库,在分布式系…...
Qt按钮控件常用的API
1.创建按钮 QPushButton *btnnew QPushButton; 以顶层方式弹出窗口控件 代码: #include "widget.h" #include "ui_widget.h" #include"QPushButton"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…...
如何检查CMS建站系统的插件是否安全?
检查好CMS建站系统的插件安全是确保网站安全的重要环节,对于常见的安全检查,大家可以利用以下几种有效的方法和工具,来帮你评估插件的安全性。 1. 检查插件来源和开发者信誉 选择可信来源:仅从官方插件库或可信的第三方开发者处…...
修改HuggingFace模型默认缓存路径
huggingface模型的默认缓存路径是~/.cache/huggingface/hub/ 通常修改为自己的路径会更为方便。 方式一:cache_dir 参数 可以通过from_pretrained函数中的 cache_dir 参数来指定,缺点,每次都需要手动指定,比较麻烦。 如&#x…...
ORA-12541: TNS:no listener
问题描述:使用 PL/SQL Developer 连接数据库时出现ORA-12541错误。 1.查询监听状态 [oraclelocalhost admin]$ lsnrctl statusLSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 10:47:57Copyright (c) 1991, 2021, Oracle. All rights reserv…...
【Matlab GUI】封装matlab GUI为exe文件
注:封装后的exe还是需要有matlab环境才能运行 (1)安装MCRinstaller.exe文件,在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 (2)安装完MCRinstaller.exe,字命令窗口输入&#x…...
【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发
在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上,将隧道转发改成直接转发 一、改成直接转发需要改动的配置 (一)将连接AP的接口改成trunk口,并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …...
Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比
一、Redis的持久化机制与可靠性分析 AOF持久化原理与策略 Redis的AOF(Append Only File)通过记录所有写操作命令实现持久化,支持三种策略: **always模式**:每条命令执行后立即同步到磁盘,理论上数据丢失…...
机器人ROS学习:Ubuntu22.04安装ROS2和Moveit2实现运动规划
通过本篇文章学习,你可以收获以下内容: 学会在 Ubuntu22.04 上安装 Moveit2学会下载编译运行 Moveit2 样例程序学会使用样例程序进行运动规划等 版本平台 系统版本:ubuntu22.04ROS2 版本:humbleMoveit 版本:moveit2…...
GIT标签(Tag)操作
在Git中,标签(Tag)用于标记特定的提交点,通常用于发布版本。 切换到需要打标签的分支: git checkout <branch-name>创建标签 git tag v1.0.0 git tag -a v1.0.0 -m "Release version 1.0.0"查看所…...
生成式AI红队测试:如何有效评估大语言模型
OWASP最新指南为组建生成式AI红队或调整现有红队以适应新技术提供了详细的指导。 红队测试是一种经过时间检验的网络安全系统测试和加固方法,但它需要不断适应技术的演变。近年来,生成式AI和大语言模型(LLM)的爆发,是…...
技术路线图ppt模板_流程图ppt图表_PPT架构图
技术路线图ppt模板 / 学术ppt模板 - 院士增选、国家科技奖、杰青、长江学者特聘教授、校企联聘教授、重点研发、优青、青长、青拔.. / 学术ppt案例 WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 - 科学技术奖ppt:自然科学奖 | 技术…...
