FiberRoot

创立 FiberRoot 和 RootFiber,应用 stateNode 和 current

function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {  var root = new FiberRootNode(containerInfo, tag, hydrate);  var uninitializedFiber = createHostRootFiber(tag);  root.current = uninitializedFiber;  uninitializedFiber.stateNode = root;  initializeUpdateQueue(uninitializedFiber);  return root;}

FiberRoot 类

function FiberRootNode(containerInfo, tag, hydrate) {  this.tag = tag;  this.containerInfo = containerInfo;  this.pendingChildren = null;  this.current = null;  this.pingCache = null;  this.finishedWork = null;  this.timeoutHandle = noTimeout;  this.context = null;  this.pendingContext = null;  this.hydrate = hydrate;  this.callbackNode = null;  this.callbackPriority = NoLanePriority;  this.eventTimes = createLaneMap(NoLanes);  this.expirationTimes = createLaneMap(NoTimestamp);  this.pendingLanes = NoLanes;  this.suspendedLanes = NoLanes;  this.pingedLanes = NoLanes;  this.expiredLanes = NoLanes;  this.mutableReadLanes = NoLanes;  this.finishedLanes = NoLanes;  this.entangledLanes = NoLanes;  this.entanglements = createLaneMap(NoLanes);  {    this.mutableSourceEagerHydrationData = null;  }  {    this.interactionThreadID = tracing.unstable_getThreadID();    this.memoizedInteractions = new Set();    this.pendingInteractionMap = new Map();  }  {    switch (tag) {      case BlockingRoot:        this._debugRootType = "createBlockingRoot()";        break;      case ConcurrentRoot:        this._debugRootType = "createRoot()";        break;      case LegacyRoot:        this._debugRootType = "createLegacyRoot()";        break;    }  }}

tag 类型

export const FunctionComponent = 0; // 函数组件export const ClassComponent = 1; // 类组件export const IndeterminateComponent = 2; // 初始化的时候不晓得是函数组件还是类组件export const HostRoot = 3; // Root Fiber 能够了解为跟元素 , 通过reactDom.render()产生的根元素export const HostPortal = 4; // 对应  ReactDOM.createPortal 产生的 Portalexport const HostComponent = 5; // dom 元素 比方 <div>export const HostText = 6; // 文本节点export const Fragment = 7; // 对应 <React.Fragment>export const Mode = 8; // 对应 <React.StrictMode>export const ContextConsumer = 9; // 对应 <Context.Consumer>export const ContextProvider = 10; // 对应 <Context.Provider>export const ForwardRef = 11; // 对应 React.ForwardRefexport const Profiler = 12; // 对应 <Profiler/ >export const SuspenseComponent = 13; // 对应 <Suspense>export const MemoComponent = 14; // 对应 React.memo 返回的组件

Fiber 类

function FiberNode(tag, pendingProps, key, mode) {  this.tag = tag;  this.key = key;  this.elementType = null;  this.type = null;  this.stateNode = null;  this.return = null;  this.child = null;  this.sibling = null;  this.index = 0;  this.ref = null;  this.pendingProps = pendingProps;  this.memoizedProps = null;  this.updateQueue = null;  this.memoizedState = null;  this.dependencies = null;  this.mode = mode;  this.flags = NoFlags;  this.nextEffect = null;  this.firstEffect = null;  this.lastEffect = null;  this.lanes = NoLanes;  this.childLanes = NoLanes;  this.alternate = null;  {    this.actualDuration = Number.NaN;    this.actualStartTime = Number.NaN;    this.selfBaseDuration = Number.NaN;    this.treeBaseDuration = Number.NaN;    this.actualDuration = 0;    this.actualStartTime = -1;    this.selfBaseDuration = 0;    this.treeBaseDuration = 0;  }  {    this._debugID = debugCounter++;    this._debugSource = null;    this._debugOwner = null;    this._debugNeedsRemount = false;    this._debugHookTypes = null;    if (!hasBadMapPolyfill && typeof Object.preventExtensions === "function") {      Object.preventExtensions(this);    }  }}

WorkInProgress 类

function createWorkInProgress(current, pendingProps) {  var workInProgress = current.alternate;  if (workInProgress === null) {    workInProgress = createFiber(      current.tag,      pendingProps,      current.key,      current.mode    );    workInProgress.elementType = current.elementType;    workInProgress.type = current.type;    workInProgress.stateNode = current.stateNode;    {      // DEV-only fields      workInProgress._debugID = current._debugID;      workInProgress._debugSource = current._debugSource;      workInProgress._debugOwner = current._debugOwner;      workInProgress._debugHookTypes = current._debugHookTypes;    }    workInProgress.alternate = current;    current.alternate = workInProgress;  } else {    workInProgress.pendingProps = pendingProps;    workInProgress.type = current.type;    workInProgress.flags = NoFlags;    workInProgress.nextEffect = null;    workInProgress.firstEffect = null;    workInProgress.lastEffect = null;    {      workInProgress.actualDuration = 0;      workInProgress.actualStartTime = -1;    }  }  workInProgress.childLanes = current.childLanes;  workInProgress.lanes = current.lanes;  workInProgress.child = current.child;  workInProgress.memoizedProps = current.memoizedProps;  workInProgress.memoizedState = current.memoizedState;  workInProgress.updateQueue = current.updateQueue;  var currentDependencies = current.dependencies;  workInProgress.dependencies =    currentDependencies === null      ? null      : {          lanes: currentDependencies.lanes,          firstContext: currentDependencies.firstContext,        };  workInProgress.sibling = current.sibling;  workInProgress.index = current.index;  workInProgress.ref = current.ref;  {    workInProgress.selfBaseDuration = current.selfBaseDuration;    workInProgress.treeBaseDuration = current.treeBaseDuration;  }  {    workInProgress._debugNeedsRemount = current._debugNeedsRemount;    switch (workInProgress.tag) {      case IndeterminateComponent:      case FunctionComponent:      case SimpleMemoComponent:        workInProgress.type = resolveFunctionForHotReloading(current.type);        break;      case ClassComponent:        workInProgress.type = resolveClassForHotReloading(current.type);        break;      case ForwardRef:        workInProgress.type = resolveForwardRefForHotReloading(current.type);        break;    }  }  return workInProgress;}