React懒加载介绍(React.lazy()+Suspense、React延迟加载、按需加载组件)spinner、Webpack代码分割(Code Splitting)、chunk
文章目录
🚀 React 懒加载(Lazy Loading)详解:让前端性能飞起来
在现代 Web 应用中,性能优化是开发者永恒的主题。随着前端项目越来越庞大,打包后的 JS 文件动辄数 MB,加载时间也随之增加。用户打开页面时,可能要等待所有组件加载完才能看到界面,这显然不是理想体验。
React 懒加载(Lazy Loading) 正是为了解决这一问题而生的。本文将带你从概念到实战,全面掌握 React 懒加载的用法与原理。
💡 一、什么是懒加载?
懒加载(Lazy Loading),又称延迟加载,是一种性能优化策略。它的核心思想是:
“按需加载” —— 只在用户真正需要时,才去加载对应的资源。
在 React 中,懒加载通常指 按需加载组件。
比如首页用户暂时看不到的管理后台组件,我们就没必要在首屏就加载进来,而是当用户进入后台页面时再加载。
⚙️ 二、React 懒加载的基本用法
React 在 v16.6 之后内置了两个与懒加载相关的 API:
React.lazy()Suspense
它们搭配使用,可以非常方便地实现组件懒加载。
✅ 基础示例(演示3秒后加载一个About组件)
About.tsx
"use client";
import React from "react";
const About: React.FC = () => {
return (
<div style={{
padding: "20px",
border: "1px solid #ccc",
borderRadius: "8px",
margin: "20px 0",
backgroundColor: "#f9f9f9"
}}>
<h2 style={{ color: "#333", marginBottom: "15px" }}>关于我们</h2>
<p style={{ lineHeight: "1.6", color: "#666" }}>
这是关于页面的内容,已经加载完成!
</p>
<p style={{ lineHeight: "1.6", color: "#666", marginTop: "15px" }}>
这是一个关于页面,展示了Suspense的fallback效果。
</p>
</div>
);
};
export default About;
page.tsx
// page.tsx
"use client";
import React, { Suspense } from "react";
// 使用 React.lazy() 动态导入组件,添加延迟来模拟慢加载
const About = React.lazy(() =>
new Promise(resolve => {
setTimeout(() => {
resolve(import("./About"));
}, 5000); // 3秒延迟,更容易看到fallback
})
);
function App() {
return (
<div>
<h1>首页</h1>
{/* Suspense 用于包裹懒加载组件 */}
<Suspense fallback={
<div style={{
padding: "40px",
textAlign: "center",
border: "3px solid #ff0000",
borderRadius: "12px",
margin: "20px 0",
backgroundColor: "#ffe6e6",
fontSize: "20px",
fontWeight: "bold"
}}>
<div style={{
display: "inline-block",
width: "40px",
height: "40px",
border: "5px solid #f3f3f3",
borderTop: "5px solid #ff0000",
borderRadius: "50%",
animation: "spin 1s linear infinite",
marginBottom: "15px"
}}></div>
<p style={{ margin: "0", color: "#cc0000", fontSize: "18px" }}>
🔄 正在加载组件中... (2秒延迟)
</p>
<p style={{ margin: "10px 0 0 0", color: "#666", fontSize: "14px" }}>
这是Suspense的fallback内容
</p>
<style jsx>{`
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`}</style>
</div>
}>
<About />
</Suspense>
</div>
);
}
export default App;
效果

🧠 代码解析
React.lazy():接收一个函数,这个函数需要调用import()动态导入组件。Suspense:包裹懒加载组件,fallback属性用于设置加载时的占位内容(比如 loading 动画)。
🔀 三、结合 React Router 实现页面级懒加载
在真实项目中,懒加载最常见的场景就是路由级别的组件加载。
以 React Router v6 为例(CSR,注意区别与Next.js SSR项目):
代码
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import React, { Suspense } from "react";
const Home = React.lazy(() => import("./pages/Home"));
const About = React.lazy(() => import("./pages/About"));
const Dashboard = React.lazy(() => import("./pages/Dashboard"));
function App() {
return (
<Router>
<Suspense fallback={<div>页面加载中...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/dashboard" element={<Dashboard />} />
</Routes>
</Suspense>
</Router>
);
}
export default App;
这样,React Router 会在用户访问不同路径时,按需加载对应的页面组件,从而有效减少首屏加载体积。
🧩 四、懒加载的高级用法
1. 自定义 Loading 组件
实际开发中我们通常会使用一个优雅的加载动画,而不是简单的文本。
function Loading() {
return <div className="spinner">Loading...</div>;
}
<Suspense fallback={<Loading />}>
<Dashboard />
</Suspense>
2. 拆分更细的组件
不仅页面可以懒加载,任何大型组件都可以拆分按需加载。例如:
const Chart = React.lazy(() => import("./components/Chart"));
const Table = React.lazy(() => import("./components/Table"));
只有当用户滚动到 Chart 区域时才加载它,可以进一步优化性能。
🧠 五、懒加载的原理浅析(Webpack代码分割(Code Splitting)功能)
当我们使用:
React.lazy(() => import("./About"))
实际上就是借助了 Webpack 的代码分割(Code Splitting) 功能。
Webpack 会自动把 About 组件打包成单独的 chunk 文件(如 About.chunk.js)。
当用户访问对应路由时,React 才会通过网络请求加载这部分代码。
这也是为什么懒加载往往需要结合打包工具(Webpack、Vite 等)一起工作。
⚠️ 六、注意事项
1. React.lazy() 只能用于 默认导出组件;
2. 懒加载组件必须被 <Suspense> 包裹;
3. 如果多个懒加载组件嵌套,建议在更高层包裹一个 <Suspense>;
4. SSR(服务端渲染)中需要使用其他库(如 @loadable/component)实现懒加载支持。
📈 七、总结
| 特性 | 说明 |
|---|---|
| 概念 | 按需加载组件,减少首屏体积 |
| 核心 API | React.lazy() + <Suspense> |
| 典型场景 | 路由懒加载、大组件延迟加载 |
| 优点 | 加快首屏加载速度,提升用户体验 |
| 注意 | SSR 场景需额外配置 |
🧩 八、延伸阅读
写在最后:
懒加载并不是“越多越好”。滥用懒加载会导致频繁的网络请求和加载延迟。正确做法是针对体积大、访问频率低的模块进行懒加载。合理使用它,可以让你的 React 应用启动更快、体验更流畅。🚀
更多推荐


所有评论(0)