从createRoot到App节点的创建
createRoot->renderRootSync->prepareFreshStack->workLoopSync->HostRoot:updateHostRoot->reconcileChildren
创建节点:FiberRootNode->HostRootFiber->App
。
-
createRoot->renderRootSync->prepareFreshStack(root,lanes)
这一步创建出了FiberRootNode
和HostRootFiber
节点。a.
createRoot
创建了FiberRootNode
b.
prepareFreshStack
根据FiberRootNode
创建HostRootFiber
。c.
HostRootFiber
是HostRoot
的FiberNode
,对应<div id="root"></div>
d.
root
是FiberRootNode
,root.current
是HostRootFiber
,复制一份赋值给rootWorkInProgress
是第一个workInProgress
。 -
workLoopSync->beginWork->HostRoot:updateHostRoot(current,workInProgress,)->reconcileChildren
马上进入到了workLoopSync
创建出App
a.
current
和wip
是上面的HostRootFiber
。b. 进入到
reconcileChildren
,创建HostRootFiber
的子节点App
。
js
createRoot-renderRootSync:
// root是fiberRootNode, tag=1
prepareFreshStack(root, lanes) //这一步创建tag=3,HostRoot,HostRootFiber,rootElement 的wip
do {
try {
workLoopSync(); //这一步创建tag=3的子fiber,因为进入到beginWork-updateHostRoot-reconcileChildren
break;
} catch (thrownValue) {
handleError(root, thrownValue);
}
} while (true);
prepareFreshStack:
var rootWorkInProgress = createWorkInProgress(root.current, null);
return rootWorkInProgress; // tag=3
createWorkInProgress:
workInProgress.alternate = current; //创建tag=3的cur的wip
current.alternate = workInProgress;
workLoopSync-beginWork:
case HostRoot:
return updateHostRoot(current, workInProgress, renderLanes);
updateHostRoot:
reconcileChildren(current, workInProgress, nextChildren, renderLanes);
reconcileChildren:
if (current === null) {
// 2.然后遍历到App节点进入这里创建App节点的子节点
workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
} else {
// 1.首先HostRootFiber进入这里创建子节点App节点
workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes);
}
}
一些特点
fiberRootNode tag=1,HostRootNode tag=3,App tag=2
current节点
是current树
当前遍历到的节点,workInProgress节点
是workInProgress树
当前遍历到的节点。current节点
和wip节点
通过alternate
相互指向。第一次渲染,HostRootFiber
的current节点
不是空的,但是App节点
的current节点
是空的null
。

通常不画
null
,如图左所示。
- 创建完wip树后切换current树,图3