# 通知設計書 23-EntrypointsOverSizeLimitWarning

## 概要

本ドキュメントは、Webpackにおける `EntrypointsOverSizeLimitWarning` の通知仕様を定義する。エントリーポイントに含まれる複数アセットの合計サイズが推奨制限を超過した場合に発行されるパフォーマンス警告クラスである。

### 本通知の処理概要

EntrypointsOverSizeLimitWarningは、Webpackビルドの出力フェーズ（afterEmit）において、エントリーポイントに紐付く全アセットの合計サイズが設定された推奨制限（デフォルト244KiB = 250,000バイト）を超過した場合に発行される警告通知である。

**業務上の目的・背景**：Webアプリケーションの初期読み込みパフォーマンスに直接影響するエントリーポイントの合計サイズを監視する。個別アセットが制限内であっても、エントリーポイント全体として肥大化している場合を検知するために、AssetsOverSizeLimitWarningとは別に設けられた警告である。ユーザーがページにアクセスした際に最初にダウンロードされるファイル群のトータルサイズを管理する。

**通知の送信タイミング**：compiler.hooks.afterEmitフック実行時に、SizeLimitsPluginが各エントリーポイントの合計サイズを算出し、制限超過を検出した時点で発行される。

**通知の受信者**：Webpackビルドを実行する開発者。performance.hints設定に応じて、compilation.warningsまたはcompilation.errorsに蓄積される。

**通知内容の概要**：制限超過した全エントリーポイントの名前、合計サイズ、含まれるファイル名の一覧を含む警告メッセージ。

**期待されるアクション**：開発者は、コード分割（dynamic import()）を活用して初期チャンクのサイズを削減する。不要な依存関係の削除やTree Shakingの最適化も有効。

## 通知種別

ビルド警告（Webpack Compilation Warning）またはビルドエラー（performance.hints = "error" の場合）。コンソール出力およびStats APIを通じて開発者に通知される。

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（afterEmitフック内で即座に生成） |
| 優先度 | 中（警告レベル）/ 高（hints="error"の場合はエラーレベル） |
| リトライ | なし（一度きりの警告発行） |

### 送信先決定ロジック

SizeLimitsPlugin.apply()内のcompiler.hooks.afterEmitタップで、compilation.entrypointsを走査し各エントリーポイントの合計サイズを検査する。制限超過を検出した場合にEntrypointsOverSizeLimitWarningが生成される。

## 通知テンプレート

### メール通知の場合

該当なし。本通知はメール通知ではなく、Webpackビルド出力として表示される。

### 本文テンプレート

```
WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit ({制限サイズ}). This can impact web performance.
Entrypoints:
  {エントリーポイント名1} ({合計サイズ1})
      {ファイル名1-1}
      {ファイル名1-2}
  {エントリーポイント名2} ({合計サイズ2})
      {ファイル名2-1}
```

### 添付ファイル

該当なし。

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| entrypoints | 制限超過エントリーポイントの配列（{name, size, files}） | compilation.entrypointsからフィルタ | Yes |
| entrypointLimit | エントリーポイントサイズ制限値（バイト） | performance.maxEntrypointSize（デフォルト250000） | Yes |
| name | 警告名 | 固定値 "EntrypointsOverSizeLimitWarning" | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| フック実行 | compiler.hooks.afterEmit | performance.hints が truthy かつ、いずれかのエントリーポイントの合計サイズが maxEntrypointSize を超過 | SizeLimitsPluginが検査を実行 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| performance.hints が false/未設定 | パフォーマンスヒント自体が無効化されている場合 |
| 全エントリーポイントが制限内 | 全エントリーポイントの合計サイズが制限以下の場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[compiler.hooks.afterEmit発火] --> B[SizeLimitsPlugin処理開始]
    B --> C[compilation.entrypoints走査]
    C --> D[getEntrypointSize でエントリーポイントの合計サイズ算出]
    D --> E{合計サイズ > maxEntrypointSize?}
    E -->|No| F[次のエントリーポイントへ]
    E -->|Yes| G[entrypointsOverLimit配列に追加]
    G --> H[isOverSizeLimitSetでマーキング]
    H --> I{超過エントリーポイントあり?}
    I -->|No| J[終了]
    I -->|Yes| K[EntrypointsOverSizeLimitWarning生成]
    K --> L{hints === 'error'?}
    L -->|Yes| M[compilation.errorsに追加]
    L -->|No| N[compilation.warningsに追加]
    M --> J
    N --> J
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし。Webpackはデータベースを使用しない。

### 更新テーブル一覧

該当なし。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| アセットが存在しない | entrypoint.getFiles()で取得したファイルに対応するアセットがない場合 | getEntrypointSizeでasset存在チェックあり |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし（ビルド1回につき最大1つの警告） |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし。ビルド実行時に即座に警告が生成される。

## セキュリティ考慮事項

エントリーポイント名、アセットファイル名、サイズ情報が警告メッセージに含まれるが、機密情報は含まれないためリスクは低い。

## 備考

- WebpackErrorを基底クラスとして継承している
- AssetsOverSizeLimitWarningと同様に SizeLimitsPlugin から発行される
- entrypointsプロパティにEntrypointDetails配列を保持（{name, size, files}）
- isOverSizeLimitSetにエントリーポイント自体がマーキングされる
- この警告とAssetsOverSizeLimitWarningは同時に発行される場合がある

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、EntrypointsOverSizeLimitWarningクラスとその入力データ型を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 基底クラス |
| 1-2 | EntrypointsOverSizeLimitWarning.js | `lib/performance/EntrypointsOverSizeLimitWarning.js` | EntrypointDetails[]とentrypointLimitを受け取り、メッセージを構築 |
| 1-3 | SizeLimitsPlugin.js | `lib/performance/SizeLimitsPlugin.js` | EntrypointDetails型定義（27-32行目: {name, size, files}） |

**読解のコツ**: EntrypointDetails型には `files` プロパティがあり、エントリーポイントを構成するファイル名の配列を保持する。これによりどのファイルがサイズに寄与しているか特定できる。

#### Step 2: エントリーポイントを理解する

SizeLimitsPluginにおけるエントリーポイントサイズ算出ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SizeLimitsPlugin.js | `lib/performance/SizeLimitsPlugin.js` | getEntrypointSize関数（86-99行目）とエントリーポイント走査（129-140行目） |

**主要処理フロー**:
1. **86-99行目**: getEntrypointSize関数でエントリーポイントの全ファイルサイズを合算
2. **88行目**: entrypoint.getFiles()でファイル一覧取得
3. **89-95行目**: 各ファイルのアセットを取得し、assetFilter通過かつsource存在の場合にサイズを加算
4. **129行目**: compilation.entrypoints をループ
5. **130行目**: getEntrypointSize(entry) で合計サイズ算出
6. **132行目**: entrypointSizeLimit との比較
7. **136行目**: entry.getFiles().filter(fileFilter) でフィルタ通過ファイルのみを保持

#### Step 3: 警告メッセージ生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | EntrypointsOverSizeLimitWarning.js | `lib/performance/EntrypointsOverSizeLimitWarning.js` | 19-30行目でエントリーポイント一覧をフォーマット |

**主要処理フロー**:
- **19-26行目**: entrypointsをmapで変換。名前・合計サイズ・ファイル名一覧を整形
- **24行目**: 各ファイル名をインデント付きで列挙
- **27-30行目**: superコンストラクタに整形メッセージを渡す

### プログラム呼び出し階層図

```
compiler.hooks.afterEmit
    |
    +-- SizeLimitsPlugin.apply() (78行目)
            |
            +-- compilation.entrypoints 走査 (129行目)
            |       |
            |       +-- getEntrypointSize(entry) (130行目)
            |       |       |
            |       |       +-- entrypoint.getFiles() (88行目)
            |       |       +-- compilation.getAsset(file) (89行目)
            |       |       +-- assetFilter() (92行目)
            |       |
            |       +-- entrypointsOverLimit.push({name, size, files}) (133-137行目)
            |       +-- isOverSizeLimitSet.add(entry) (138行目)
            |
            +-- new EntrypointsOverSizeLimitWarning(entrypointsOverLimit, entrypointSizeLimit)
            |       |
            |       +-- formatSize(entrypointLimit) (27行目)
            |       +-- formatSize(entrypoint.size) (22行目)
            |
            +-- compilation.warnings.push() または compilation.errors.push()
```

### データフロー図

```
[入力]                           [処理]                          [出力]

compilation.entrypoints -------> getEntrypointSize() --------> entrypointsOverLimit[]
    |                               |                              |
    +-- entry.getFiles() ---------> assetFilter() で除外           |
    |                               |                              v
performance.maxEntrypointSize --> サイズ比較               EntrypointsOverSizeLimitWarning
                                    |                              |
performance.hints --------------> 出力先判定                       v
                                                          compilation.warnings[]
                                                          または compilation.errors[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| EntrypointsOverSizeLimitWarning.js | `lib/performance/EntrypointsOverSizeLimitWarning.js` | ソース | 警告クラス本体 |
| SizeLimitsPlugin.js | `lib/performance/SizeLimitsPlugin.js` | ソース | 警告の生成・発行を行うプラグイン |
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラー/警告クラス |
| SizeFormatHelpers.js | `lib/SizeFormatHelpers.js` | ソース | サイズフォーマットユーティリティ |
