热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【React】ReactFiber

本文主要分享【reaCT】,技术文章【【React】ReactFiber】为【嘻嘻的妙妙屋】投稿,如果你遇到前端相关问题,本文相关知识或能到你。reaCTReactFiber自从reac

本文主要分享【reaCT】,技术文章【【React】React Fiber】为【嘻嘻的妙妙屋】投稿,如果你遇到前端相关问题,本文相关知识或能到你。

reaCT

React Fiber

自从 react 从15版更新到16版后,虽然使用上差别不会很大也提供了一定的兼容性,但是 react 的底层架构确有了很大的变化。React Fiber横空出世…

在了解 Fiber 之前,我们先了解几个概念,以及为什么需要引入 Fiber。

Reconciliation (协调)

Reconciliation 是 React 的协调算法的高级描述。

Reconciliation 是被普遍理解为“虚拟 DOM”的算法。当你渲染一个 React 应用程序时,一个描述应用程序的节点树被生成并保存在内存中。然后将该树刷新到渲染环境——例如,在浏览器应用程序的情况下,它被转换为一组 DOM 操作。当应用程序更新时(通常通过setState),会生成一棵新树。新树与之前的树进行比较,以计算更新渲染应用程序所需的操作。

Scheduling (调度)

可以理解为:确定什么时候应该执行某段代码。

调度核心理念便是:我们可以随心所欲的控制我们的代码。

React 目前没有很大程度的利用调度,所以才会引入Fiber。

Fiber

我们已经确定 Fiber 的主要目标是使 React 能够利用调度。

具体来说,我们需要能够:

暂停工作,稍后再回来。为不同类型的工作分配优先级。重用之前完成的工作。如果不再需要,则中止工作。

为了做到这一点,我们首先需要一种将工作分解为单元的方法。从某种意义上说,这就是Fiber。

一个 Fiber 代表一个工作单元。


React15 最大的问题就是 Reconciler(协调)阶段产生产生虚拟DOM是通过深度优先递归的,并且中途不可间断。所以假如虚拟DOM很深的话,由于 JS 线程和浏览器 GUI 线程是互斥的,处理 js 的时间过长,会导致浏览器刷新的时候掉帧,造成卡顿。而 React16 则实现了异步的可中断的更新。

那么 Fiber 到底是个啥?其实 Fiber 怎么说都可以…Fiber可以理解为一种架构,Fiber也可以理解为一种数据结构,也可以是常说的最小的工作单元。

常说的 Fiber 树就是将 Fiber 当作一种架构来看待的,Fiber怎么连接成树呢?三个关键的属性:

// 指向父级Fiber节点
this.return = null;
// 指向子Fiber节点
this.child = null;
// 指向右边第一个兄弟Fiber节点
this.sibling = null;

所以在 react16 里面,一个组件对应的就是一棵 Fiber 树。那更新的时候,Fiber 这棵树有什么作用呢?react16 里面有一个很有意思的技术解答了——“双缓存技术”。

双缓存简单来说就是,在 React 里面最多同时存在两棵 Fiber 树,都在内存中构建,构建完成后直接替换。在源码里面,当前屏幕上显示内容对应的 Fiber 树称为 current fiber 树,正在内存中构建的 Fiber 树称为 workInProgress fiber 树。两棵树之间通过 alternate 属性连接。

currentFiber.alternate === workInProgressFiber;
workInProgressFiber.alternate === currentFiber;


上图中,rootFiber 是 react 应用,footFiberNode 是应用挂在的节点,current 指向的 fiber 是渲染在页面中的 fiber (即出现在屏幕中的视图),我们称它为 current fiber, current fiber 的每一个 fiber 节点都有一个 alternode 指向另一个棵树的相同 fiber 节点,我们称这个 fiber 为 workInProgress fiber。
  我们知道,当 react v16 前的版本更新时,会进行 jsx 和虚拟 dom 树进行 diff 算法,计算结果就是最终需要更新的视图。而在 react v16 diff 算法是将 jsx 和 workInProgress fiber 进行计算,最终得出最终视图,然后将 current 指针指向 workInProgress fiber,渲染新的视图。跟 workInProgress fiber 进行 diff 算法是在内存中进行的,即使被中断也对现有视图不产生影响。

那么 Fiber 和 React 里面重要的一个概念 JSX 有什么区别和联系呢?

简单来说,JSX 就是 html+js,由于和 UI 的本质形式很相似,所以这理解起来也很轻松。而通过 JSX 创建的组件就是 React15 里面的虚拟 DOM,实质上虚拟 DOM 是由 React.createElement 这个函数创建的。其中就要用到 babel 转译器了。

Babel 转译 JSX 的过程简要:

Babel 通过 parse() 函数将 JSX 解析成 AST 抽象语法树,一种树状的形式表现编程语言的语法结构。

依据解析的 AST,再通过 Babel 的 transform() 函数生成 React.createElement() 代码
再来看 React.createElement() 创建返回的 JSX 数据结构。

  return ReactElement(
    type,
    key,
    ref,
    self,
    source,
    ReactCurrentOwner.current,
    props,
  );
}

所以,由此可以看见,一个组件的JSX和Fiber节点的数据结构不同。组件在 mount 时,根据 JSX 来创建对应的 Fiber 节点。

扩展

通过上文我们知道了,react 是通过双缓存技术来实现可中断的更新,那么为什么不用原本的架构(虚拟 dom)来做双缓存呢?

以下两点最为关键:

fiber 是典型以空间换时间,提高运行效率;fiber 的出现是实现 function component 及 hook(state数据持久化)的关键;

参考文献:

React Fiber 是什么浅谈 React 里面的 Fiberreact fiber 概念及原理

本文《【React】React Fiber》版权归嘻嘻的妙妙屋所有,引用【React】React Fiber需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 只能输入数字的TextBox
    只能接受数字1usingSystem;2usingSystem.Text;3usingSystem.Web;4usingSystem.Web.UI;5usingSystem.Web ... [详细]
  • Vue生产环境调试的方法步骤
    开发环境下Vue会提供很多警告来帮你对付常见的错误与陷阱,而在生产环境下,这些警告语句却没有用,反而会增加应用的体积,下面这篇文章主要给大家介绍了关于Vue生产环境调试的方法步骤, ... [详细]
  • One Stage目标检测
    在计算机视觉中,目标检测是一个难题。在大型项目中,首先需要先进行目标检测,得到对应类别和坐标后,才进行之后的各种分析。如人脸识别,通常是首先人脸检测,得到人脸的目标框,再对此目标框 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • JS动态生成表格案例 ... [详细]
  • 如何用js 实现依赖注入的思想,后端框架思想搬到前端来
    如何用js实现依赖注入的思想,后端框架思想搬到前端来-大家在做些页面的时候,很多都是用ajax实现的,在显示的时候有很多表单提交的add或者update操作,显然这样很烦,突然想到 ... [详细]
  • jquery popupDialog 使用 加载jsp页面办法
    php教程|PHP开发jqueryphp教程-PHP开发如下所示:软件市场源码,vsCode字体不变,ubuntu的所有版本,taotomcat,sqlite连接php,个人域名服 ... [详细]
  • domain.js代码如下 ... [详细]
  • 文本生成图像简要回顾 text to image synthesis
    摘要       文本生成图像作为近几年的热门研究领域,其解决的问题是从一句描述性文本生成与之对应的图片。近一周来,我通过阅读了近几年发表于顶会的近10篇论文,做出本文中对该方向的 ... [详细]
  • iOS Auto Layout Demystify
    BookDescripterAutoLayouttransformsthewayyoucreateiOSuserinterfaces.Asflexibleasitispowerfu ... [详细]
  • DNNBrain:北师大团队出品,国内首款用于映射深层神经网络到大脑的统一工具箱...
    导读深度神经网络(DNN)通过端到端的深度学习策略在许多具有挑战性的任务上达到了人类水平的性能。深度学习产生了具有多层抽象层次的数据表示;然而,它没有明确地提供任何关 ... [详细]
  • 系数|量纲_机器学习基础一文带你用sklearn做特征工程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了机器学习基础一文带你用sklearn做特征工程相关的知识,希望对你有一定的参考价值。使用sklearn做特 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
author-avatar
舅舅家123_204
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有