一、什么是懒加载?
懒加载(Lazy Loading) 是一种性能优化策略:延迟加载非关键资源,直到真正需要时才加载 。在 React 应用中,主要指 按需加载组件代码,避免将所有 JS 打包到一个文件中,从而减少首屏加载体积、提升页面响应速度和用户体验。
二、React 官方懒加载方案:React.lazy + Suspense
React 提供了原生支持懒加载的两个核心 API:
1. React.lazy
- 用于动态导入组件
- 接收一个返回
Promise的函数(通常使用import()语法) - 返回一个"懒加载组件"
js
const LazyComponent = React.lazy(() => import('./HeavyComponent'));
⚠️ 要求被导入的模块使用 默认导出(
export default)
2. Suspense
- 作为"异步边界",捕获子组件抛出的 Promise
- 在组件加载期间显示
fallback内容(如加载提示)
jsx
<Suspense fallback={<div>加载中...</div>}>
<LazyComponent />
</Suspense>
✅ 必须用
Suspense包裹lazy组件,否则会报错
三、工作原理简述
- 首次渲染
<LazyComponent />时,React.lazy触发import(),发起网络请求加载对应 chunk - 组件尚未加载完成时,
lazy内部会 throw 一个 Promise Suspense捕获该 Promise,暂停子树渲染,显示fallback- 当代码加载并解析完成后,React 自动重新渲染真实组件
🔑 核心机制是 "抛出 Promise" + "异步边界捕获" ,与 DOM 滚动或
Intersection Observer无关
四、典型应用场景
| 场景 | 建议 |
|---|---|
| 路由页面(如 Dashboard、Profile) | ✅ 强烈推荐(配合 React Router) |
| 大型功能模块(图表、富文本编辑器) | ✅ 推荐 |
| 非首屏区域组件(页脚、弹窗) | ✅ 可考虑 |
| 首屏关键内容 | ❌ 禁止懒加载(影响 LCP 和 SEO) |
| 小型 UI 组件(按钮、图标) | ❌ 不值得(增加请求数) |
五、进阶:结合视口感知(Intersection Observer)
若希望 仅当组件进入视口时才开始加载 ,可结合 Intersection Observer:
jsx
import { useInView } from 'react-intersection-observer';
import { lazy, Suspense, useState, useEffect } from 'react';
const ViewportLazy = () => {
const [load, setLoad] = useState(false);
const { ref, inView } = useInView();
useEffect(() => {
if (inView) setLoad(true);
}, [inView]);
return (
<div ref={ref}>
{load ? (
<Suspense fallback="Loading...">
<LazyHeavyComponent />
</Suspense>
) : null}
</div>
);
};
这种方式实现了 "视口感知 + 代码分割" 的双重优化
六、注意事项与限制
- ❌ 不支持服务端渲染(SSR) :在 Next.js 等框架中需使用
dynamic替代 - ❌ 仅支持默认导出:不能直接懒加载具名导出(named export)
- ✅ 支持错误边界 :可在外层包裹
ErrorBoundary处理加载失败 - ✅ 自动代码分割 :Webpack / Vite 会为每个
import()生成独立 chunk
七、最佳实践建议
-
优先对路由级组件做懒加载
jsconst Home = lazy(() => import('./pages/Home')); -
使用有意义的 chunk 名称 (便于调试和缓存)
jslazy(() => import(/* webpackChunkName: "chart" */ './Chart')) -
避免过度拆分:太多小 chunk 会增加 HTTP 请求开销
-
首屏关键资源不要懒加载:保障 Core Web Vitals(如 LCP)
八、总结
React.lazy + Suspense 是 React 官方推荐的组件级代码分割方案 ,能有效减小初始 bundle 体积,提升应用性能。它解决的是 "何时加载代码" 的问题,而非"何时渲染元素"。对于滚动触发的懒加载(如图片),应使用 Intersection Observer。两者可结合使用,实现更智能的资源加载策略。
合理运用懒加载,是构建高性能 React 应用的重要一环。
📌 提示:在现代构建工具(Vite、Webpack 5+)和框架(Next.js、Remix)中,懒加载已高度自动化,开发者只需关注组件拆分逻辑即可。