モジュールバンドラーとは

モジュールバンドラーは、複数の JavaScript ファイル(モジュール)を1つまたは少数のファイルにまとめるツールです。ブラウザでの読み込みを最適化し、開発体験を向上させます。

なぜバンドラーが必要か

ES Modules をそのままブラウザで使用する場合、いくつかの問題があります。

HTTP リクエストの増加

モジュールごとにリクエストが発生し、特に深い依存関係があるとパフォーマンスが低下します。

npm パッケージの扱い

node_modules のパッケージをブラウザで直接使用するのは困難です。

バンドラーはこれらの問題を解決し、最適化されたコードを生成します。

バンドラーの役割

複数のモジュールを1つ(または少数)のファイルに結合

依存関係を解決し、必要なコードだけを含める

トランスパイル(ES6+ → ES5 など)と最適化

コード分割で必要なタイミングで読み込み

主要なバンドラー

ツール特徴
Webpack高機能で設定の自由度が高い、大規模プロジェクト向け
Vite高速な開発サーバー、ESM ベース、モダン開発向け
Rollupライブラリ向け、Tree Shaking に優れる
esbuild非常に高速、Go 製
Parcel設定不要で始められる

Webpack の基本

// webpack.config.js
export default {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: '/dist'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader'
      }
    ]
  }
};

Vite の基本

Vite は開発時に ES Modules をそのまま使用し、本番ビルドでは Rollup でバンドルします。

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    outDir: 'dist'
  }
});
開発モード

ES Modules をネイティブで使用、変更されたファイルのみ更新(HMR)

本番ビルド

Rollup でバンドル、最適化、コード分割

バンドルの仕組み

バンドラーは依存関係グラフを構築し、必要なコードをまとめます。

// entry point: index.js
import { add } from './math.js';
import { format } from './utils.js';

console.log(add(1, 2));
依存関係グラフ:
index.js
├── math.js
└── utils.js
    └── helper.js

このグラフに基づいて、すべてのコードが1つのファイルにまとめられます。

開発サーバーと HMR

モダンなバンドラーは、開発サーバーと HMR(Hot Module Replacement)を提供します。

ファイルを保存すると自動的にブラウザが更新される
状態を維持したまま変更が反映される
再読み込みなしで即座に変更を確認できる

バンドラーなしの選択肢

シンプルなプロジェクトでは、バンドラーなしで ES Modules を直接使用することもできます。

バンドラーが不要な場合

小規模なプロジェクト、プロトタイピング、Import Maps を使用する場合

バンドラーが必要な場合

npm パッケージを多用、本番環境での最適化が必要、レガシーブラウザ対応

バンドラーは現代のフロントエンド開発において重要なツールであり、プロジェクトの規模や要件に応じて適切なツールを選択することが重要です。