# 通知設計書 17-NoModeWarning

## 概要

本ドキュメントは、Webpackにおけるmodeオプション未設定警告通知（NoModeWarning）の設計を定義する。NoModeWarningは、Webpack設定においてmodeオプションが設定されていない場合に発行される警告通知である。

### 本通知の処理概要

NoModeWarningは、Webpack設定ファイルでmodeオプション（'development', 'production', 'none'のいずれか）が指定されていない場合に、デフォルトで'production'モードが使用されることを開発者に通知する警告である。

**業務上の目的・背景**：Webpackのmodeオプションは、ビルド出力の最適化レベルやdevtool設定など多数のデフォルト値に影響する重要な設定項目である。modeが未設定の場合、意図しないproduction最適化が適用される可能性があり、開発時のデバッグが困難になることがある。この警告は、開発者がmodeを明示的に設定することを促し、意図しないビルド動作を防止する目的で設計されている。

**通知の送信タイミング**：WebpackOptionsApply.jsでオプション適用時に、options.modeがstring型でない場合（undefined等）にWarnNoModeSetPluginが登録され、compiler.hooks.thisCompilationフックのタイミングでcompilation.warningsに追加される。

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

**通知内容の概要**：modeオプションが未設定であること、デフォルトで'production'が使用されること、設定可能な値（'development', 'production', 'none'）の案内、公式ドキュメントへのリンクが含まれる。

**期待されるアクション**：開発者は、webpack.config.jsにmode: 'development'またはmode: 'production'を明示的に設定するか、CLIの--modeフラグを使用することが期待される。

## 通知種別

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

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（thisCompilationフック内で即座に追加） |
| 優先度 | 中（ビルドは成功するが最適化設定に影響） |
| リトライ | 無（1回の警告表示のみ） |

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

WebpackOptionsApply.jsでoptions.modeがstring型でないことが検出された場合、WarnNoModeSetPluginがcompilerに適用される。WarnNoModeSetPluginはcompiler.hooks.thisCompilationフックでcompilation.warningsにNoModeWarningインスタンスをpushする。

## 通知テンプレート

### メール通知の場合

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

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

### 本文テンプレート

```
configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
```

### 添付ファイル

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

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 設定検証 | WebpackOptionsApply処理 | typeof options.mode !== "string" | WebpackOptionsApply.js 557行目付近 |
| コンパイル開始 | compiler.hooks.thisCompilation | WarnNoModeSetPluginが登録されている場合 | WarnNoModeSetPlugin.js 21行目 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| mode: 'development'が設定されている場合 | 警告は発行されない |
| mode: 'production'が設定されている場合 | 警告は発行されない |
| mode: 'none'が設定されている場合 | 警告は発行されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[WebpackOptionsApply処理開始] --> B{typeof options.mode === 'string'?}
    B -->|Yes| C[mode設定済み - 警告なし]
    B -->|No| D[WarnNoModeSetPlugin登録]
    D --> E[compiler.hooks.thisCompilation発火]
    E --> F[NoModeWarning生成]
    F --> G[compilation.warnings.push]
    G --> H[終了]
    C --> H
```

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

### 参照テーブル一覧

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

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| options.mode | mode設定値の確認 | Webpack設定オブジェクト |

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

#### NoModeWarningインスタンス

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

### 更新テーブル一覧

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

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

| 操作 | 項目（プロパティ名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | compilation.warnings[] | NoModeWarningインスタンス | thisCompilationフック内 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| N/A | - | 本通知は警告であり、エラーケースは存在しない |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

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

## 備考

- コンストラクタは引数なしで、メッセージは完全に固定文字列
- WebpackOptionsApply.jsでの条件判定は`typeof options.mode !== "string"`であり、mode: nullやmode: undefinedの場合に発火する
- makeSerializableによる登録がないため、永続キャッシュ非対応
- thisCompilationフックを使用しているため、各コンパイルごとに1回だけ警告が発行される

---

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

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

### 推奨読解順序

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

NoModeWarningは非常にシンプルなクラスである。

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

**読解のコツ**: module.exportsに直接クラス式を代入するパターンを使用している。コンストラクタには引数がなく、メッセージは完全にハードコードされている。

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

NoModeWarningの発行トリガーとなるWarnNoModeSetPluginとWebpackOptionsApplyを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | WebpackOptionsApply.js | `lib/WebpackOptionsApply.js` | mode未設定チェック（557-561行目付近） |
| 2-2 | WarnNoModeSetPlugin.js | `lib/WarnNoModeSetPlugin.js` | thisCompilationフックでの警告追加（14-25行目） |

**主要処理フロー**:
1. **557行目**: `if (typeof options.mode !== "string")` - mode設定チェック
2. **558行目**: WarnNoModeSetPluginのrequire
3. **560行目**: `new WarnNoModeSetPlugin().apply(compiler)` - プラグイン登録
4. **21行目（WarnNoModeSetPlugin.js）**: `compiler.hooks.thisCompilation.tap` - フック登録
5. **22行目（WarnNoModeSetPlugin.js）**: `compilation.warnings.push(new NoModeWarning())` - 警告追加

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

```
webpack()
    |
    +-- WebpackOptionsApply.process()
            |
            +-- [mode未設定チェック]
                    |
                    +-- new WarnNoModeSetPlugin().apply(compiler)
                            |
                            +-- compiler.hooks.thisCompilation.tap()
                                    |
                                    +-- [thisCompilation発火時]
                                            |
                                            +-- new NoModeWarning()
                                            |
                                            +-- compilation.warnings.push()
```

### データフロー図

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

options.mode           --> WebpackOptionsApply             --> WarnNoModeSetPlugin登録
(undefined/null)        |  typeof !== "string" チェック

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

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラークラス |
| NoModeWarning.js | `lib/NoModeWarning.js` | ソース | 警告クラス定義 |
| WarnNoModeSetPlugin.js | `lib/WarnNoModeSetPlugin.js` | ソース | 警告発行プラグイン |
| WebpackOptionsApply.js | `lib/WebpackOptionsApply.js` | ソース | プラグイン登録元（mode未設定判定） |
