

本文从问题与目标、核心数据结构、调度与中断、渲染阶段与提交阶段、优先级与 lanes、并发特性到常见误区与优化建议,全景式拆解 React Fiber,为何它能够显著降低交互卡顿并提升可响应性。
useTransition、Suspense、选择性水合都建立在 Fiber 能力之上每个 Fiber 对应一次渲染过程中的“工作单元”,以链表树结构组织:
type Lane = number
interface Fiber {
tag: number
key: null | string
type: any
stateNode: any
return: Fiber | null
child: Fiber | null
sibling: Fiber | null
alternate: Fiber | null
lanes: Lane
flags: number
memoizedProps: any
memoizedState: any
updateQueue: any
}child 与 sibling:链式树遍历更适合增量执行alternate:当前树与待提交的工作树双缓冲切换lanes 与 flags:控制优先级与记录副作用let workInProgress: Fiber | null = null
function shouldYield() {
return performance.now() >= deadline
}
function workLoop() {
while (workInProgress && !shouldYield()) {
workInProgress = performUnitOfWork(workInProgress)
}
if (workInProgress) scheduleNextTick(workLoop)
}shouldYield 在每个单元之间检查是否需要让渡控制权useTransition 与 startTransition:将更新标记为非紧急,排在紧急交互之后Suspense:在资源未就绪时挂起某些子树,避免阻塞页面可交互区域useDeferredValue:推迟昂贵的派生计算以保证输入响应速度function performUnitOfWork(fiber: Fiber): Fiber | null {
beginWork(fiber)
if (fiber.child) return fiber.child
let node: Fiber | null = fiber
while (node) {
completeWork(node)
if (node.sibling) return node.sibling
node = node.return
}
return null
}beginWork 生成子节点与比较 propscompleteWork 构建副作用列表与准备提交信息Suspense 显示骨架屏并保持交互域可用useTransition 或批处理分离紧急与非紧急更新Fiber 的核心价值是以可中断、可恢复的增量执行模型替代不可分割的同步渲染。它结合优先级与时间片调度,将紧急交互放在首位,并通过分阶段提交降低 DOM 变更的集中冲击。理解 Fiber 的数据结构、工作循环与并发特性,有助于在真实项目中系统性地治理卡顿问题并提升整体可响应性。
current 指向已提交的树;workInProgress 是正在构建的工作树,二者通过 alternate 互为镜像flags)记录节点的变更类型(Placement/Update/Deletion 等)workInProgress 继续shouldComponentUpdate/React.memo 判定无需更新,则跳过子树计算Suspense 对未就绪数据的子树进行挂起,数据可用后再重试该子树Suspense 将依赖资源的子树挂起,用占位/骨架提升感知速度,避免整页卡住navigator.scheduling.isInputPending() 判断是否存在待处理的输入事件,从而更积极地让渡import { useMemo, useTransition, useState } from 'react'
export default function FilterList({ items }: { items: string[] }) {
const [query, setQuery] = useState('')
const [isPending, startTransition] = useTransition()
const filtered = useMemo(() => {
const q = query.toLowerCase()
return items.filter(i => i.toLowerCase().includes(q))
}, [items, query])
return (
<div>
<input
value={query}
onChange={e => {
const v = e.target.value
startTransition(() => setQuery(v))
}}
placeholder="输入过滤关键词"
/>
{isPending && <span>计算中…</span>}
<ul>
{filtered.map(i => <li key={i}>{i}</li>)}
</ul>
</div>
)
}setQuery 放入 startTransition,把过滤计算标记为非紧急更新,输入响应优先不卡顿function UserCard() {
const user = useUserResource() // 内部抛出 Promise,待数据就绪再继续渲染
return <div>{user.name}</div>
}
export default function Page() {
return (
<Suspense fallback={<Skeleton />}>
<UserCard />
</Suspense>
)
}fallback,就绪后恢复渲染子树;配合 Fiber 的可中断模型提升感知速度memo/useMemo/useCallback 控制派生与重建useTransition 或批处理key,减少无谓 diff 与重排useEffect 中频繁、同步地读取布局并写入样式,改为批量读后批量写或转移到动画帧startTransition 分离