フロントエンド - ビルド・ツール

webpack うぇぶぱっく

モジュールバンドラーJavaScriptバンドルローダープラグインビルドツール
webpackについて教えて

簡単に言うとこんな感じ!

バラバラに作ったJavaScriptのファイルや画像・CSSをまとめて「1つのパッケージ」に梱包してくれる引越し業者みたいなやつだよ!ブラウザに渡す前に荷物を整理・圧縮してくれるから、Webサイトが速く動くようになるんだ!


webpackとは

webpackは、モジュールバンドラー(Module Bundler)と呼ばれるツールのひとつです。現代のWebアプリ開発では、JavaScriptのコードを機能ごとに小さなファイル(モジュール)に分けて書くのが一般的ですが、そのままブラウザに渡すと何十・何百ものファイルをそれぞれ読み込む必要があり、パフォーマンスが悪化します。webpackはこれらのファイルを解析し、依存関係を解決しながら1つ(または少数)のファイルにまとめ(バンドルし)てくれます。

JavaScriptだけでなく、CSS・画像・フォントなどあらゆる種類のファイルをモジュールとして扱えるのがwebpackの最大の特徴です。import文を辿って依存関係のグラフを構築し、最終的にブラウザが読み込める形式に変換・出力します。React・Vue・Angularなど主要なフロントエンドフレームワークのプロジェクトで長年デファクトスタンダード(事実上の標準)として使われてきました。


webpackの核心:バンドルの仕組み

webpackはエントリーポイント(起点となるファイル)から始めて、importrequireを辿りながら依存グラフを構築し、最終的にバンドル(束)として出力します。

概念役割
Entry(エントリー)バンドルの起点となるファイルsrc/index.js
Output(アウトプット)バンドルの出力先・ファイル名dist/bundle.js
Loader(ローダー)JS以外のファイルを変換する処理css-loader, babel-loader
Plugin(プラグイン)バンドル全体に対して処理を行う拡張HtmlWebpackPlugin
Mode(モード)開発用・本番用の最適化切り替えdevelopment / production

ローダーとプラグインの違いの覚え方

  • Loader(ローダー)= 食材の下ごしらえ係:個々のファイルを「JS が食べられる形」に変換する
  • Plugin(プラグイン)= シェフ:できあがった料理全体に仕上げ(最適化・HTML生成など)を施す

主なローダーの種類

ローダー変換内容
babel-loader最新JSを古いブラウザ向けに変換(ES6+ → ES5)
css-loaderCSSファイルをJSから読み込めるようにする
style-loaderCSSをDOMに注入する
file-loader / asset/resource画像・フォントをコピーしURLを解決する
ts-loaderTypeScriptをJSに変換する
sass-loaderSassをCSSに変換する

歴史と背景

  • 2012年 — Tobias Koppers(ドイツの開発者)が個人プロジェクトとして開発開始。当時はBrowserifyが主流だったが、CSSや画像も扱えるより柔軟なバンドラーを目指した
  • 2014年 — InstagramがReactと組み合わせてwebpackを採用し、一気に注目を集める
  • 2016年 — webpack 2リリース。Tree Shaking(使われていないコードを削除する機能)を標準サポート
  • 2017年 — webpack 3リリース。Scope Hoistingで実行速度が向上
  • 2018年 — webpack 4リリース。modeの追加でゼロコンフィグ(設定なし)でも動作可能に。ビルド速度も大幅改善
  • 2020年 — webpack 5リリース。モジュールフェデレーション(複数アプリ間でモジュールを共有)など高度な機能を追加。長期的な安定版として現在も広く使用される
  • 2021年以降ViteesbuildなどRustGoベースの高速バンドラーが台頭。webpackも大規模プロジェクトでは依然主力だが、ツール選定の多様化が進む

関連ツールとの比較

webpackは万能ですが、用途によって使い分けるツールも増えています。

ツール特徴向いているケース
webpack設定の柔軟性が高い。大規模・複雑な構成に対応大規模SPA・複雑なビルド要件
Vite開発時はネイティブESM、ビルドはRollup。超高速新規プロジェクト・中小規模SPA
Rollupライブラリ向け。Tree Shakingが優秀npmパッケージの作成
esbuildGo製で圧倒的に速い。設定はシンプル高速なトランスパイルが必要な場面
Parcel設定不要で即使える。ゼロコンフィグ小規模・プロトタイプ

webpackのビルドフロー(SVG図解)

Entry Point src/index.js 依存グラフ構築 import を解析 モジュール収集 JS / CSS / 画像 Loader 処理 各ファイルを変換 Plugin 処理 最適化・HTML生成 Output dist/bundle.js webpackのビルドフロー:Entry → 依存解析 → Loader変換 → Plugin最適化 → Output

webpack.config.js の基本構成

// webpack.config.js(本番用の基本例)
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');

module.exports = {
  mode: 'production',           // 本番モード(自動で最適化)
  entry: './src/index.js',      // エントリーポイント
  output: {
    filename: 'bundle.[contenthash].js', // ハッシュ付きファイル名
    path: path.resolve(__dirname, 'dist'),
    clean: true,                // ビルド前にdistを掃除
  },
  module: {
    rules: [
      {
        test: /\.js$/,          // .jsファイルに適用
        use: 'babel-loader',    // Babelで変換
        exclude: /node_modules/,
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'], // 右から順に適用
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html', // HTMLを自動生成
    }),
  ],
};

関連する規格・RFC

※ webpackはIETF RFCやISO規格で定義されたプロトコルではなく、OSSツールです。ただし、モジュールの記法については以下の仕様が関連します。

仕様内容
ECMAScript Modules (ESM)import/export 構文の標準仕様(TC39/ECMA-262)
CommonJS Modulesrequire()/module.exports の仕様。Node.js の標準形式

関連用語

  • Vite — 次世代フロントエンドビルドツール。開発時の起動が超高速
  • Babel — 最新JavaScriptを古いブラウザ向けに変換するトランスパイラー
  • npm — Node.jsのパッケージ管理ツール。webpackはnpmでインストールする
  • Node.js — サーバーサイドJavaScript実行環境。webpackの動作基盤
  • Tree Shaking — 使われていないコードを削除してファイルサイズを削減する技術
  • ソースマップ — バンドル後のコードと元コードを対応付けるデバッグ補助ファイル
  • モジュール — 機能を分割した再利用可能なコードの単位
  • SPA(シングルページアプリケーション) — webpackが最も多く使われるWebアプリの構成パターン