10月 21, 2020 React
### Bundle

在使用 React 時是一定會使用到 Webpack 等等工具來把 JSX、CSS、IMAGES... 等等進行打包。如果你的 APP 已經建立得非常大時,產生的 Bundle 檔案也會非常巨大。使用者在下載時就會花上很多時間了喔 !

### 解決方法

我們可以通過使用 React 內建的 Lazy loading 來解決一次過下載巨大 Bundle 檔案的問題。它的原理是把單一的 Bundle 檔案依不同的 package 來分割開,然後在使用者實際使用時才動態載入。

### 內裏是 Promise

我們有以下的 module ,作用把兩個傳入的數字相加。

```js
// math.js
export default sum(a, b) => a + b;
```

在傳統的使用方法,我們是以下這樣 :

```js
import sum from './math.js';

console.log(sum(1, 2)); // 3
```

使用 Lazy Loading 的話,載入的 object 就會變成了 Promise 物件:

```js
import('./math.js')
	.then(sum => console.log(sum(1, 2))); // 3
```

### 實際使用

在實際使用上,我們可以通過使用 `React.lazy` 方法來簡單化整個載入的流程。

```js
// 載入 SomeComponent
const SomeComponent = React.lazy(() => import('./SomeComponent.jsx'));
```

然可以作為一般的 Component 來使用,但是需要放在 React.Suspense 元件內。

```js
<React.Suspense fallback={<div>Loading...</div>}>
	<SomeComponent />
</React.Suspense>
```

React.Suspense 是處理其子 Component 如果有 Lazy Loading 動作時,就會劃出 fallback 的元件出來,等待 Lazy Load 完成後,就會顯示元件。

### 筆者推介使用方法

因為在 React 內得多元件都可以重用,但是如果有使用 React Router 的話,不同 URL 之間的元件是一定不會重用的,所以我們可以簡單把 React.Suspense 包住整個 Router。然後把不同 Route 內的 Component 都轉成使用 Lazy Load,這樣就已經可以簡單快速地分割出合適的 Bundle 檔案了。

### 官方文件

官方文件 : https://zh-hant.reactjs.org/docs/code-splitting.html
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)