Skip to content

03.ReactFiberLane与ReactEventPriority.md

react-reconciler/src/ReactEventPriorities.js

js
import {
  NoLane, SyncLane, InputContinuousLane, DefaultLane, IdleLane,
  getHighestPriorityLane, includesNonIdleWork
} from './ReactFiberLane';

/** 离散事件优先级,与SyncLane相关联 */
export const DiscreteEventPriority = SyncLane;
/** 连续事件优先级,与InputContinuousLane相关联 */
export const ContinuousEventPriority = InputContinuousLane;
/** 默认事件优先级,与DefaultLane相关联 */
export const DefaultEventPriority = DefaultLane;
/** 空闲事件优先级,与IdleLane相关联 */
export const IdleEventPriority = IdleLane;

/** 当前更新优先级值 */
let currentUpdatePriority = NoLane;

/**
 * 获取当前更新优先级。
 * @returns {number} 当前更新优先级。
 */
export function getCurrentUpdatePriority() {
  return currentUpdatePriority;
}

/**
 * 设置当前更新优先级。
 * @param {number} newPriority - 要设置的新优先级。
 */
export function setCurrentUpdatePriority(newPriority) {
  currentUpdatePriority = newPriority;
}

/**
 * 判断事件优先级是否高于(数值更小)车道。
 * @param {number} eventPriority - 要比较的事件优先级。
 * @param {number} lane - 要与之比较的车道值。
 * @returns {boolean} 如果事件优先级更高则返回真;否则返回假。
 */
export function isHigherEventPriority(eventPriority, lane) {
  return (eventPriority !== 0) && eventPriority < lane;
}

/**
 * 将车道转换为事件优先级。
 * @param {number} lanes - 车道值。
 * @returns {number} 与车道相对应的事件优先级。
 */
export function lanesToEventPriority(lanes) {
  let lane = getHighestPriorityLane(lanes);
  if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
    return DiscreteEventPriority;
  }
  if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
    return ContinuousEventPriority;
  }
  if (includesNonIdleWork(lane)) {
    return DefaultEventPriority;
  }
  return IdleEventPriority;
}

react-reconciler/src/ReactFiberLane.js

js
import { allowConcurrentByDefault } from 'shared/ReactFeatureFlags';

/** 总车道数量 */
export const TotalLanes = 31;
/** 无车道 */
export const NoLanes = 0b0000000000000000000000000000000;
/** 无车道 */
export const NoLane = 0b0000000000000000000000000000000;
/** 同步车道 */
export const SyncLane = 0b0000000000000000000000000000001;
/** 输入连续水合车道 */
export const InputContinuousHydrationLane = 0b0000000000000000000000000000010;
/** 输入连续车道 */
export const InputContinuousLane = 0b0000000000000000000000000000100;
/** 默认水合车道 */
export const DefaultHydrationLane = 0b0000000000000000000000000001000;
/** 默认车道 */
export const DefaultLane = 0b0000000000000000000000000010000;
/** 选择性水合车道 */
export const SelectiveHydrationLane = 0b0001000000000000000000000000000;
/** 空闲水合车道 */
export const IdleHydrationLane = 0b0010000000000000000000000000000;
/** 空闲车道 */
export const IdleLane = 0b0100000000000000000000000000000;
/** 屏幕外车道 */
export const OffscreenLane = 0b1000000000000000000000000000000;
/** 非空闲车道 */
const NonIdleLanes = 0b0001111111111111111111111111111;

/**
 * 标记根节点更新
 * @param {object} root - 根节点
 * @param {number} updateLane - 更新的车道
 */
export function markRootUpdated(root, updateLane) {
  root.pendingLanes |= updateLane;
}

/**
 * 获取下一个车道
 * @param {object} root - 根节点
 * @returns {number} 下一个车道
 */
export function getNextLanes(root) {
  const pendingLanes = root.pendingLanes;
  if (pendingLanes == NoLanes) {
    return NoLanes;
  }
  const nextLanes = getHighestPriorityLanes(pendingLanes);
  return nextLanes;
}

/**
 * 获取最高优先级的车道
 * @param {number} lanes - 车道
 * @returns {number} 最高优先级的车道
 */
export function getHighestPriorityLanes(lanes) {
  return getHighestPriorityLane(lanes);
}

/**
 * 获取最高优先级的车道
 * @param {number} lanes - 车道
 * @returns {number} 最高优先级的车道
 */
export function getHighestPriorityLane(lanes) {
  return lanes & -lanes;
}

/**
 * 包括非空闲工作
 * @param {number} lanes - 车道
 * @returns {boolean} 如果包括非空闲工作则返回真
 */
export function includesNonIdleWork(lanes) {
  return (lanes & NonIdleLanes) !== NoLanes;
}

/**
 * 是否为车道的子集
 * @param {number} set - 集合
 * @param {number} subset - 子集
 * @returns {boolean} 如果是子集则返回真
 */
export function isSubsetOfLanes(set, subset) {
  return (set & subset) === subset;
}

/**
 * 合并车道
 * @param {number} a - 车道a
 * @param {number} b - 车道b
 * @returns {number} 合并后的车道
 */
export function mergeLanes(a, b) {
  return a | b;
}

/**
 * 包括阻塞车道
 * @param {object} root - 根节点
 * @param {number} lanes - 车道
 * @returns {boolean} 如果包括阻塞车道则返回假
 */
export function includesBlockingLane(root, lanes) {
  if (allowConcurrentByDefault) {
    return false;
  }
  const SyncDefaultLanes = InputContinuousLane | DefaultLane;
  return (lanes & SyncDefaultLanes) !== NoLane;
}

shared/ReactFeatureFlags.js

js
export const allowConcurrentByDefault = true;

基于 VitePress 构建