React-Fiber原理

【React Fiber 架构详解】 React Fiber 是 React 16 引入的核心协调算法重构,旨在解决传统同步渲染的性能瓶颈,提升用户体验。其核心在于将渲染任务拆解为可中断、优先级可控的增量单元,并通过链表数据结构优化调度流程。Fiber 的革新目标包括异步可中断、增量渲染和优先级调度,确保关键操作快速响应。其核心机制包括 Fiber 节点数据结构、双缓存机制和优先级调度与时间分片。Fiber 的工作流程分为协调阶段、提交阶段和工作循环,通过任务分片和优先级控制减少卡顿,支持并发渲染和错误边界。尽管 Fiber 提升了性能,但也存 阅读详情

在 React 16 之前,更新虚拟 DOM 的过程称为 Stack Reconciler,这是一个递归的过程,在层级很深的时候,单次 diff 时间过长会让 JS 线程持续被占用,导致用户交互响应迟滞,页面渲染会出现明显的卡顿。为了解决这种问题,react 团队基于 Fiber 架构重构了 React,使其能够将任务分片,划分优先级,同时能够实现类似于操作系统中对线程的抢占式调度

写在前面

由于主流的屏幕刷新率都在 60hz,因此浏览器渲染一帧的时间必须控制在 16.7ms 内才能保证不掉帧,也就是说每一次渲染都要控制在 16.7ms 内,页面才不会卡顿

浏览器每一帧都需要完成哪些工作?
浏览器一帧内的工作.png

通过上图可看到,一帧内需要完成如下六个步骤的任务:

  1. 处理用户交互
  2. 解析 js 脚本
  3. Begin frame。resize、scroll 等事件的处理
  4. rAF
  5. 布局
  6. 绘制

页面是一帧一帧绘制出来的,当 FPS(每秒绘制的帧数)达到 60 时,页面是流畅的,小于这个值时,用户会感觉到卡顿。也就是说浏览器 1s 绘制 60 帧,每一帧分到的时间是 1000/60 ≈ 16 ms。所以我们应该力求不让一帧的工作量超过 16ms。

由此我们知道,浏览器是一帧一帧执行的,在两个执行帧之间,主线程通常会有一小段空闲时间

浏览器一帧工作的空余.png

requestIdleCallback 可以在这个空闲期(Idle Period)调用空闲期回调(Idle Callback),执行一些任务

Fiber reconciler

Fiber 协调核心:可中断、可恢复 和 优先级

新特性如下:

  • 给不同类型的更新任务赋予优先级,能够暂停、终止和复用渲染任务
  • 把渲染任务拆分成块,匀到多帧
  • 并行渲染(还在开发中,值得期待)

将以前的 stack reconciler 拆分成两个阶段:render 与 commit。render 阶段是可打断的,被拆分成一个个的小任务(fiber),在每一侦的渲染空闲期执行。然后是 commit 阶段,这个阶段是不拆分且不能打断的,将最终的 effectList 一口气更新到页面上。这两个阶段后续会详细介绍

  • 每个更新任务都会赋予一个优先级
  • 当更新任务抵达调度器时,高优先级的更新任务(A)会更快地被调度进入 Reconciler —— 优先级
  • 此时有新的更新任务(B),调度器会检查它优先级,若高于当前任务(A),处于当前 Reconciler 层的 A 任务会被中断,调度器将 B 任务推入 Reconciler 层 —— 可中断
  • 当 B 任务完成渲染后,新一轮调度开始,之前被中断的 A 任务将会被重新推入 Reconciler 层,继续它的渲染 —— 可恢复

Fiber Node

React Fiber 把更新过程碎片化,以 Fiber Node 为一个工作单元,执行过程如下面的图所示,每执行完一段更新过程,就把控制权交还给 React 负责任务协调的模块,看看有没有其他紧急任务要做,如果没有就继续去更新,如果有紧急任务,那就去做紧急任务

有了分片之后,更新过程的调用栈如下图所示,中间每一个波谷代表深入某个分片的执行过程,每个波峰就是一个分片执行结束交还控制权的时机,让线程处理别的事情

fiber调度.png

一个虚拟 DOM 节点对应一个 Fiber Node

type Fiber = {
  // 标识不同的组件类型
  // FunctionComponent: 0; ClassComponent: 1...
  tag: WorkTag,

  key: null | string,

  // react 元素类型
  // 可以为ClassComponent、FunctionComponent、Symbol、HostComponent...
  elementType: any,

  // The resolved function/class/ associated with this fiber.
  type: any,

  // 该fiber节点对应的ReactElement对象
  stateNode: any,

  // fiber的父级
  return: Fiber | null,

  // 单链表树状结构
  child: Fiber | null,
  sibling: Fiber | null,
  index: number,

  ref: null | (((handle: mixed) => void) & { _stringRef: ?string }) | RefObject,

  // 新 props
  pendingProps: any,
  // 旧 props
  memoizedProps: any,

  // 更新队列
  updateQueue: UpdateQueue<any> | null,

  // 旧 state
  memoizedState: any,

  // DOM diff相关
  effectTag: SideEffectTag,

  // 副作用链表
  nextEffect: Fiber | null,
  firstEffect: Fiber | null,
  lastEffect: Fiber | null,

  // 标识该组件应该在未来的某个时刻完成更新
  // expirationTime 五种类型:
  // NoWork(默认0)、Never(1)、Interactive(100 - 150)、Async(250 - 5000)、Sync(Number.MAXINTEGER)
  expirationTime: ExpirationTime,

  // 快速确定子fiber树有没有挂起的更改
  childExpirationTime: ExpirationTime,

  // fiber 的镜像节点
  alternate: Fiber | null,
};

Fiber 树示意图如下:

fiber树结构.png

演示:

创建fiber.gif

双链表

在 react 中始终存在 workInprogressTree(future vdom) 与 oldTree(current vdom)两个链表,两个链表相互引用。

fiber双链表

双链表的好处有:

  • 复用内部对象(Fiber Node),可以节省内存分配、GC 的时间开销
  • 获取旧状态
  • 当 workInprogressTree 生成报错时,这时也不会导致页面渲染崩溃,而只是更新失败,页面仍然还在

最后

【react】什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行 我在[react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?一文中,介绍了虚拟的概念,以及中虚拟的使用场景。那么按照之前的约定,本文来聊聊中另一个非常重要的概念,也就是。那么通过阅读本文,你将了解到如下几个知识点:同样,若文中涉及到的源码部分,我依然会使用的版本,保证文章的结论不会过于老旧;其次,的概念理解起来其实比较枯燥,但我会尽量描述的通俗易懂一点,那么本文开始。我们学习任何东西,一定会经历两个阶段,一是这个东西是什么?二是这个东西有什么用(解 阅读详情

相关推荐

React-从源码分析React Fiber工作原理

本文的demo仓库在https://github.com/qiqingjin/blog/tree/master/React_Redux,喜欢请star哟~ 为什么要重写React React16 以前 React16 以前,对virtural dom的更新和渲染是同步的。就是当一次更新或者一次加载开始以后,diff virtual dom并且渲染的过程是一口气完成的。如果组件...

柒青衿的博客 1万+

学习篇之React Fiber概念及原理

React Fiber 是 React 框架的一种底层架构,为了改进 React 的渲染引擎,使其更加高效、灵活和可扩展。

study_way的博客 5179

深度解析react中hooks的底层原理是啥?React架构fiber原理深度解析

React Hooks 的底层原理是基于 React Fiber 架构的实现。React Fiber 是 React 的新的协调引擎,它的设计目标是等特性。Fiber 架构重新实现了 React 的调度算法,使得 React 可以更灵活地控制组件的渲染过程。我们都知道react框架的核心算法是diff算法的,其实 diff 算法的核心就是复用节点,通过一一对比也好,通过 map 查找也好,都是为了找到可复用的节点,移动过来。

为了WLB努力 2530

react底层原理解析之fiber

Fiber的特点/作用 Fiber能够使得动画、布局和页面交互变得更加的流畅。 一:Fiber的概念   React Fiber是react执行渲染时的一种新的调度策略,JavaScript是单线程的,一旦组件开始更新,主线程就一直被React控制,这个时候如果再次执行交互操作,就会卡顿。   React Fiber就是通过对象记录组件上需要做或者已经完成的更新,一个组件可以对应多个Fiber。 ...

吴小迪的博客 4万+

React的fiber原理

React 的 Fiber 架构

weixin_45678402的博客 1500

React Fiber的原理

React Fiber是React 16及更高版本中引入的一种新的核心算法,它作为React内部调度机制的重构部分,对原有的Reconciliation(协调)过程进行了升级。Fiber架构的目标是提高React在复杂应用中的性能和可预测性,并支持异步渲染、优先级调度等功能。总之,React Fiber通过改进React内部的工作机制,使React具备了更优秀的性能优化手段,提升了用户体验,并且为未来的框架功能扩展提供了更加灵活的基础架构。

读心悦 1479

关于 React Fiber 架构、Hooks 原理

在 React 16 版本之前,采用的是栈调和(Stack Reconciler),流程是 JSX 经过render函数转换为虚拟 DOM(VDOM),然后直接递归渲染 VDOM。这种方式一旦开始渲染就无法中断,若渲染任务复杂,会导致页面卡顿,影响用户体验。而 React 16 引入了 Fiber 架构,在 VDOM 和实际 DOM 渲染之间增加了一个协调(Reconcile)阶段。

weixin_42283818的博客 1360

React Fiber架构原理

在 React 16 之前,VirtualDOM 的更新过程是采用 Stack 架构实现的,也就是循环递归方式。这种对比方式有一个问题,就是一旦任务开始进行就无法中断,如果应用中组件数量庞大,Virtual DOM 的层级就会比较深。如果主线程被长期占用,就会阻塞渲染,造成卡顿。为了避免这种情况,需要执行更新操作时不能超过16ms,如果超过16ms,就需要先暂停,让给浏览器进行渲染操作,后续再继续执行更新计算。而Fiber架构就是为了支持“可中断渲染”而创建的。在React中,fiber tree是一种数据

xiangzhihong8的专栏 1178

万字长文介绍React Fiber架构的原理和工作模式

这篇文章从React Fiber架构的原理和源码入手,为你织开一面关于Fiber架构的基础知识网络。

BigYe_ChengPu的博客 2385

基于TL431与MOSFET的高效过压保护电路设计详解

本文详细解析了基于TL431与MOSFET的高效过压保护电路设计。通过TL431精准监测电压,驱动MOSFET作为主开关,实现快速可靠的电源保护。文章涵盖电路原理、参数计算、性能优化及实战调试要点,为电子设备提供了一套经典且成本低廉的过压保护解决方案。

weixin_29215391的博客 782

电容式触摸抗干扰设计:工业环境下的实践方案

针对工业环境中电容式touch器件易受干扰的问题,分享实用的硬件布局与软件滤波方案,提升touch响应稳定性和可靠性。

weixin_35755562的博客 845

React源码阅读-fiber核心构建原理

比较多工程化和基础的东西,还没完善,有兴趣的可以[github]拉下来试试欢迎加入群聊,我们一起讨论一些更有趣的技术、商业、闲聊。

xibaoyu2025a的博客 1456

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 695

React理念——Fiber架构的主要原理

在渲染过程中根据优先级和时间片(Time Slicing)等策略,将任务分配到不同的时间片段中执行,而不是一次性将整个渲染过程执行完毕。返回副作用链表: 当遍历完成后,React Fiber 将最终形成的副作用链表返回,以便在提交阶段中执行实际的 DOM 更新操作。,计算出整个应用的新状态,并生成新的虚拟 DOM 树,最后将新旧虚拟 DOM 树进行对比,找出差异并进行更新。在传统的 React (React15及以前)渲染过程中,当进行组件的更新时,React 会从组件树的根节点开始。

fighting ~的博客 1889

西门子200 SMART与博图WinCC通讯全攻略:从PC Access到S7-200协议避坑指南

本文详细解析了西门子S7-200 SMART PLC与博途WinCC上位机通讯的两种主流方案:基于PC Access SMART的OPC通讯和利用博途内置S7-200协议驱动直连。文章深入对比了两种架构的优缺点、配置步骤,并提供了从网络层到软件层的深度排错指南与性能优化建议,帮助工程师高效、稳定地实现系统集成。

gg901的博客 812

智能温室:温室环境监测_(7).土壤监测技术包括pH值和电导率

土壤的pH值是指土壤溶液的酸碱度,它对植物的营养吸收和生长发育有着重要的影响。在智能温室中,土壤监测是非常重要的一个环节,因为土壤的pH值和电导率直接影响植物的生长和健康。本节将详细介绍如何利用传感器和数据处理技术来监测土壤的pH值和电导率,并提供具体的代码示例。在智能温室中,监测到的土壤pH值和电导率数据需要传输到中央控制系统进行进一步的处理和分析。通过以上步骤,您可以构建一个完整的智能温室土壤监测系统,实时监控土壤的pH值和电导率,确保植物在最佳的生长环境中。校准通常包括在已知电导率的标准溶液中进行。

zhubeibei168的博客 1408

理解react fiber原理

理解fiber,fiber是一种数据结构,也是一个执行单元,fiber之前,react是通过使用递归去遍历虚拟dom树,找出不同去更新dom,这样就会造成执行栈太深,且无法中途中断的问题,而由于浏览器的渲染线程和js线程的执行是互斥的,如果 js执行的时候,占用时间太久就会引起卡顿。当以上工作做完后,浏览器通常会有一定的剩余时间,而react fiber正是利用这一空闲时间和fiber树的链表形式的数据结构, 实现了在浏览器每一帧的空闲时间去执行处理任务。这个工作循环会一直执行,即便里面没有任务可执行。

m0_52519805的博客 329

10分钟搞定manim安装与vscode配置

manim安装与vscode配置

帅帅de三叔 3413

React Fiber 架构原理

Fiber 原理 在 Fiber 出现之前 React 存在什么问题 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归。这种对比方式有一个问题,就是一旦任务开始进行就无法中断,如果应用中的组件数量庞大,Virtual DOM 的层级比较深,主线程被长期占用,直到整棵 VirtualDOM 树比对更新完成之后主线程才能被释放,主线程才能执行其他任务。这就会导致一些用户交互,动画等任务无法立即得到执行,页面就会产生卡顿, 非常的影响用户体验。

weixin_50964668的博客 741

基于STM32设计的老人监护系统(OneNet)_118

该项目是基于STM32设计的老人监护系统。本系统可以通过脉搏心率传感器,体温传感器检测老人的脉搏状态,体温状态,把老人的数据状态在STM32单片机内部进行处理,然后通过GSM模块上传到OneNet云平台,在通过可视化界面显示出来,这样可以让子女随时随地了解到老人现在的身体情况,以便对老人的突发情况能够做出及时的预防和处理。而且如今,随着老人年纪不断的增长,身体体质不断的衰弱,在上楼梯或者走斜坡的时候很容易会发生摔倒或跌倒,如果不及时的接收到治疗,很可能会造成很严重的后果。

7456

【AI智能体】Coze 数据库从使用到实战操作详解

Coze 数据库使用到实战详解

congge 5916

React Fiber 原理介绍

欢迎关注我的公众号睿Talk,获取我最新的文章: 一、前言 在 React Fiber 架构面世一年多后,最近 React 又发布了最新版 16.8.0,又一激动人心的特性:React Hooks 正式上线,让我升级 React 的意愿越来越强烈了。在升级之前,不妨回到原点,了解下人才济济的 React 团队为什么要大费周章,重写 Rea...

weixin_33810006的博客 139

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

浅谈react fiber原理

React Fiber 是 React 16 引入的一种新的协调算法,用于实现更新、调度和渲染 React 组件。它的目标是提高 React 应用的性能和用户体验,使得 React 能够更好地处理大型和复杂的应用。:React Fiber 是一种可中断的更新机制,将渲染过程分解为多个步骤,并允许在每个步骤中暂停、中断或者优先级调度。这样可以确保 React 在处理更新时能够及时响应用户输入、动画和其他高优先级任务,从而提高了应用的响应性和流畅性。二.

qq_40658616的博客 2332

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

手写React的Fiber架构,深入理解其原理

熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 913

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

React底层原理:虚拟DOM与Fiber架构解析

React 的响应式底层原理基于虚拟 DOM(Virtual DOM)、Fiber 架构、状态更新机制和调度系统(Scheduler)。React 的响应式原理之一是通过对虚拟 DOM 的操作,避免直接操作真实 DOM,提高性能。React 16 引入了 Fiber 架构,这是 React 响应式底层的核心技术,用于高效地管理组件更新和渲染。这些原理的结合,使 React 能够高效响应状态变化,提供流畅的用户体验,同时保持开发的灵活性和可维护性。React 的 Diff 算法是实现高效响应式更新的关键。

警警的博客 2374
上一篇: typescript-tsconfig文件解释
下一篇: React-更新组件的三个阶段和源码解释
__lucas
博客等级 码龄9年 329粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值