---
# System prepended metadata

title: ng-japan OnAir vol.36
tags: [ng_jp_onair]

---

# ng-japan OnAir vol.36

https://www.youtube.com/watch?v=qrSJWEGlqfw

```
ng-japan OnAirはAngular日本ユーザー会が主催するオンラインイベントです

https://community.angular.jp
connpass: https://ngjapan.connpass.com/event/206285/
shownote: https://hackmd.io/@lacolaco/H18RBT7fd

#Angular #ng_jp_onair
```

## アジェンダ

- 再発見シリーズ "Angularのパフォーマンス最適化機能"


## 再発見シリーズ "Angularのパフォーマンス最適化機能"

はじめに見る >>> **https://web.dev/angular**

### ネットワークパフォーマンス最適化

#### `preserveWhitespaces`

- https://angular.jp/guide/angular-compiler-options#preservewhitespaces
- [Performance Tip: Preserving Whitespace \| by Austin \| Medium](https://medium.com/@amcdnl/performance-tip-preserving-whitespace-623378a38c32)

テンプレートHTMLの不要な空白を残すフラグ（デフォルト: `false`）
- 息の長いプロジェクトは `ng update`のマイグレーションで `true` になっている可能性あり


#### `import()`: Lazy Loading

`import()` は自動的にチャンク分割される


#### `ng build --prod`

`--prod`は `--configuration=production` のエイリアス

```json
{
  ...
  "configurations": {
  
    "production": {
      ...
      "optimization": true,
      "buildOptimizer": true,
    }
  }
}
```

##### `optimization`: JIT/AOT共通最適化

- https://angular.jp/guide/workspace-config#optimization-configuration

```json
{
    "optimization": {
      "scripts": true,
      "styles": {
        "minify": true,
        "inlineCritical": true // since v12
      },
      "fonts": true
    }
}
```
https://github.com/angular/angular-cli/blob/master/packages/angular_devkit/build_angular/src/webpack/configs/common.ts#L337

- `scripts`
    - Tree-shaking / デッドコード除去 / minify
        - [terser](https://terser.org/)による最適化
- `styles.minify`
    - CSSのminify
        - [cssnano](https://cssnano.co/)による最適化
- `styles.inlineCritical`
    - クリティカルCSSのインライン化
        - [critter](https://github.com/GoogleChromeLabs/critters)による最適化
- `fonts`
    - Webフォント読み込みCSSのインライン化


##### `buildOptimizer`: AOTコンパイル専用最適化

https://github.com/angular/angular-cli/blob/master/packages/angular_devkit/build_optimizer

- Class fold
    - 静的プロパティへのアクセスをIIFEに畳み込み
        - for Tree-Shaking
- Scrub file
    - Angularデコレータのメタデータ除去
- Prefix classes/functions
    - 副作用のない関数・クラスへ `/*@__PURE__*/`プレフィックスを付与
- Import tslib
    - インライン化されたtslib関数をモジュールインポートへ置換
- Wrap enums
    - TypeScript Enumの関数ラップとPURE化

### ランタイムパフォーマンス最適化

#### `enableProdMode`

https://angular.io/api/core/enableProdMode

変更検知のチェックを減らし、デバッグ用のメタデータを除去する

#### `pure` Pipe

- *純粋な*パイプは自動的にメモ化される
    - Change Detectionの中で計算がスキップされる
- 純粋なパイプとは？
    - 同じInputに対して結果が冪等であること
    - 副作用を起こさないこと
- デフォルトは `pure: true`
    - `async` や `json` などは`pure: false`

#### `OnPush` Change Detection

[Optimize Angular's change detection | web.dev](https://web.dev/faster-angular-change-detection/)
[\[日本語訳\] Angular 2 Change Detection Explained \| lacolaco/tech](https://blog.lacolaco.net/2016/04/translation-angular-2-change-detection-explained/)
  

- コンポーネントの変更検知のタイミングを限定する
    - 親コンポーネントから `@Input()` へのバインディングが更新された（新しい入力をPushされた）ときだけ
- OnPushなコンポーネントを頂点とする子ツリー全体の計算をスキップできる

#### `*ngFor` TrackBy

https://angular.io/api/common/NgForOf#change-propagation
[Angular 2 — Improve Performance with trackBy \| by Netanel Basal \| Netanel Basal](https://netbasal.com/angular-2-improve-performance-with-trackby-cc147b5104e5)
[ngForとtrackBy \- noxi雑記](https://noxi515.hateblo.jp/entry/2020/06/05/123138)

- NgForで変更の前後で要素の同一性を追跡するための識別子
    - それぞれの要素が追加/削除/更新/変化なしのどれかを判定する
- デフォルトではオブジェクト参照の一致（プリミティブは値の一致）
- `item.id`で一致させるユースケースが多い

###### tags: `ng_jp_onair`