当前位置: 首页 > news >正文

(二)fiber的基本认识

上一篇文章我们了解了react新老结构的差异以及存在的缺点,其中react的解决方案就是采用fiber架构和添加Schedule模块。

✍️:Schedule模块的主要工作是任务的调度,负责调度不同优先级任务的执行时机,这个我们后面再讲,这里我们先带大家了解认识一下fiber架构

一、前文回顾

上一篇文章我们说到,fiber主要是为了解决构建虚拟DOM过程中无法中断的问题,同时fiber还解决了旧架构递归更新时产生的性能问题。

二、JSX

在了解fiber之前,我们先来认识一个跟fiber有关联的知识,就是JSX,如果你使用过react,那么你肯定使用过JSX这种数据结构,JSX可以让我们以近乎编写JS原生的方式进行编码,而JSX对象会经过babel转换reactElement这种数据结构,最终通过这种数据结构,生成fiber节点,所以他们两个之间的关系就是:JSX -> fiber,也可以理解成JSX 驱动 fiber

转换结果

其中key就是我们常用的key属性,props就是我们传入的一些参数,比如经常传递给组件的props,当然如果有子节点的话,那么子节点也会在这个props对象中,key为children。

三、fiber的结构

了解完JSX和fiber的关系后,我们接着来了解一下fiber的具体结构。fiber是react对VDOM的一个实现,其实fiber就是一个JS中的对象,但是这个对象中存在着许多的属性。

了解完大概的结构之后我们来了解一下fiber的含义,这里引用React技术揭秘中的一段解释

Fiber包含三层含义:

1.作为架构来说,之前React15Reconciler采用递归的方式执行,数据保存在递归调用栈中,所以被称为stack ReconcilerReact16Reconciler基于Fiber节点实现,被称为Fiber Reconciler
2.作为静态的数据结构来说,每个Fiber节点对应一个React element,保存了该组件的类型(函数组件/类组件/原生组件…)、对应的DOM节点等信息。
3.作为动态的工作单元来说,每个Fiber节点保存了本次更新中该组件改变的状态、要执行的工作(需要被删除/被插入页面中/被更新…)。

四、fiber解决的问题

我们开头说到了,fiber可以解决旧架构存在的性能问题,那么fiber是如何解决的呢?

🙁:我们知道之前的更新是通过递归同步的方式进行更新,也就是说如果有一个地方发生了变化,就会通知渲染器操作DOM节点进行更新,这样就会存在频繁的操作DOM的过程。

😊:而fiber除了支持异步中断更新之外,还更换了一种更新的方式,也就是双缓存更新机制,大概可以理解为react内部会维护两棵树,一颗是当前页面上存在的树,一颗是发生更新时内存中构建的树,通过指针切换两颗树,从而改变页面上的UI状态,这就是fiber的双缓存机制,也就是fiber的工作机制这两棵树都是由fiber节点连接形成的树,也可以称为fiber树。

通过这种机制,我们可以不用频繁的去执行DOM操作,我们可以将更新时需要发生变化的地方打上标签,当内存中这颗树构建完成时,我们就可以拿到一颗完整的fiber树,这颗树中记录着需要发生变化的节点,然后统一提交给渲染器一并渲染。

五、总结

这一篇我们大概了解了JSX与fiber的关系fiber的整体结构以及从宏观的角度了解了fiber的工作机制,下一篇文章我们会从源码的角度来理解fiber节点的创建过程,是如果通过JSX对象最后生成为fiber节点的,敬请期待!🥸

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

相关文章:

  • Mycat(10):分片详解之固定分片hash算法
  • 【Vue】Vue项目打包上线流程--20221219
  • 关于使用PIL库对tif图像进行尺寸裁剪所遇到的问题
  • 在英特尔独立显卡上部署YOLOv5 v7.0版实时实例分割模型
  • 什么是闭包,Python闭包(初学者必读)
  • SpringBoot+Actuator+Prometheus+Grafana进行可视化应用监控
  • C/C++ Qt QThread 线程组件应用
  • 关于小程序订单中心页设置的公告
  • 基于Python + Requests 的Web接口自动化测试框架
  • sed命令详解及demo
  • Allegro关闭线段显示不连续效果操作指导
  • 【408篇】C语言笔记-第十五章( 考研必会的查找算法考研真题实战)
  • 【排序】详细聊聊归并排序(含非递归)
  • kafka单条消息过大导致线上OOM,运维连夜跑路了!
  • ValidateCode验证码的使用详解(初学看完都会用)
  • [译]前端离线指南(上)
  • Android Volley源码解析
  • django开发-定时任务的使用
  • ES6语法详解(一)
  • Java读取Properties文件的六种方法
  • jquery cookie
  • js操作时间(持续更新)
  • js学习笔记
  • mac修复ab及siege安装
  • mysql中InnoDB引擎中页的概念
  • ng6--错误信息小结(持续更新)
  • nginx 负载服务器优化
  • PHP变量
  • Python_网络编程
  • React as a UI Runtime(五、列表)
  • Spark学习笔记之相关记录
  • SSH 免密登录
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 码农张的Bug人生 - 见面之礼
  • 你不可错过的前端面试题(一)
  • 如何合理的规划jvm性能调优
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 线上 python http server profile 实践
  • 移动端唤起键盘时取消position:fixed定位
  • 智能合约Solidity教程-事件和日志(一)
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #DBA杂记1
  • #大学#套接字
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)STL算法之遍历容器
  • (AngularJS)Angular 控制器之间通信初探
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (多级缓存)缓存同步
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)JPA - JQPL 实现增删改查
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .net core 连接数据库,通过数据库生成Modell