# バッチ設計書 46-gulp rollup-babel-standalone

## 概要

本ドキュメントは、Babelプロジェクトにおける@babel/standaloneバンドルバッチ `gulp rollup-babel-standalone` の設計について記載する。このバッチはブラウザで直接使用可能なUMDフォーマットのBabelバンドルを生成する。

### 本バッチの処理概要

**業務上の目的・背景**：ブラウザ上でBabelを直接使用できるスタンドアロン版のバンドルを生成するためのバッチである。@babel/standaloneは、ビルドツールを使用せずにブラウザ上でJavaScript/TypeScriptコードをトランスパイルする用途で使用される。REPLサイト、オンラインコードエディタ、教育目的のデモなど、クライアントサイドでのコード変換が必要な場面で活用される。

**バッチの実行タイミング**：`gulp build-babel-standalone` の一部として実行される。また、standaloneバンドルのみを更新したい場合に単独で実行可能。リリース時やPR確認用のビルドで使用される。

**主要な処理内容**：
1. @babel/standaloneのソースコードを入力としてRollupビルドを実行
2. すべての依存関係をバンドルに含める（外部依存関係なし）
3. Node.js組み込みモジュールのポリフィル適用
4. UMDフォーマットで出力（グローバル変数Babelとしてエクスポート）
5. 公開ビルド時（IS_PUBLISH=true）にTerserで圧縮版（babel.min.js）を生成

**前後の処理との関連**：`generate-standalone` タスクでplugins.tsを生成した後に実行される。`gulp build-babel-standalone` は両タスクをgulp.seriesで連結している。

**影響範囲**：packages/babel-standalone/にbabel.jsとbabel.min.js（公開時のみ）が生成される。

## バッチ種別

ビルド処理（スタンドアロンバンドル）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | リリース時、PR確認時、または随時 |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | gulp build-babel-standalone経由またはyarn gulp rollup-babel-standalone |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js環境 | Node.js 20以上が必要 |
| 依存関係インストール済み | `yarn install` によりnode_modulesが構築済みであること |
| plugins.ts生成済み | generate-standaloneタスクが実行済みであること |
| Rollup依存関係 | rollup-plugin-polyfill-node等がインストール済み |

### 実行可否判定

packages/babel-standalone/src/index.tsとplugins.tsが存在すればビルド可能。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| NODE_ENV | 環境変数 | No | development | productionでソースマップ生成 |
| IS_PUBLISH | 環境変数 | No | false | trueで圧縮版も生成 |
| CIRCLECI | 環境変数 | No | 未設定 | Terserのワーカー数を1に制限 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| packages/babel-standalone/src/index.ts | TypeScript | エントリポイント |
| packages/babel-standalone/src/generated/plugins.ts | TypeScript | 生成されたプラグインリスト |
| node_modules/** | JavaScript | 依存パッケージ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| packages/babel-standalone/babel.js | JavaScript (UMD) | 非圧縮版バンドル |
| packages/babel-standalone/babel.js.map | Source Map | ソースマップ（production時） |
| packages/babel-standalone/babel.min.js | JavaScript (UMD) | 圧縮版バンドル（IS_PUBLISH時） |
| packages/babel-standalone/babel.min.js.map | Source Map | 圧縮版ソースマップ（IS_PUBLISH時） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | babel.js / babel.min.js |
| 出力先 | packages/babel-standalone/ |
| 文字コード | UTF-8 |
| モジュール形式 | UMD |
| グローバル変数 | Babel |

## 処理フロー

### 処理シーケンス

```
1. Rollupバンドル設定
   ├─ buildStandalone: true で実行
   ├─ すべての依存関係をバンドル（external: []）
   └─ プラグイン設定
       ├─ rollupStandaloneInternals（内部処理）
       ├─ rollupBabelSource（ソース変換）
       ├─ rollupReplace（process.env.NODE_ENV置換）
       ├─ rollupCommonJs（CJS変換）
       ├─ rollupBabel（Babelトランスパイル）
       ├─ rollupNodeResolve（ブラウザ対応）
       ├─ rollupJson（JSON読み込み）
       └─ rollupPolyfillNode（Node.jsポリフィル）

2. UMDバンドル出力
   └─ babel.jsをpackages/babel-standaloneに出力

3. 圧縮版生成（IS_PUBLISH時のみ）
   ├─ Terserで圧縮
   ├─ ASCII文字のみ出力（WebKit互換性）
   └─ babel.min.jsを出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[Rollup設定構築<br>buildStandalone: true]
    B --> C[プラグイン設定]
    C --> D[rollupPolyfillNode<br>Node.jsポリフィル]
    D --> E[UMDバンドル生成]
    E --> F{IS_PUBLISH?}
    F -->|No| G[圧縮スキップ<br>警告ログ出力]
    F -->|Yes| H[Terserで圧縮]
    H --> I[babel.min.js出力]
    G --> J[バッチ終了]
    I --> J
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | バンドルエラー | 依存関係解決失敗時 | yarn installの再実行 |
| - | Terserエラー | 圧縮処理失敗時 | ソースコードの構文確認 |
| - | メモリ不足 | 大規模バンドル時 | Node.jsメモリ上限の増加 |

### リトライ仕様

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

### 障害時対応

バンドルエラー時は、依存関係の整合性を確認し、yarn installを再実行する。圧縮エラーの場合は、非圧縮版（babel.js）で問題の有無を切り分ける。

## トランザクション仕様

本バッチはデータベーストランザクションを使用しない。

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1パッケージ（多数の依存関係含む） |
| 目標処理時間 | 3〜10分（圧縮含む） |
| メモリ使用量上限 | 2GB〜4GB |

## 排他制御

単一パッケージの処理のため、特別な排他制御は不要。CircleCI環境ではTerserのワーカー数を1に制限してリソース競合を回避。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | バンドル開始時 | Compiling '...' with rollup ... |
| スキップログ | IS_PUBLISH未設定時 | Skipped minification of ... because not publishing |
| 圧縮ログ | 圧縮開始時 | Minifying '...'... |
| エラーログ | エラー発生時 | エラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド時間 | 15分超過 | CI/CDシステム通知 |
| ビルド失敗 | 1回 | CI/CDシステム通知 |

## 備考

- standaloneバンドルは通常のbuild-rollupとは別に処理される（除外パッケージ）
- UMDフォーマットにより、scriptタグでの読み込みとモジュールシステム両方に対応
- rollupPolyfillNodeでNode.js組み込みモジュール（path、fs等）をブラウザ向けにポリフィル
- process.env.NODE_ENVは文字列として埋め込まれる
- require.resolveはエラーをスローするコードに置換される（ブラウザ非対応）
- ascii_only: trueでWebKitのバグ（#212725）を回避
- @jridgewellパッケージのUMD版をESM版に置換するカスタムresolveIdがある
