📦

Remotionコード分析 — BundleシステムとWebpack/esbuild統合

bundle()がReactコンポーネントをレンダリング可能なHTMLに変換する過程をソースコードで追跡

GitHub: remotion-dev/remotion

Remotionのレンダリングはバンドリングから始まります。ReactコンポーネントがブラウザでHTMLとして実行可能になるまでの過程をソースコードで追跡します。


リポジトリ構造

packages/
├── bundler/              # Webpackベースバンドラー
│   ├── src/
│   │   ├── bundle.ts           # bundle()エントリポイント
│   │   ├── webpack-config.ts    # Webpack設定生成
│   │   └── index-html.ts        # HTMLテンプレート生成
├── core/                 # コアランタイム
│   ├── src/
│   │   ├── Composition.tsx      # <Composition>コンポーネント
│   │   ├── CompositionManager.tsx  # 登録されたCompositionの管理
│   │   └── register-root.ts     # registerRoot()エントリ
├── renderer/             # ローカルレンダラー
└── lambda/               # AWS Lambdaレンダリング

核心はwebpackConfiguration()が生成するWebpack設定です。TypeScriptのトランスパイルにesbuild-loaderを使用し、Webpackのバンドリング能力 + esbuildの高速トランスパイルのハイブリッド戦略です。

生成されたindex.htmlがHeadless Chromeにロードされ、main.bundle.jsが実行されるとReactが#remotion-rootにマウントされます。すべての<Composition>がCompositionManagerに登録され、レンダラーがwindow.getCompositions()で何をレンダリングするか決定します。

動作フロー

1

bundle(entryPoint)が呼ばれるとwebpackConfiguration()でWebpack設定を生成

2

esbuild-loaderがTSX → JSトランスパイル、Webpackが依存グラフをバンドル

3

index-html.tsが#remotion-root + main.bundle.jsを含むHTMLを生成

4

registerRoot()が実行されるとCompositionManagerがすべての<Composition>のメタデータを収集

5

window.getCompositions()を通じてレンダラーがfps/width/height/durationInFramesを照会

メリット

  • Webpack + esbuildハイブリッド: 互換性(Webpack)と速度(esbuild)の両方を確保
  • window.getCompositions()パターン: ブラウザ ↔ Node.js間のメタデータブリッジがきれい

デメリット

  • Webpack依存: 初回バンドリングが遅い場合がある(Vite移行の議論中)

ユースケース

Remotionカスタムビルドパイプライン構築時のバンドリング過程の理解 バンドルサイズ最適化: どのローダー/プラグインが適用されるか把握