疑问
- fiber是什么?
- 是React16以后的虚拟DOM
- 是可中断状态更新机制的核心
- React16的改动
- 添加了Scheduler调度器
- 改写了原本一口气递归的协调器,改为了基于fiber的可中断的协调器
- JSX和Fiber节点是同一个东西么?
React Component、React Element是同一个东西么,他们和JSX有什么关系?
书摘&心得
-
1 前置知识
1.1 React15
架构可以分为两层:
- Reconciler(协调器)—— 负责找出变化的组件
- 转换虚拟DOM、对比、更新、渲染
- 数据保存在递归调用栈中,所以被称为stack Reconciler
- Renderer(渲染器)—— 负责将变化的组件渲染到页面
- React支持跨平台,所以不同平台有不同的Renderer
- 浏览器环境渲染的Renderer —— ReactDOM
- React支持跨平台,所以不同平台有不同的Renderer
- Reconciler(协调器)—— 负责找出变化的组件
缺点
在15的基础上,新增了Scheduler(调度器)
React Fiber可以理解为:
- React内部实现的一套状态更新机制。
- 支持任务不同优先级,可中断与恢复,并且恢复后可以复用之前的中间状态。
-
1.3.1 fiber的角色
【作为架构】
每个Fiber节点有个对应的React element,多个Fiber节点是如何连接形成树呢?靠如下三个属性:// 指向父级Fiber节点
this.return = null;
// 指向子Fiber节点
this.child = null;
// 指向右边第一个兄弟Fiber节点
this.sibling = null;
【作为静态的数据结构】
每个Fiber节点对应一个React element,保存了该组件的类型(函数组件/类组件/原生组件…)、对应的DOM节点等信息。
// Fiber对应组件的类型 Function/Class/Host...
this.tag = tag;
// key属性
this.key = key;
// 大部分情况同type,某些情况不同,比如FunctionComponent使用React.memo包裹
this.elementType = null;
// 对于 FunctionComponent,指函数本身,对于ClassComponent,指class,对于HostComponent,指DOM节点tagName
this.type = null;
// Fiber对应的真实DOM节点
this.stateNode = null;
【作为动态的工作单元】
每个Fiber节点保存了本次更新中该组件改变的状态、要执行的工作(需要被删除/被插入页面中/被更新…)
1.3.2 fiber的双缓存
在内存中构建并直接替换的技术叫做双缓存
- 当前屏幕上显示内容对应的Fiber树称为current Fiber树,正在内存中构建的Fiber树称为workInProgress Fiber树。
-
1.4 深入理解JSX
JSX在编译时会被Babel编译为React.createElement方法
- 这也是为什么在每个使用JSX的JS文件中,你必须显式的声明
- 但是React17无需这么做,转化函数改为从React的package中引入新入口函数调用,由编译器使用
- 与React Element
- 所有JSX在运行时的返回结果(即React.createElement()的返回值)都是React Element。
- 与React Component
- React Component是一种React Element,可以通过type区分
- 与fiber