React短文系列 遍历fiber树 App的创建

从createRoot到App节点的创建

createRoot->renderRootSync->prepareFreshStack->workLoopSync->HostRoot:updateHostRoot->reconcileChildren创建节点:FiberRootNode->HostRootFiber->App

  1. createRoot->renderRootSync->prepareFreshStack(root,lanes) 这一步创建出了FiberRootNodeHostRootFiber节点。

    a. createRoot创建了FiberRootNode

    b. prepareFreshStack根据FiberRootNode创建HostRootFiber

    c. HostRootFiberHostRootFiberNode,对应<div id="root"></div>

    d. rootFiberRootNode,root.currentHostRootFiber,复制一份赋值给rootWorkInProgress是第一个workInProgress

  2. workLoopSync->beginWork->HostRoot:updateHostRoot(current,workInProgress,)->reconcileChildren 马上进入到了workLoopSync创建出App

    a. currentwip是上面的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);
  }
}

一些特点

  1. fiberRootNode tag=1,HostRootNode tag=3,App tag=2
  2. current节点current树当前遍历到的节点,workInProgress节点workInProgress树当前遍历到的节点。
  3. current节点wip节点通过alternate相互指向。第一次渲染,HostRootFibercurrent节点不是空的,但是App节点current节点是空的null

通常不画null,如图左所示。

  1. 创建完wip树后切换current树,图3
相关推荐
Deng9452013146 分钟前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
威迪斯特9 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
wuhen_n35 分钟前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
大鱼前端37 分钟前
为什么我说CSS-in-JS是前端“最佳”的糟粕设计?
前端
不爱吃糖的程序媛39 分钟前
Capacitor:跨平台Web原生应用开发利器,现已全面适配鸿蒙
前端·华为·harmonyos
AC赳赳老秦42 分钟前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
CHU72903543 分钟前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序
-凌凌漆-1 小时前
【npm】npm的-D选项介绍
前端·npm·node.js
鹿心肺语1 小时前
前端HTML转PDF的两种主流方案深度解析
前端·javascript
海石2 小时前
去到比北方更北的地方—2025年终总结
前端·ai编程·年终总结