# 通知設計書 16-ChunkRenderError

## 概要

本ドキュメントは、Webpackにおけるチャンクレンダリングエラー通知（ChunkRenderError）の設計を定義する。ChunkRenderErrorは、チャンク（バンドルの一部）のレンダリング処理中に例外が発生した場合に発行されるエラー通知である。

### 本通知の処理概要

ChunkRenderErrorは、Webpackのコンパイル処理における最終段階であるチャンクのレンダリング（出力ファイル生成）フェーズで発生する例外を開発者に通知する。チャンクのハッシュ計算時やアセットファイルの生成時に発生しうる。

**業務上の目的・背景**：Webpackのビルドパイプラインの最終段階では、最適化されたモジュールグループ（チャンク）から実際の出力ファイル（バンドルファイル）を生成する。このレンダリング処理が失敗すると出力ファイルが生成されないため、開発者にエラーの原因を通知し、チャンク構成やプラグイン設定の修正を促す必要がある。

**通知の送信タイミング**：Compilation.jsのcreateChunkAssetsまたはcontentHash計算処理中に例外が発生したとき。具体的にはCompilation.jsの複数箇所（4674-4681行目、5078-5084行目、5115-5121行目付近）のcatchブロックで生成される。

**通知の受信者**：Webpackのビルドを実行した開発者。コンソール出力またはWebpack Stats APIを通じてエラー情報が伝達される。

**通知内容の概要**：元のエラーメッセージ（error.message）とスタックトレース（error.stack）が含まれ、どのチャンクとファイルでレンダリングが失敗したかを特定できる。

**期待されるアクション**：開発者は、エラーの原因となっているチャンク構成、プラグイン、テンプレート設定を確認し、必要に応じて修正を行うことが期待される。

## 通知種別

コンソールエラー出力 / Webpack Stats APIエラーレポート / ビルドエラー（compilation.errorsへの追加）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（レンダリングプロセス内で即座に生成） |
| 優先度 | 高（出力ファイル生成に影響するエラー） |
| リトライ | 無（エラー記録後、処理を中断またはスキップ） |

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

Compilation.jsのチャンクレンダリング処理中に例外が発生した場合、ChunkRenderErrorインスタンスを生成してthis.errors（compilation.errors）に直接追加する。3つの発生箇所それぞれで、chunk、file（ファイル名）、error（元のエラー）が引数として渡される。

## 通知テンプレート

### メール通知の場合

本通知はメール送信ではなく、Webpackビルドコンソール出力として表示される。

| 項目 | 内容 |
|-----|------|
| 送信元アドレス | N/A（コンソール出力） |
| 送信元名称 | webpack |
| 件名 | N/A |
| 形式 | テキスト |

### 本文テンプレート

```
ChunkRenderError: {元のエラーメッセージ}
{元のエラースタックトレース}
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | - | - | 添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| chunk | レンダリング対象のチャンク | Compilation.createChunkAssetsの処理対象 | Yes |
| file | 出力ファイル名 | filenameTemplate処理結果または空文字列 | Yes |
| error | 元のエラーオブジェクト | catchブロックで捕捉されたError | Yes |
| error.message | 元のエラーメッセージ | Errorオブジェクト | Yes |
| error.stack | 元のスタックトレース | Errorオブジェクト | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ビルド処理 | contentHash計算 | hooks.contentHash.call(chunk)が例外をスロー | Compilation.js 4674-4681行目付近 |
| ビルド処理 | チャンクマニフェスト生成 | hooks.renderManifest.call()が例外をスロー | Compilation.js 5078-5084行目付近 |
| ビルド処理 | チャンクアセット出力 | ファイル出力処理中に例外発生 | Compilation.js 5115-5121行目付近 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| レンダリングが正常に完了した場合 | エラーは発行されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[Compilation - チャンクレンダリング開始] --> B{処理フェーズ}
    B --> C[contentHash計算]
    B --> D[renderManifest生成]
    B --> E[アセットファイル出力]
    C --> F{例外発生？}
    D --> G{例外発生？}
    E --> H{例外発生？}
    F -->|Yes| I["ChunkRenderError(chunk, '', err)"]
    G -->|Yes| J["ChunkRenderError(chunk, '', err)"]
    H -->|Yes| K["ChunkRenderError(chunk, filename, err)"]
    F -->|No| L[正常継続]
    G -->|No| L
    H -->|No| L
    I --> M[compilation.errors.push]
    J --> M
    K --> M
    M --> N[終了]
    L --> N
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない。Webpackのインメモリデータ構造を参照する。

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| Chunk | レンダリング対象チャンク | Chunkインスタンス |
| Error | 元のエラー情報 | catchで捕捉されたエラー |

### テーブル別参照項目詳細

#### ChunkRenderErrorインスタンス

| 参照項目（プロパティ名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | エラー名表示 | 固定値 "ChunkRenderError" |
| chunk | エラー発生チャンク | コンストラクタ引数 |
| file | 出力ファイル名 | コンストラクタ引数 |
| error | 元のエラーオブジェクト | コンストラクタ引数 |
| message | エラーメッセージ | error.messageから取得 |
| details | 詳細情報 | error.stackから取得 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| compilation.errors | INSERT | ChunkRenderErrorインスタンスの追加 |

#### 送信ログテーブル

| 操作 | 項目（プロパティ名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | this.errors[] | ChunkRenderErrorインスタンス | compilation.errorsに直接追加 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| contentHash計算失敗 | hooks.contentHash.call()で例外 | プラグインの確認 |
| マニフェスト生成失敗 | hooks.renderManifest.call()で例外 | チャンク構成の確認 |
| ファイル出力失敗 | アセットファイル出力中の例外 | 出力設定の確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし。Webpackビルド実行時に即座に通知される。

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

- スタックトレースとファイル名が含まれるため、出力パスやディレクトリ構造の情報が表示される可能性がある

## 備考

- ChunkRenderErrorは3つの異なる発生箇所がある（contentHash計算、renderManifest生成、アセット出力）
- コンストラクタは3引数（chunk, file, error）を受け取り、CodeGenerationErrorやModuleHashingErrorよりも1つ多い
- chunkプロパティはWebpackError基底クラスにも定義されているが、ChunkRenderErrorでは独自にChunkインスタンスを設定
- fileプロパティもWebpackError基底クラスに定義されているが、ChunkRenderErrorでは出力ファイル名を設定
- makeSerializableによる登録がないため、永続キャッシュ非対応

---

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

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

### 推奨読解順序

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

ChunkRenderErrorクラスの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 基底クラスのchunk, fileプロパティ定義（34-37行目） |
| 1-2 | ChunkRenderError.js | `lib/ChunkRenderError.js` | エラークラス定義。chunk, file, error, message, detailsのプロパティ（12-35行目） |

**読解のコツ**: WebpackError基底クラスにもchunkとfileプロパティが定義されているが、ChunkRenderErrorではこれらをコンストラクタ引数から具体的な値で上書きしている点に注目。

#### Step 2: エントリーポイントを理解する（3箇所）

ChunkRenderErrorが生成される3つの箇所をそれぞれ理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Compilation.js | `lib/Compilation.js` | contentHash計算時のcatch（4674-4681行目付近） |
| 2-2 | Compilation.js | `lib/Compilation.js` | renderManifest生成時のcatch（5078-5084行目付近） |
| 2-3 | Compilation.js | `lib/Compilation.js` | アセット出力時のcatch（5115-5121行目付近） |

**主要処理フロー**:
1. **4677-4680行目**: contentHash計算失敗時、file引数は空文字列""
2. **5082-5084行目**: renderManifest失敗時、file引数は空文字列""
3. **5120行目**: アセット出力失敗時、file引数は実際のfilename

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

```
Compilation.seal()
    |
    +-- createHash()
    |       |
    |       +-- [各チャンクに対して]
    |               |
    |               +-- hooks.contentHash.call(chunk)
    |                       |
    |                       +-- [例外時] new ChunkRenderError(chunk, "", err)
    |
    +-- createChunkAssets()
            |
            +-- [各チャンクに対して]
                    |
                    +-- hooks.renderManifest.call()
                    |       |
                    |       +-- [例外時] new ChunkRenderError(chunk, "", err)
                    |
                    +-- [各マニフェストエントリに対して]
                            |
                            +-- ファイル出力処理
                                    |
                                    +-- [例外時] new ChunkRenderError(chunk, filename, err)
```

### データフロー図

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

Chunk                  --> ChunkRenderError               --> エラーメッセージ文字列
file (string)           |  コンストラクタ                  --> compilation.errors[]
Error (render例外)       |  - name="ChunkRenderError"
                        |  - chunk=対象チャンク
                        |  - file=ファイル名
                        |  - message=error.message
                        |  - details=error.stack
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラークラス |
| ChunkRenderError.js | `lib/ChunkRenderError.js` | ソース | チャンクレンダリングエラークラス定義 |
| Compilation.js | `lib/Compilation.js` | ソース | エラー発行元（3箇所） |
| Chunk.js | `lib/Chunk.js` | ソース | チャンクデータ構造 |
