前端

漫游 React 源码 - 03 - Diff 算法简述 和 优先级

React 的 Diff 算法基于2个假设:

  1. 不同类型的元素会产生不同的树。

    • 首先检查根元素。如果根元素具有不同类型,React 将卸载旧树并从头开始构建新树。
    • 如果根元素是相同类型,React 将仅更新已更改的属性。
  2. 开发人员可以使用 key 属性提示哪些子元素可能在不同的渲染中保持稳定。使用键,React 可以更高效地重新排序、重复使用和重新渲染 dom 节点。

    • 对于子元素列表,React 使用 key 属性来匹配旧树和新树中的子元素。

Lane 优先级

React 使用 Lane 模型来管理任务的优先级。每个任务都有一个优先级,React 根据任务的优先级来决定任务的执行顺序。 通过查看源码,来一瞥优先级的类型。

export function getLabelForLane(lane: Lane): string | void { if (enableSchedulingProfiler) { if (lane & SyncHydrationLane) { return 'SyncHydrationLane'; } if (lane & SyncLane) { return 'Sync'; } if (lane & InputContinuousHydrationLane) { return 'InputContinuousHydration'; } if (lane & InputContinuousLane) { return 'InputContinuous'; } if (lane & DefaultHydrationLane) { return 'DefaultHydration'; } if (lane & DefaultLane) { return 'Default'; } if (lane & TransitionHydrationLane) { return 'TransitionHydration'; } if (lane & TransitionLanes) { return 'Transition'; } if (lane & RetryLanes) { return 'Retry'; } if (lane & SelectiveHydrationLane) { return 'SelectiveHydration'; } if (lane & IdleHydrationLane) { return 'IdleHydration'; } if (lane & IdleLane) { return 'Idle'; } if (lane & OffscreenLane) { return 'Offscreen'; } if (lane & DeferredLane) { return 'Deferred'; } } }
  • SyncLane: 用于高优先级的同步任务,比如用户交互。
  • InputContinuousLane: 用于用户连续输入。
  • DefaultLane: 用于默认优先级的任务。
  • TransitionLanes: 用于过渡任务(低优先级任务,如 UI 过渡效果)。
  • RetryLanes: 用于重试任务,比如 Suspense 中的任务重试。
  • IdleHydrationLane: 用于空闲时的水合任务。
  • IdleLane: 用于空闲时执行的低优先级任务。
  • OffscreenLane: 用于处理 Offscreen 任务。
  • DeferredLane: 用于延迟处理的任务。
Previous
React - 漫游源码2