React.lazy与Suspense实现代码分割
解释React.lazy和Suspense如何实现组件的代码分割(Code Splitting),以及React 18中Suspense的新能力(如Suspense List、流式SSR)。如何处理多个Suspense的加载状态?
回答
Yahuda
React.lazy + Suspense基础用法
const LazyComponent = React.lazy(() => import('./HeavyComponent'));
function App() {
return (
<Suspense fallback={<Loading />}>
<LazyComponent />
</Suspense>
);
}
工作原理:
React.lazy接收一个动态import()函数,返回一个Promise- Promise resolve时组件加载完成
- Suspense在Promise pending期间显示fallback
- Webpack/Vite自动将动态import拆分为独立chunk
React 18 Suspense新特性
1. 流式SSR(Streaming SSR)
- HTML以流形式逐步发送给客户端
- 被Suspense包裹的组件可延迟渲染,不阻塞首次HTML发送
- 客户端渐进式水合,优先水合已到达的部分
2. Suspense List
<SuspenseList revealOrder="together" tail="collapsed">
<Suspense fallback="<Loading />">
<Profile />
</Suspense>
<Suspense fallback="<Loading />">
<Feed />
</Suspense>
</SuspenseList>
revealOrder:控制Suspense显示顺序(together/forwards/backwards)tail:控制未就绪Suspense的fallback显示方式
3. 嵌套Suspense
- 外层Suspense等所有内层完成后才展示
- 内层Suspense可以有自己的中间状态
多个Suspense处理建议:
- 使用Suspense List协调多个并行的Suspense边界
- 在路由级别用嵌套Suspense实现逐步加载(先导航,再数据,再子组件)
- 避免Suspense放置在频繁变化的小区域(fallback闪烁)
- 利用
startTransition降低Suspense切换时的闪烁感知