Skip to content

02.同步渲染

react-reconciler/src/ReactFiberSyncTaskQueue.js

js
import { DiscreteEventPriority, getCurrentUpdatePriority, setCurrentUpdatePriority } from "./ReactEventPriorities";

/** 同步队列 */
let syncQueue = null;
/** 是否正在执行同步队列 */
let isFlushingSyncQueue = false;

/**
 * 安排同步回调函数。
 * @param {Function} callback - 要调度的回调函数。
 */
export function scheduleSyncCallback(callback) {
  if (syncQueue === null) {
    syncQueue = [callback]
  } else {
    syncQueue.push(callback);
  }
}

/**
 * 执行并清空同步回调函数队列。
 * 这个函数会在同步模式下执行队列中的所有回调,并在完成后恢复之前的更新优先级。
 */
export function flushSyncCallbacks() {
  if (!isFlushingSyncQueue && syncQueue !== null) {
    isFlushingSyncQueue = true;
    let i = 0;
    /** 暂存当前的更新优先级 */
    const previousUpdatePriority = getCurrentUpdatePriority();
    try {
      const isSync = true;
      const queue = syncQueue;
      /** 把优先级设置为同步优先级 */
      setCurrentUpdatePriority(DiscreteEventPriority);
      for (; i < queue.length; i++) {
        let callback = queue[i];
        do {
          callback = callback(isSync);
        } while (callback !== null)
      }
      syncQueue = null;
    } finally {
      setCurrentUpdatePriority(previousUpdatePriority);
      isFlushingSyncQueue = false
    }
  }
}
diff
function ensureRootIsScheduled(root) {
  const nextLanes = getNextLanes(root, NoLanes);
+  if (nextLanes === NoLanes) {
+    return;
+  }
  let newCallbackPriority = getHighestPriorityLane(nextLanes);
+  let newCallbackNode;
  if (newCallbackPriority === SyncLane) {
+    scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
+    queueMicrotask(flushSyncCallbacks);
+    newCallbackNode = null;
  }
  ...
}
js
function performSyncWorkOnRoot(root) {
  const lanes = getNextLanes(root);
  renderRootSync(root, lanes);
  const finishedWork = root.current.alternate;
  root.finishedWork = finishedWork;
  commitRoot(root);
  return null;
}

基于 VitePress 构建