1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| /**
* Webpack代码分割配置
*/
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
// 第三方库单独打包
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
priority: 10
},
// 公共代码提取
common: {
minChunks: 2,
priority: 5,
reuseExistingChunk: true
},
// 框架单独打包
framework: {
test: /[\\/]node_modules[\\/](react|react-dom|vue)[\\/]/,
name: 'framework',
priority: 20
}
}
},
// 运行时代码单独打包
runtimeChunk: {
name: 'runtime'
}
}
};
/**
* 路由级代码分割(React Router)
*/
import { lazy, Suspense } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
// 懒加载组件
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Dashboard = lazy(() => import('./pages/Dashboard'));
// 加载状态组件
const LoadingFallback = () => (
<div className="loading">
<div className="spinner"></div>
<p>加载中...</p>
</div>
);
function App() {
return (
<BrowserRouter>
<Suspense fallback={<LoadingFallback />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/dashboard" element={<Dashboard />} />
</Routes>
</Suspense>
</BrowserRouter>
);
}
/**
* 组件级代码分割
*/
import { lazy } from 'react';
// 重型组件延迟加载
const HeavyChart = lazy(() =>
import('./HeavyChart')
);
const RichTextEditor = lazy(() =>
import('./RichTextEditor')
);
function Dashboard() {
const [showChart, setShowChart] = useState(false);
return (
<div>
<button onClick={() => setShowChart(true)}>
显示图表
</button>
{showChart && (
<Suspense fallback={<div>加载图表...</div>}>
<HeavyChart />
</Suspense>
)}
</div>
);
}
|