跳至主要内容

[react] React 使用 Lazy 與 Suspense 動態載入 Component

影片連結

當我們使用 React 開發網站時,一進入到網站,React 就會將我們所有用到的 Component 給載入進來。

舉例來說,我們現在有三個 Component,分別是:HomeItemsAbout

App.jsx
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import "./App.css";

import Navbar from "./component/Navbar";
import Home from "./component/Home";
import Items from "./component/Items";
import About from "./component/About";

function App() {
return (
<div className="App">
<Router>
<Navbar />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/items" element={<Items />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
</div>
);
}

export default App;

Image

在 Network 的部分也可以看到這三個 Component 被載入。

Image

Lazy & Suspense

如果我們網站 Component 非常多,有些 Component 可能使用者不會常去使用到,但使用者進到網站時一樣會載入該 Component,這時候就可以使用 lazysuspense 來達到動態載入 Component 的功能,也就是在必要的時候才去讀取該 Component。

這邊將 ItemsAbout Component 使用 lazy 動態載入的方式做處理。

App.jsx
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import "./App.css";
import Navbar from "./component/Navbar";
import Home from "./component/Home";
import { lazy, Suspense } from "react";

const Items = lazy(() => import("./component/Items"));
const About = lazy(() => import("./component/About"));

function App() {
return (
<div className="App">
<Router>
<Navbar />
<Suspense fallback={<h1>Loading...</h1>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/items" element={<Items />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
</div>
);
}

export default App;

這時候可以發現,一開始載入時,Items 和 About 並沒有載入。

Images

當我們進到 Items 和 About 頁面時,才會將這兩個 Component 載入。

Images