React 中的 Fiber 架构

news2025/1/17 0:25:49

React Fiber 介绍

在这里插入图片描述

React Fiber 是 React 的一种重写和改进的核心算法,用于实现更细粒度的更新和高效的调度。它是 React 16 版本中的一个重要更新,使得 React 能够更好地处理复杂和高频的用户交互。以下是对 React Fiber 的详细介绍:

为什么需要 React Fiber?

在传统的 React 中,更新操作是同步的,一旦开始更新,整个组件树的更新过程不会被中断。这在处理复杂组件树或高频用户交互时,可能导致界面卡顿和响应变慢。为了解决这个问题,React Fiber 引入了更灵活的调度机制,使得 React 能够将更新任务分成更小的工作单元,并在适当的时候中断和恢复这些任务,从而提升应用的性能和用户体验。

Fiber 架构具有以下特点:

增量渲染

Fiber 将渲染工作分成多个小的工作单元,这些单元可以在多个帧中执行。由于分成了更小的任务单元,在这些任务单元之间可以停顿,可以执行其他任务。

优先级调度

不同的任务根据其重要性被赋予不同的优先级,确保用户输入等高优先级任务能够快速响应。

恢复和暂停

React 可以在处理完一个工作单元后中断,检查是否有更高优先级的任务需要处理。如果有,则优先处理高优先级任务。否则,继续处理剩余的渲染任务。

两阶段 & 两棵树

Fiber 架构包含两个阶段:

调度阶段(Reconciliation Phase)

这一阶段,React 会计算需要更新的组件和对应的状态变更。调度阶段是可以被中断的,React 会根据优先级逐步处理更新任务。

提交阶段(Commit Phase)

一旦调度阶段完成,提交阶段会将更新应用到实际的 DOM 中。提交阶段是同步的,React 会确保所有的 DOM 变更在一次帧内完成。

Fiber架构在内存中包含了两棵树,一棵是当前树已经渲染完成的树,也就是已经展现在页面上的。一棵是工作树(Work-in-Progress Tree),这两棵树互相替换进行状态的更新。

克隆和更新:

当发生更新(例如,状态变化或新的 props)时,React 通过克隆当前树创建一棵进行中工作树。当前树中的每个节点都会被复制到进行中工作树中。
然后,React 在工作树上执行差异分析,这涉及调用组件的 render 方法,将生成的元素与以前的元素进行比较,并在需要时生成新的进行中工作 fiber。

提交阶段:

一旦进行中工作树完全调和并计算了所有更新,React 进入提交阶段。在提交阶段,工作树中的更改会应用到 DOM 中,工作树成为新的当前树。这是一个原子操作,确保 UI 一致地更新。

双缓冲:

React Fiber 使用类似于计算机图形学中的双缓冲的概念。通过在单独的副本(工作树)上工作,React 可以在屏幕外计算更新,然后快速将其应用到屏幕上,最大限度地减少 UI 处于不一致状态的时间。

Fiber 节点对象

在这里插入图片描述

Fiber节点主要包含以下属性,完整代码,移步至 React 源码,Fiber节点是 React 的核心,Fiber 节点保存着和节点相关的所有重要信息。不同 ReactElement,每次都创建新的,Fiber 节点是从用的这也就是为什么函数式组件可以有状态的原因。

{
  // 组件或 DOM 节点的类型(例如:"div", "App", "Button")
  type: 'div',

  // 关联的 DOM 节点(如果适用)
  stateNode: document.createElement('div'),

  // 当前 fiber(表示该组件的最新 fiber)
  // 用于在下一个调和阶段检查此 fiber 是否已更新
  return: null,
  child: null,
  sibling: null,
  index: 0,

  // 备用 fiber(表示该组件的上一个 fiber)
  // 用于在下一个提交阶段对 DOM 执行副作用和清理操作
  // 这仅用于非并发模式
  alternate: null,

  // 备忘的 props 和 state(该组件的最新 props 和 state)
  // 用于在下一个调和阶段检查组件是否需要更新
  memoizedProps: {},
  memoizedState: {},

  // 过期时间(该组件需要更新的截止时间)
  // 用于在下一个阶段优先更新哪些组件
  expirationTime: 0,
}

工作的单元划分

在 Fiber中,任务被划分成了工作单元,根据优先级进行调度,优先级高的先执行。Fiber中,通过 WorkLoop 执行 Fiber树上的节点,每次执行前会检查是否需要释放给更高优先级的任务,相当于暂停的操作。WokLoop 源代码

function workLoopConcurrent() {
  // Perform work until Scheduler asks us to yield
  while (workInProgress !== null && !shouldYield()) {
    // $FlowFixMe[incompatible-call] found when upgrading Flow
    performUnitOfWork(workInProgress);
  }
}

执行任务,任务具体的执行是在 beginWork 和 completeUnitOfWork 中,beginWork中处理 Fiber节点的主要逻辑,completeUnitOfWork主要是收尾工作。

function performUnitOfWork(unitOfWork: Fiber): void {
  // The current, flushed, state of this fiber is the alternate. Ideally
  // nothing should rely on this, but relying on it here means that we don't
  // need an additional field on the work in progress.
  const current = unitOfWork.alternate;
  setCurrentDebugFiberInDEV(unitOfWork);

  let next;
  if (enableProfilerTimer && (unitOfWork.mode & ProfileMode) !== NoMode) {
    startProfilerTimer(unitOfWork);
    next = beginWork(current, unitOfWork, renderLanes);
    stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
  } else {
    next = beginWork(current, unitOfWork, renderLanes);
  }

  resetCurrentDebugFiberInDEV();
  unitOfWork.memoizedProps = unitOfWork.pendingProps;
  if (next === null) {
    // If this doesn't spawn new work, complete the current work.
    completeUnitOfWork(unitOfWork);
  } else {
    workInProgress = next;
  }

  ReactCurrentOwner.current = null;
}

总结

React Fiber 是 React 渲染的重要概念,可以说 React 主要数据都是保存在 Fiber 树上,对状态的改动最终都会体现在 Fiber 节点的更新上。随着前端页面的复杂度的升高,对于渲染效率的要求也越来越高,Fiber 这种将渲染任务进行切分的设计理念大大提高了复杂前端单页面应用的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1712745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中的工具类

以下是我们到现在学的三个类 在书写工具类的时候我们要遵循以下的规则 类名见面知意是为了知道这个工具类的作用 私有化构造方法的作用是为了不让外界不能创造这个类的对象吗,因为工具类不是描述一个事物的,它是一个工具。 方法定义位静态是为了方便调用…

8086 汇编笔记(一):寄存器

前言 8086 CPU 有 14 个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW 一、通用寄存器 8086 CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用…

剧本杀小程序开发,探索市场发展新的商业机遇

剧本杀游戏作为一个新兴行业,经历了爆发式的增长,剧本杀游戏在市场中的热度不断升高。 不过,在市场的火热下,竞争也在逐渐加大。因此,在市场竞争下,成本低、主题多样、有趣的线上剧本杀小程序成为了创业者…

永恒之蓝(MS17-010)详解

这个漏洞还蛮重要的,尤其在内网渗透和权限提升。 目录 SMB简介 SMB工作原理 永恒之蓝简原理 影响版本 漏洞复现 复现准备 复现过程 修复建议 SMB简介 SMB是一个协议服务器信息块,它是一种客户机/服务器、请求/响应协议,通过SMB协议…

两年半前端面字节,广度和深度让我不想做前端了

两年半经历,面的是前端工程师,字节面试官的问题挺有广度与深度的,这里整理一下面试过程中的题目(有些忘记了),分享给大家: 面试过程中的问题 1、简单的自我介绍与项目经验。 2、一道算法题。 3、一道 …

揭秘!编写高质量代码的关键:码农必知的黄金法则!

文章目录 一、保持代码的简洁与清晰二、遵循良好的命名规范三、注重代码的可读性四、利用抽象与封装五、遵循SOLID原则六、关注代码性能七、确保代码安全性《码农修行:编写优雅代码的32条法则》编辑推荐内容简介目录前言/序言 在编程的世界里,每一位码农…

给转行产品经理的小白的一些建议

哈喽我是小源,毕业在教培大厂做了1年的班主任,下午1点上班,被优化后gap3月找到了自己的本命岗位——产品经理! 其实这个转变也挺机缘巧合的,朋友和我都是教培行业,她是成人职教类,我是k111类&a…

SSL证书:守护个人信息安全的坚固盾牌

在数字化浪潮汹涌的今天,我们的个人信息如同一座座宝藏,吸引着不法分子的贪婪目光。数据泄露事件频发,让信息安全问题日益凸显。而在这个信息爆炸的时代,如何保护我们的个人信息安全,成为了一个亟待解决的问题。幸运的…

【嵌入式】RS485通信+硬件

目录 1.物理层 2.协议层 3.收发电路 3.1三极管开关电路 3.2收发原理图解释 1.物理层 对比 CAN 通讯网络,可发现它们的网络结构组成是类似的,每个节点都是由一个通讯控制器和 一个收发器组成,在 RS-485 通讯网络中,节点中的…

基于单片机的操作平台数据采集网关设计与实现

摘  要: 由于传统网关无法实现数据实时交换,数据传输速率较低,为此提出基于单片机的操作平台数据采集网关设计与实现研究。首先,结合单片机具有的显著优势对网关结构选型设计;其次,参照一体化设计理念&…

每日力扣刷题day07(滑动窗口专项)

文章目录 2024.5.28(3题)643. 子数组最大平均数 I解题思路Java代码实现详细解释 1343. 大小为 K 且平均值大于等于阈值的子数组数目解题思路java代码实现详细解释 2090. 半径为 k 的子数组平均值解题思路java代码实现详细解释 2024.5.28(3题&…

惠海半导体 30V-60V-100V-150VMOS管 打火机、加湿器NMOS管 高耐压

MOS管的工作原理 MOS管,即金属-氧化物-半导体场效应晶体管,是一种重要的电子元件,在电路中起着关键的作用。其工作原理主要基于半导体材料的特性以及电场对电荷的控制。 首先,MOS管的基本结构包括源极、栅极和漏极。其中&#xf…

29. 【Java教程】异常处理

Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常…

2023-2024中国区块链年度发展报告

来源:赛迪 近期历史回顾:2024社交媒体全球使用趋势报告.pdf 国际建造成本指数报告2024--产能角逐.pdf 2024可持续包装管理体系与最佳实践案例集.pdf 2024年专利诉讼报告.pdf 2024Q1保险业运行报告.pdf 2024年云指数报告.pdf 2024内容营销10大趋势-内容时…

负载箱:充电桩测试利器

随着新能源汽车的普及,充电桩的需求也在不断增长。为了保证充电桩的安全、稳定和高效运行,对其进行严格的测试是必不可少的。在这个过程中,负载箱就成为了充电桩测试的重要工具。 负载箱模拟电动汽车充电的设备,它可以模拟真实的充…

轻松掌握图片批量处理,赶紧学习这些小技巧!

在现今数字化的社会中,我们每天都会接触到大量的图片,无论是在工作中还是日常生活中。要想高效处理这些图片,掌握图片批量处理的技巧就显得尤为重要。幸运的是,有许多小技巧和工具可以让这一过程变得轻松愉快。 在本文中&#xf…

轻松驾驭文件管理:一键转换格式,自定义重命名,让你的文件整理更高效便捷!

在日常工作和生活中,我们经常会面临需要修改文件格式的情况。无论是转换文件为更普遍使用的格式,还是根据特定需求调整文件的扩展名,都需要一个简单而有效的文件管理工具来完成这项任务。那么,文件批量改名高手将会让您在文件格式…

新品发布(仓库小助手)一机在手,轻松无忧

你是否曾为繁琐的货物管理而烦恼? 你是否为了记录货物信息忙前忙后? 近几年,陆续有收到客户在运营跨境代购中的一些反馈,特别是仓库管理这块,比如包裹的出入库、移库、修改包裹信息等,都需要在电脑上完成&…

6公里远距离视频传输,飞睿智能无线CV5200模组方案,设备稳定连接通信

随着科技的不断进步,物联网(IoT)和智能设备正逐渐渗透到我们生活的方方面面。在这一进程中,远距离无线通信成为推动行业发展的关键因素。 智能控制、远程无线传输是实现设备间的协作场景的关键,CV5200模组通过无线WiF…

js在处理异步任务时,forEach和for...of循环之间的区别

先看效果 forEach循环: 1、forEach是数组的原生方法,用于遍历数组。 2、它无法直接处理异步任务,因为它不会等待每个任务的完成,而是立即执行下一个任务。 3、这意味着如果在forEach循环中执行异步任务,它们将会同时进…