---
# System prepended metadata

title: Angular 效能優化 LazyLoading/PreloadAllModules
tags: [Angular]

---

# Angular 效能優化 LazyLoading/PreloadAllModules
###### tags: `Angular`

## [延遲載入 Lazy-loading](https://angular.io/guide/lazy-loading-ngmodules)

### 簡介
針對頁面可設置個別的 Module，讓其進入該頁面的時候才 Loading 所需要的東西，可以避免在進入第一個頁面就需要 Loading 所有東西 
( 將原本在 main.js 中的內容分散成各 js，避免 main.js loading 太重 )

### LazyLoading 的實作

* 建立完整的 Component 搭配 Routing、Module 檔案、並在 app-routing.module.ts 的 routes 中新增一組 route
![](https://i.imgur.com/zMI9AmQ.png)
```
ng generate module /Components/test --route test --module app.module
```

* 建立出來的 module
![](https://i.imgur.com/C2iLaYQ.png)

* 建立出來的 routing
![](https://i.imgur.com/RkUVot2.png)

* 如果是開發中途想改成 LazyLoading
會出現異常
<span style="color:red">A merge conflicted on path "/src/app/Components/wijmo-chart/wijmo-chart.component.html".</span>

故將路徑先改為在 app 底下建立，在另外將產出的 module、routing 複製至目前的 Component 也行
```
ng generate module /test --route test --module app.module
```

[實作參考-Angular Lazy Loading — Not Only For The Lazy](https://massivepixel.io/blog/angular-lazy-loading/)

### 太多共用的 Module 不想每次都複製貼上
1. 建一個 ts 檔， export 一些共用的設定吧
```
export const moduleCommonSet = {
  imports: [
    // A Module
    // B Module
    // C Module
  ]
}
```
![](https://i.imgur.com/1zuVzzn.png)

2. SharedModule
[官方文件](https://angular.io/guide/sharing-ngmodules)
[stackoverflow-Creating Shared Module across lazy loaded routes](https://stackoverflow.com/a/65006591)

### 延伸議題
畢竟有可能有很多頁面的系統，不知道是不是可以相似的多個頁面共用同一個 Module 呢？不過這樣 Routing 怎麼辦？還是說頁面本身就應該設計好，都有主路由配子路由？

### 其他
※除了 appModule 之外都用 [CommonModule](https://angular.io/api/common/CommonModule)
CommonModule 是從 BrowserModule 重新導出所有基本的 Angular 指令和管道


## [預先背景載入-PreloadAllModules](https://angular.io/api/router/PreloadAllModules)

### 簡介
預載功能，搭配 LazyLoading 服用
載完第一個頁面後，開始下載 LazyLoading 的 Module，這樣可以減少使用者的 Loading 體感，也可以自訂一些讀取策略

### 實作
app.routing.ts
`RouterModule.forRoot(ROUTES, {preloadingStrategy: PreloadAllModules})`

### 參考
[[Angular] Preloading策略](https://blog.kevinyang.net/2017/01/21/angular2-preloading/)

## dist分析包 Webpack Bundle Analyzer ( angular 用法 )

### 簡介
分析 bulid 出來的 package，會依照 package 的 size 呈現，能清楚的看到那些模組體積過大，指上方塊時也能清楚的看見其資料大小

![](https://i.imgur.com/wASCeP0.jpg)

### 實作
1. 在 Project 中安裝
`npm install --save-dev webpack-bundle-analyzer`
3. 在 package.json 中 script 加上指令
`"bundle-report": "webpack-bundle-analyzer dist/stats.json"`
![](https://i.imgur.com/zPygmV4.png)
3. build project
`ng build --stats-json`
4. 啟動分析頁面服務
`npm run bundle-report`

### 參考
* [Angular main.js file large size](https://stackoverflow.com/q/55803291)
* [Analyzing bundle size with the Angular CLI and Webpack](https://coryrylan.com/blog/analyzing-bundle-size-with-the-angular-cli-and-webpack)
