# 通知設計書 19-FalseIIFEUmdWarning

## 概要

本ドキュメントは、WebpackにおけるIIFE/UMD非互換設定警告通知（FalseIIFEUmdWarning）の設計を定義する。FalseIIFEUmdWarningは、output.iifeがfalseに設定されているにもかかわらず、output.library.typeが'umd'に設定されている場合に発行される警告通知である。

### 本通知の処理概要

FalseIIFEUmdWarningは、Webpackの出力設定においてIIFE（即時実行関数式）の無効化とUMD（Universal Module Definition）ライブラリ形式が同時に指定された場合に、非互換性を開発者に警告する仕組みである。

**業務上の目的・背景**：UMDライブラリフォーマットは、CommonJS、AMD、グローバル変数の3つのモジュールシステムをサポートする汎用的なライブラリ形式である。UMDフォーマットはIIFEで包むことを前提として設計されているため、output.iifeをfalseに設定するとUMDの動作が不正になる可能性がある。この警告は、設定の矛盾を開発者に通知し、意図しないバンドル出力を防止する目的で設計されている。Webpack内部ではこの非互換性を検出した場合、output.iifeを自動的にtrueに上書きした上で警告を発行する。

**通知の送信タイミング**：EnableLibraryPlugin.jsでUMDライブラリタイプの有効化処理中に、output.iifeがfalseに設定されていることが検出された場合。WarnFalseIifeUmdPluginが動的に生成・登録され、compiler.hooks.thisCompilationフックのタイミングでcompilation.warningsに追加される。

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

**通知内容の概要**：output.iifeがfalseかつoutput.library.typeがumdの非互換設定であること、output.iifeをtrueに設定するか異なるlibrary.typeを選択する推奨事項、公式ドキュメントへのリンクが含まれる。

**期待されるアクション**：開発者は、output.iifeをtrue（またはデフォルト）に設定するか、UMD以外のlibrary.type（例：'commonjs2', 'module'等）を選択することが期待される。

## 通知種別

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

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（thisCompilationフック内で即座に追加） |
| 優先度 | 中（設定の自動修正あり、ビルドは成功する） |
| リトライ | 無（1回の警告表示のみ） |

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

EnableLibraryPlugin.jsのUMDライブラリ有効化処理中に`compiler.options.output.iife === false`が検出された場合、output.iifeをtrueに上書きした後、WarnFalseIifeUmdPlugin（インラインクラス）を生成・登録する。WarnFalseIifeUmdPluginはcompiler.hooks.thisCompilationフックでFalseIIFEUmdWarningインスタンスをcompilation.warningsに追加する。

## 通知テンプレート

### メール通知の場合

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

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

### 本文テンプレート

```
Configuration:
Setting 'output.iife' to 'false' is incompatible with 'output.library.type' set to 'umd'. This configuration may cause unexpected behavior, as UMD libraries are expected to use an IIFE (Immediately Invoked Function Expression) to support various module formats. Consider setting 'output.iife' to 'true' or choosing a different 'library.type' to ensure compatibility.
Learn more: https://webpack.js.org/configuration/output/
```

### 添付ファイル

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

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| N/A | テンプレート変数なし（固定メッセージ） | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 設定検証 | EnableLibraryPlugin - UMD有効化 | compiler.options.output.iife === false | EnableLibraryPlugin.js 236行目付近 |
| コンパイル開始 | compiler.hooks.thisCompilation | WarnFalseIifeUmdPluginが登録されている場合 | EnableLibraryPlugin.js 243-249行目 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| output.iifeがtrue（またはデフォルト）の場合 | 非互換は存在しない |
| library.typeがumd以外の場合 | UMD固有の問題は発生しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[EnableLibraryPlugin - UMD有効化] --> B{output.iife === false?}
    B -->|Yes| C["output.iife = true に自動修正"]
    B -->|No| D[警告なし - 正常処理]
    C --> E[WarnFalseIifeUmdPlugin生成・登録]
    E --> F[compiler.hooks.thisCompilation発火]
    F --> G[FalseIIFEUmdWarning生成]
    G --> H[compilation.warnings.push]
    H --> I[終了]
    D --> I
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない。

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| compiler.options.output | 出力設定の参照 | Webpack設定オブジェクト |

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

#### FalseIIFEUmdWarningインスタンス

| 参照項目（プロパティ名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | 警告名表示 | 固定値 "FalseIIFEUmdWarning" |
| message | 警告メッセージ表示 | 固定文字列（コンストラクタ内で設定） |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| compiler.options.output.iife | UPDATE | falseからtrueに自動修正 |
| compilation.warnings | INSERT | FalseIIFEUmdWarningインスタンスの追加 |

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

| 操作 | 項目（プロパティ名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| UPDATE | compiler.options.output.iife | true | 警告発行前に自動修正 |
| INSERT | compilation.warnings[] | FalseIIFEUmdWarningインスタンス | thisCompilationフック内 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| N/A | - | 本通知は警告であり、設定は自動修正される |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | N/A（警告通知のため不要） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし（コンパイルごとに1回） |
| 1日あたり上限 | 制限なし |

### 配信時間帯

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

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

- 固定メッセージのため、セキュリティリスクは特にない
- 公式ドキュメントへのURLが含まれる

## 備考

- WarnFalseIifeUmdPluginはEnableLibraryPlugin.js内でインラインクラスとして定義されている（238-252行目付近）
- FalseIIFEUmdWarningクラスはrequireの遅延読み込み（thisCompilationフック内でrequire）で使用される
- output.iifeはfalseからtrueに自動修正されるため、ビルド自体は成功する
- 著者はArka Pratim Chaudhuri（@arkapratimc）で、他の多くのWebpackエラー/警告（Tobias Koppers作）とは異なる
- makeSerializableによる登録がないため、永続キャッシュ非対応

---

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

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

### 推奨読解順序

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 基底クラスのプロパティ定義（17-38行目） |
| 1-2 | FalseIIFEUmdWarning.js | `lib/FalseIIFEUmdWarning.js` | 警告クラス定義。引数なしコンストラクタ、固定メッセージ（10-18行目） |

**読解のコツ**: NoModeWarning（No.17）と同様にコンストラクタに引数がなく、メッセージは完全にハードコードされている。

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

FalseIIFEUmdWarningの発行トリガーとなるEnableLibraryPlugin内のインラインプラグインを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | EnableLibraryPlugin.js | `lib/library/EnableLibraryPlugin.js` | UMD有効化処理内のiife === false検出とWarnFalseIifeUmdPlugin生成（236-254行目付近） |

**主要処理フロー**:
1. **236行目**: `compiler.options.output.iife = true` - 自動修正
2. **238-252行目**: WarnFalseIifeUmdPluginインラインクラス定義
3. **243-244行目**: compiler.hooks.thisCompilation.tapでフック登録
4. **246行目**: FalseIIFEUmdWarningの遅延require
5. **248行目**: `compilation.warnings.push(new FalseIIFEUmdWarning())` - 警告追加
6. **254行目**: `new WarnFalseIifeUmdPlugin().apply(compiler)` - プラグイン登録

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

```
EnableLibraryPlugin.apply(compiler)
    |
    +-- [UMDライブラリタイプ有効化時]
            |
            +-- [output.iife === false 検出]
                    |
                    +-- compiler.options.output.iife = true (自動修正)
                    |
                    +-- new WarnFalseIifeUmdPlugin().apply(compiler)
                            |
                            +-- compiler.hooks.thisCompilation.tap()
                                    |
                                    +-- [thisCompilation発火時]
                                            |
                                            +-- require("../FalseIIFEUmdWarning")
                                            |
                                            +-- new FalseIIFEUmdWarning()
                                            |
                                            +-- compilation.warnings.push()
```

### データフロー図

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

compiler.options.output.iife   --> EnableLibraryPlugin             --> output.iife = true (修正)
(=== false)                     |  - iife判定
                                |  - WarnFalseIifeUmdPlugin生成

thisCompilation                --> WarnFalseIifeUmdPlugin          --> compilation.warnings[]
フック発火                      |  FalseIIFEUmdWarning生成          --> コンソール警告出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラークラス |
| FalseIIFEUmdWarning.js | `lib/FalseIIFEUmdWarning.js` | ソース | 警告クラス定義 |
| EnableLibraryPlugin.js | `lib/library/EnableLibraryPlugin.js` | ソース | 検出・自動修正・警告発行元 |
