任务调度
scheduleWork
找到更新对应的 FiberRoot 节点
如果符合条件重置 stack
如果符合条件就请求工作调度
1 | function scheduleWork( |
scheduleWorkToRoot
1 | function scheduleWorkToRoot(fiber: Fiber, expirationTime): FiberRoot | null {//根据传入的fiber节点找到rootFiber对象 |
resetStack
1 | function resetStack() { |
requestWork
- 加入到 root 调度队列
- 判断是否批量更新
- 根据 expirationTime 判断调度类型
1 | function requestWork(root: FiberRoot, expirationTime: ExpirationTime) { |
addRootToSchedule
1 | function addRootToSchedule(root: FiberRoot, expirationTime: ExpirationTime) { |
batchedUpdates
1 | function batchedUpdates<A, R>(fn: (a: A) => R, a: A): R { |
React Scheduler
- 维护时间片
- 模拟 requestIdelCallback(requestIdelCallback 优先级比 requestAinimationFrame 低)
- 调度列表和超时判断
performWork
- 是否有 deadline 的区别
- 循环渲染 Root 的条件
- 超过时间片的处理
1 | function performAsyncWork() { |
performWorkOnRoot
1 | function performWorkOnRoot( |
renderRoot
- 调用 workLoop 进行循环单元更新
- 捕获错误并进行处理
1 | function renderRoot(root: FiberRoot, isYieldy: boolean): void { |
workLoop
1 | function workLoop(isYieldy) { |
performUnitOfWork
1 | function performUnitOfWork(workInProgress: Fiber): Fiber | null { |
beginWork
1 | function beginWork( |
bailoutOnAlreadyFinishedWork
1 | function bailoutOnAlreadyFinishedWork( |
mountChildFibers 和 reconcileChildFibers
1 | var reconcileChildFibers = ChildReconciler(true); |
updateSlot
1 | function updateSlot(returnFiber, oldFiber, newChild, expirationTime) { |
updateClassComponent
1 | function updateClassComponent( |