并发渲染(Concurrent Rendering)是React 18 的革命性架构升级,它从根本上改变了React 处理更新的方式,使应用能够同时处理多个渲染任务,并智能地确定执行顺序。
一、并发渲染的本质:可中断的渲染流水线
传统渲染模式(React 17 及之前)
- 阻塞式渲染: 一旦开始渲染,必须完成整个组件树的计算
- 无法响应高优先级事件: 渲染期间用户交互被阻塞(如输入卡顿)
- “瀑布流”问题: 父子组件顺序执行,无法并行处理
并发渲染模式(React 18)
- 可中断渲染流水线: 将渲染分解为可暂停/恢复的微任务单元
- 优先级驱动调度: 用户交互 > 动画 > 数据加载 > 预加载
- 并行任务处理: 同时处理多个更新请求
二、核心技术实现:时间切片与优先级调度
1、时间切片(Time Slicing)
// React 调度器核心伪代码
function workLoop() {
const startTime = performance.now();
while(currentTask !== null) {
if(performance.now() - startTime > 5) {
// 5ms 时间片
// 让出主线程给更高优先级任务
requestIdleCallback(workLoop);
return;
}
performUnitOfWork(currentTask);
currentTask = nextTask();
}
}
工作机制:
- 每个渲染任务被拆分为5ms 的微任务单元
- 每完成一个单元检查是否有更高优先级任务
- 通过requestIdleCallback API实现主线程协作
2、优先级模型(Lane Model)
// React 内部优先级定义
export const SyncLane: Lane = 0b0000000000000000000000000000001;
export const InputContinuousLane: Lane = 0b0000000000000000000000000000010;
export const DefaultLane: Lane = 0b0000000000000000000000000000100;
export const IdleLane: Lane = 0b1000000000000000000000000000000;
优先级规则:
1、同步优先级(SyncLane): 用户交互、动画(最高)
2、输入连续优先级(InputContinuous): 滚动、拖拽
3、默认优先级(DefaultLane): 常规状态更新
3、空闲优先级(IdleLane): 预加载、日志(最低)
调度算法:
function scheduleUpdate(fiber, lane) {
// 1.将更新放入对应优先级队列
const updateQueue = getQueueForLane(lane);
updateQueue.push(createUpdate(payload));
// 2.请求调度
if(lane === SyncLane) {
performSyncWork(); // 立即执行
} else {
scheduleCallback(
lanePriorityMap[lane],
performConcurrentWork
);
}
}
三、并发控制API:开发者接口层
1、startTransition: 非紧急更新标记
import