iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么理解的React Fiber
  • 431
分享到

怎么理解的React Fiber

2023-06-27 10:06:20 431人浏览 独家记忆
摘要

本篇内容主要讲解“怎么理解的React Fiber”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解的React Fiber”吧!Fiber出现的背景?在早期的 React 版本中,也就是

本篇内容主要讲解“怎么理解的React Fiber”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解的React Fiber”吧!

Fiber出现的背景?

在早期的 React 版本中,也就是 React16.8 版本之前。

大量的同步计算任务阻塞了浏览器的UI渲染。默认情况下,js运算页面布局页面绘制渲染都是运行在浏览器的线程当中,他们之间是互斥的关系。

如果 JS 运算持续占用主线程,页面就没法得到及时的更新,当我们调用setState更新页面的时候,React 会遍历应用的所有节点,与老的 dom 节点进行 diff 算法的对比,最小代价更新页面,即使这样,整个过程也是一气呵成,不能被打断的,如果页面元素很多,整个过程占用的时间就可能超过16毫秒,出现掉帧的现象。

针对这一现象,React 团队从框架层面对 WEB 页面的运行机制做了优化,此后,Fiber诞生了。

说到16ms,我们来看这样的一个概念

屏幕刷新率

  • 目前大多数设备的屏幕刷新率为60次/秒

  • 浏览器的渲染动画或页面的每一帧的速率也需要跟设备屏幕的刷新率保持一致。

  • 页面是一帧一帧绘制出来的,当每秒绘制的帧数(FPS)达到60时,页面是流畅的,小于这个值时,用户会感觉到卡顿。

  • 每个帧的预算时间是16.66毫秒(1秒/60)

  • 1s 60帧,所以我们书写代码时尽量不让一帧的工作量超过16ms

Fiber的诞生

解决主线程长时间被 JS 晕眩占用这一问题的基本思路,是将运算切割为多个步骤,分批完成。也就是说在完成一部分任务之后, 将控制权交回给浏览器,让浏览器有时间再进行页面的渲染。等浏览器忙完之后,再继续之前React未完成的任务。

旧版 React 通过递归的方式进行渲染,使用的是 JS 引擎自身的函数调用栈,它会一直执行到栈空为止

Fiber实现了自己的组件调用栈,它以链表的形式遍历组件树,可以灵活地暂停、继续和丢弃执行的任务。实现的方式是使用了 浏览器的requestIdleCallback这一 api。官方的解释是这样的:

window.requestIdleCallback()会在浏览器空闲时期依次调用函数,这就可以让开发者在主事件循环中执行后台优先级低的任务,而且不会像对动画和用户交互这些延迟触发产生关键的事件影响。函数一般会按先进先调用的顺序执行,除非函数在浏览器调用它之前就到了它的超时时间。

requestIdleCallback的核心用法

  • 希望快速响应用户,让用户觉得够快,不能阻塞用户的交互行为

  • requestIdleCallback 使开发者能够在主事件循环上执行后台和低优先级的工作,而不会影响延迟关键事件,例如动画和输入的响应

  • 正常帧任务完成后没超过16ms,说明时间有赋予,此时就会执行requestIdleCallback里注册的任务

Fiber是什么

Fiber是一个执行单元

Fiber 是一个执行单元,每次执行完一个执行单元, React 就会检查现在还剩多少时间,如果没有时间就将控制权让出去

Fiber是一种数据结构

React 目前的做法是使用链表, 每个 VirtualDOM 节点内部表示为一个Fiber,它可以用一个 JS 对象来表示:

const fiber = {  statenode, // 节点实例  child,     // 子节点  sibling,   // 兄弟节点  return,    // 父节点}

Fiber之前的协调阶段

  • React 会递归比对VirtualDOM树,找出需要变动的节点,然后同步更新它们。这个过程 React 称为Reconcilation(协调)

  • 在Reconcilation期间,React 会一直占用着浏览器资源,一则会导致用户触发的事件得不到响应, 二则会导致掉帧,用户可能会感觉到卡顿

let root = {  key: 'A1',  children: [    {      key: 'B1',      children: [        {          key: 'C1',          children: []        },        {          key: 'C2',          children: []        }      ]    },    {      key: 'B2',      children: []    }  ]}function walk(element) {  doWork(element);  element.children.forEach(walk);}function doWork(element) {  console.log(element.key);}walk(root);

在 Fiber 出现之前, React 会不断递归遍历虚拟 DOM 节点,占用着浏览器资源,积极地浪费性能,造成卡顿现象,且协调阶段是不能被打断的

Fiber 出现之后,通过某些 Fiber 调度策略合理分配 CPU 资源,让自己的协调阶段变成可被终端适时地让 CPU(浏览器)执行权,提高了性能优化

Fiber执行阶段

每次渲染有两个阶段:Reconciliation(协调\render阶段)和Commit(提交阶段)

  • 协调阶段: 这个阶段可以被中断, 通过Dom-Diff算法找出所有节点变更,例如节点新增删除属性变更等等, 这些变更React 称之为副作用(Effect)

  • 提交阶段: 将上一个阶段计算出来的需要处理的副作用(Effects)一次性执行了。这个阶段必须同步执行,不能被打断

简单理解的话

  • 阶段1:生成Fiber树,得出需要更新节点信息。(可打断

  • 阶段2:将需要更新的节点一次性地批量更新。(不可打断

Fiber的协调阶段,可以被优先级较高的任务(如键盘输入)打断。

阶段1可被打断的特性,让优先级更高的任务先执行,从框架层面大大降低了页面掉帧的概率。

Fiber执行流程

render阶段

Fiber Reconciliation(协调) 在阶段一进行 Diff 计算的时候,会生成一棵 Fiber 树。这棵树是在 Virtual DOM 树的基础上增加额外的信息生成来的,它本质来说是一个链表。

commit提交阶段

Fiber 树在首次渲染的时候会一次过生成。在后续需要 Diff 的时候,会根据已有树和最新 Virtual DOM 的信息,生成一棵新的树。这颗新树每生成一个新的节点,都会将控制权交回给主线程,去检查有没有优先级更高的任务需要执行。如果没有,则继续构建树的过程。

如果过程中有优先级更高的任务需要进行,则 Fiber Reconciler 会丢弃正在生成的树,在空闲的时候再重新执行一遍。

2.在构造 Fiber 树的过程中,Fiber Reconciler 会将需要更新的节点信息保存在Effect List当中,在阶段二执行的时候,会批量更新相应的节点。

细节拓展

render阶段是如何遍历,生成Fiber树的?
  • 从顶点开始遍历

  • 如果有第一个儿子,先遍历第一个儿子

  • 如果没有第一个儿子,标志着此节点遍历完成

  • 如果有弟弟遍历弟弟

  • 如果有没有下一个弟弟,返回父节点标识完成父节点遍历,如果有叔叔遍历叔叔

  • 没有父节点遍历结束

commit阶段,是如何commit的?

类比 git 分支功能,从旧树中 fork 出来一份,在新分支进行添加、删除和更新操作,经过测试后进行提交。

到此,相信大家对“怎么理解的React Fiber”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么理解的React Fiber

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么理解的React Fiber
    本篇内容主要讲解“怎么理解的React Fiber”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解的React Fiber”吧!Fiber出现的背景在早期的 React 版本中,也就是 R...
    99+
    2023-06-27
  • 详解React Fiber的工作原理
    目录啥是React Fiber? 为什么会有React Fiber? React Fiber到底怎么工作的? React Fiber的实现原理 React Fiber对我们日常开发有...
    99+
    2024-04-02
  • 详解React Fiber架构原理
    目录一、概述二、Fiber架构2.1 执行单元2.2 数据结构2.3 Fiber链表结构2.4 Fiber节点2.5 API2.5.1 requestAnimationFrame2....
    99+
    2022-11-13
    React Fiber原理 React Fiber架构
  • react fiber执行原理示例解析
    目录为什么要使用fiber,要解决什么问题fiber是什么?数据结构执行单元浏览器工作:Fiber执行原理workInProgress tree:currentFiber tree:...
    99+
    2022-11-13
    react fiber执行原理 react fiber
  • react fiber执行原理是什么
    本文小编为大家详细介绍“react fiber执行原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react fiber执行原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。为...
    99+
    2023-07-04
  • React Fiber树是怎么构建与更新的
    这篇文章主要讲解了“React Fiber树是怎么构建与更新的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React Fiber树是怎么构建与更新的”吧!为什么需要 f...
    99+
    2023-07-04
  • React Fiber构建completeWork源码解析
    目录引言一. completeUnitOfWork二. completeWorkcreateInstancecreateElementappendAllChildren三. Effe...
    99+
    2023-02-06
    React Fiber构建completeWork React Fiber
  • React Fiber的概念是什么
    这篇文章主要介绍了React Fiber的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React Fiber的概念是什么文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • react中fiber有什么用
    这篇文章给大家分享的是有关react中fiber有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Fiber是React新的调度算法,是对核心算...
    99+
    2024-04-02
  • React Fiber 链表操作及原理示例详解
    目录正文什么是FiberFiber节点React源码Fiber树是链表节点独立节省操作时间与单向操作利于双缓存与异步可中断更新操作异步可中断更新双缓存正文 看了React源码之后相信...
    99+
    2022-11-13
    React Fiber 链表操作 React Fiber
  • React Fiber结构的创建步骤
    目录React Fiber的创建 一、开始之前 二、从React.render开始 三、结束React Fiber的创建 当前React版本基于V17.0.2版本,本篇主要介绍fi...
    99+
    2024-04-02
  • React超详细讲述Fiber的使用
    目录Fiber概念结构Fiber树的遍历是这样发生的深度遍历window.requestIdleCallback()requestAnimationFrameFiber是如何工作的结...
    99+
    2023-02-08
    React Fiber原理 React Fiber优点 React Fiber
  • React Fiber 树思想解决业务实际场景详解
    目录熟悉 Fiber 树结构业务场景熟悉 Fiber 树结构 我们知道,React 从 V16 版本开始采用 Fiber 树架构来实现渲染和更新机制。 Fiber 在 React ...
    99+
    2022-12-19
    React Fiber树业务场景 React Fiber树
  • 怎么理解React hooks的渲染逻辑
    这篇文章主要介绍“怎么理解React hooks的渲染逻辑”,在日常操作中,相信很多人在怎么理解React hooks的渲染逻辑问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 怎样深入理解react
    这篇文章给大家介绍怎样深入理解react,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。理解ReactElement和ReactClass的概念首先让我们理解两个概念:ReactElem...
    99+
    2024-04-02
  • React#31的render怎么解决
    这篇文章将为大家详细讲解有关React#31的render怎么解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。卡颂日常从事基础架构相关工作。这次接到一个任...
    99+
    2024-04-02
  • React 原理详解
    目录1.setState() 说明1.1 更新数据1.2 推荐语法1.3 第二个参数2.JSX 语法的转化过程3.组件更新机制4.组件性能优化4.1 减轻 state4.2 避免不必...
    99+
    2024-04-02
  • 深入理解React Native核心原理(React Native的桥接(Bridge)
    在这篇文章之前我们假设你已经了解了React Native的基础知识,我们会重点关注当native和JavaScript进行信息交流时的内部运行原理。 主线程 在开始之前,我们需要知...
    99+
    2024-04-02
  • react怎么管理状态
    这篇文章主要介绍“react怎么管理状态”,在日常操作中,相信很多人在react怎么管理状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react怎么管理状态”的疑惑有所帮...
    99+
    2024-04-02
  • React useEffect的理解与使用
    目录避免重复循环渲染 关于副作用的清除 React16.8新增的useEffec这个hook函数就是处理副作用的。 所谓的“副作用”,举个通俗一点的例子,假如感冒了本来吃点药就没事了...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作