之前fiber那边说过,当我们第一次创建完了整个应用的根节点(fiberRootNode的时候,我们就进入首屏渲染的阶段)
通过sheduleUpdateOnFiber去调度更新,调度成功之后会走performSyncWorkOnRoot,也就是说从根节点开始执行这次的更新。
这时候也肯定是没有一个workInProgress的fiber tree的,所以从根节点出发,去触发更新(第一次构建tree)操作

协调器工作主要是入口是 workSyncLoop,递阶段开始于某个fiber其beginWork,归阶段则是调用completeWork
这里我们说一下协调器的工作,渲染器后面讲(渲染器这里我们只要知道它是将变化的节点渲染到视图上,所以分为渲染到视图-之前-中-之后)

因此协调器工作开始到结束,我们称呼为
render阶段,渲染器开始到结束,称呼为
commit阶段整个流程就是首屏渲染了
render阶段
流程概览
首先我们先看调用栈里头render阶段是从哪里开始的呢?
[Image missing: image-20210822181130206]
render阶段开始于performSyncWorkOnRoot或performConcurrentWorkOnRoot方法的调用。这取决于本次更新是同步更新还是异步更新。
之后调用workSyncLoop或者workLoopConcurrent
// performSyncWorkOnRoot会调用该方法function workLoopSync() { while (workInProgress !== null) { performUnitOfWork(workInProgress); }}
// performConcurrentWorkOnRoot会调用该方法function workLoopConcurrent() { while (workInProgress !== null && !shouldYield()) { performUnitOfWork(workInProgress); }}上面所说的workInProgress tree构建的过程从这里正式开始
代码中的workInProgress 代表的是当前已经创建的workInProgress Fiber
performUnitOfWork方法会创建下一个Fiber节点并赋值给workInProgress,并将workInProgress与已创建的Fiber节点连接起来构成Fiber树。
我们知道Fiber Reconciler是从Stack Reconciler重构而来,通过遍历的方式实现可中断的递归
所以具体我们看看performUnitOfWork的工作可以分为两部分:“递”和“归”。
”递“阶段
首先从rootFiber开始向下深度优先遍历。为遍历到的每个Fiber节点调用beginWork方法
该方法会根据传入的Fiber节点创建子Fiber节点,并将这两个Fiber节点连接起来。
当遍历到叶子节点(即没有子组件的组件)时就会进入“归”阶段。
“归”阶段
在“归”阶段会调用completeWork处理Fiber节点。
当某个Fiber节点执行完completeWork,如果其存在兄弟Fiber节点(即fiber.sibling !== null),会进入其兄弟Fiber的“递”阶段。
如果不存在兄弟Fiber,会进入父级Fiber的“归”阶段。
“递”和“归”阶段会交错执行直到“归”到rootFiber。至此,render阶段的工作就结束了。
总结
总体来说递归阶段是下面这段伪代码描述的一样
function performUnitOfWork(fiber) { // 执行beginWork
if (fiber.child) { performUnitOfWork(fiber.child); }
// 执行completeWork
if (fiber.sibling) { performUnitOfWork(fiber.sibling); }}根据Fiber的那一讲解咱们可以知道,我们的react中可以最多存在两棵fiber树,一个是workInProgress一个是current,咱们在首次mount的时候是,是没有current的,只是在内存中通过整个应用的根fiberRootNode去构建workinprogess tree
之后update的时候是存在current的tree的
所以这两个阶段的“递”和“归”流程是各不一样的
因此我们接下来按照 mount 和update触发去解释“递归”