### 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