即便 React DOM 和 React Native 渲染器的区别很大,但也需要共享一些逻辑。特别是协调算法需要尽可能相似,这样可以让声明式渲染,自定义组件,state,生命周期方法和 refs 等特性,保持跨平台工作一致。
为了解决这个问题,不同的渲染器彼此共享一些代码。我们称 React 的这一部分为 “reconciler”。当处理类似于 setState()
这样的更新时,reconciler 会调用树中组件上的 render()
,然后决定是否进行挂载,更新或是卸载操作。
Reconciler 没有单独的包,因为他们暂时没有公共 API。相反,它们被如 React DOM 和 React Native 的渲染器排除在外。
Stack reconciler
“stack” reconciler 是 React 15 及更早的解决方案。
stack reconciler采用递归的方式创建虚拟DOM并提交Dom Mutation,整个过程同步并且无法中断工作或将其拆分为块。如果组件树的层级很深,递归会占用线程很多时间,递归更新时间超过了16ms,用户交互就会卡顿。
进行以下操作:
火焰图:
Fiber reconciler
“fiber” reconciler 是一个新尝试,致力于解决 stack reconciler 中固有的问题,同时解决一些历史遗留问题。
Fiber 从 React 16 开始变成了默认的 reconciler。
它的主要目标是:
-
能够把可中断的任务切片处理。
-
能够调整优先级,重置并复用任务。
-
能够在父元素与子元素之间交错处理,以支持 React 中的布局。
-
能够在
render()
中返回多个元素。 -
更好地支持错误边界。
进行以下操作:
火焰图: