Webpackは、JavaScriptアプリケーションを構築するためのデファクトスタンダードとなった、強力なオープンソースのバンドラーです。依存関係のあるモジュールを受け取り、ブラウザやその他のランタイム環境に最適化された静的リソースを生成します。Webpack Documentation (2026)によると、エコシステムにはあらゆるビルドタスクに対応する15,000以上のローダーとプラグインがあります。
重要ポイント
Webpackは、アプリケーションの依存関係を分析し、ブラウザまたはサーバー向けの静的ファイルにパッケージ化するモジュールバンドラーです。2012年にTobias Koppersによって作成されたWebpackは、すべてのファイルがモジュールという概念により、すぐにビルドの標準となりました。JavaScript、CSS、画像、フォント、さらにはHTMLまでが、単一のローダーシステムを通じて処理されます。
Webpackは、当時としては革新的なアイデアを導入しました。ローダーを使用すると、importまたはrequireを介して任意のリソースを含めることができます。これにより、開発者はCSSプリプロセッサ(SCSS)、TypeScriptコンパイラ、画像最適化ツールを個別に使用する必要がなくなりました。2020年までに、80%以上のJavaScriptプロジェクトがWebpackを使用していました(npm statデータ:2019~2024年)。
競合製品(Vite、Parcel、Turbopack)はより高速な開発速度を提供しますが、Webpackは安定性、成熟したエコシステム、後方互換性により、エンタープライズ分野でリーダーシップを維持しています。大規模プロジェクトでWebpackからViteに移行するには数週間かかり、プラグインの非互換性によって妨げられることがよくあります。
Webpackは、エントリーポイントから開始して依存関係グラフを構築します。見つかった各importまたはrequireはグラフに追加され、ローダーのチェーンを通過してチャンクに配置されます。最終的な出力は構成によって異なります。単一のバンドル、複数のチャンク、またはUMD、CommonJS、ES Module形式のライブラリ出力です。
// Webpack 5の最小構成
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash:8].js',
clean: true,
},
module: {
rules: [
{ test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/ },
],
},
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, filename: 'vendor.[contenthash:8].js' } },
},
},
};
Webpack 5は、ファイルシステムベースの組み込みキャッシュを導入し、リビルドを2~5倍高速化しました。永続キャッシュは、実行間でモジュール変換結果を保存します。これはCI/CDで特に重要です。有効にするには、構成にcache: { type: 'filesystem' }を追加するだけです。
Webpackは、Entry(エントリーポイント)、Output(出力)、Loaders(変換)、Plugins(拡張)の4つの基本概念で動作します。これらの概念を理解することは、シンプルなサイトから複雑なエンタープライズアプリケーションまで、あらゆるビルドを構成するために必要です。
Entryは、1つ以上のエントリーポイントを定義する配列またはオブジェクトです。マルチエントリーは、マルチコンポーネントアプリケーションに使用されます。Outputは、出力ファイルのパス、名前テンプレート、公開URLを構成します。Mode(development、production、none)は、各モードに最適なプラグインとデフォルト値を自動的に有効にします。
Content Hash — ファイル名にコンテンツハッシュ([contenthash])を含めることで、長期キャッシュが保証されます。ブラウザは、コンテンツが変更された場合にのみ新しいファイルをロードします。SplitChunksPluginは、異なるエントリーからの共通の依存関係を自動的に個別のチャンクに抽出し、コードの重複を防ぎます。
Loadersは、ソースファイルを依存関係グラフに追加する前に変換します。各ローダーは、ファイルの内容を受け取り、JavaScriptモジュールを返す関数です。Pluginsは、起動から出力ファイルの生成まで、ビルドのライフサイクル全体にアクセスできる、より強力な拡張機能です。
| Loader | 目的 | 使用例 |
|---|---|---|
| babel-loader | ES6+/JSXをES5にトランスパイル | JSXを使用するReactコンポーネント |
| ts-loader | TypeScriptをJavaScriptにコンパイル | Angular、TypeScriptプロジェクト |
| css-loader | CSS内の@importとurl()を処理 | CSSモジュール、PostCSS |
| sass-loader | SCSS/SASSをCSSにトランスパイル | Bootstrap、カスタムテーマ |
| file-loader | ファイルを出力にコピー | 画像、フォント |
| svg-inline-loader | SVGをJavaScriptにインライン化 | アイコン、ロゴ |
Pluginsは、ローダーとは異なり、ビルドの任意の段階でアクションを実行できます。HtmlWebpackPluginは、リンクされたスクリプトを含むHTMLファイルを自動生成します。MiniCssExtractPluginは、並列読み込みのためにCSSを個別のファイルに抽出します。DefinePluginは、ビルド中に環境変数をアプリケーションコードに渡すことを可能にします。
Webpackは、ツリーシェイキング、コード分割、圧縮といった組み込みの最適化メカニズムを提供します。Tree shakingは、ESモジュールから未使用のエクスポートを削除します。Code splittingはimport()を介してバンドルを動的チャンクに分割します。Minimizer — JS用のTerserPluginとCSS用のCssMinimizerPlugin。
// webpack.config.js — プロダクションビルドの最適化
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: { compress: { drop_console: true }, mangle: true },
}),
new CssMinimizerPlugin(),
],
runtimeChunk: 'single',
splitChunks: {
chunks: 'async',
minSize: 20000,
maxAsyncRequests: 30,
},
},
};
Module Federationは、マイクロフロントエンドのためのWebpack 5の最も強力な機能です。実行時に他の独立したビルドからモジュールをロードできます。各マイクロアプリケーションは独立して開発およびデプロイされますが、ユーザーにとっては単一のインターフェースにまとめられます。Segment Analyticsは2021年から本番環境でModule Federationを使用しており、デプロイ時間を80%削減しています。
WebpackがReact Nativeで直接使用されることはめったにありません。これにはMetroが存在します。ただし、単一のコードベースをモバイルプラットフォーム(Metro経由)とWeb(Webpack経由)の両方でビルドするReact Native Webプロジェクトでは、Webpackが使用されます。Webpackは、IonicおよびCordovaのハイブリッドアプリケーションでも人気があります。
React Native WebをWebレンダリングに使用するプロジェクトでは、ネイティブモジュールをWeb実装に置き換えるエイリアスを使用してWebpackが構成されます。Alias react-native → react-native-webにより、インポートを変更せずに共有コンポーネントを使用できます。DefinePluginは、プラットフォーム固有のコードの条件付きコンパイルのためにプラットフォームフラグを渡します。
モバイルWeb向けのWebpack最適化はデスクトップとは異なります。モバイルファーストビルドには、積極的なミニフィケーション、画像の遅延読み込み、クリティカルCSSの優先読み込みが含まれます。CompressionPluginによるbrotli圧縮は、3G/4Gモバイルネットワーク向けにバンドルサイズを20~25%削減します。webpack-mergeを使用して、モバイルファーストとデスクトップ最適化のビルドなど、異なるプラットフォーム向けに構成を分割します。
Module Federationは、npmに公開せずに他の独立したビルドからJavaScriptモジュールをロードできる、Webpack 5の革新的な機能です。各マイクロアプリケーションは独立して開発され、独自のWebpack構成を持ち、個別にデプロイされます。Hostアプリケーションは、ModuleFederationPluginの特別な構成を介してリモートビルドからモジュールを接続します。
プロバイダーは選択したモジュールを公開(expose)し、ホストはremotesを使用してそれらを接続します。Module Federationは共有ライブラリをサポートしています。2つのマイクロアプリケーションでReactが使用されている場合、Webpackはそれを1回だけロードします。これにより、ユーザーのトラフィックが最大60%節約されます。SegmentやBest Buyを含む大企業は、本番環境でModule Federationを使用しており、デプロイ時間を数時間から数分に短縮しています。
Module Federationを使用する場合、開発者は異なるバージョンの共有依存関係の競合に頻繁に直面します。解決策は、重要なライブラリに対してrequiredVersionとsingleton: trueを明示的に指定することです。もう1つの問題は、特にReact ContextやReduxを使用する場合に、リモートビルドからコンポーネントをインポートする際のコンテキストの喪失です。これを解決するには、shared: { react: { singleton: true } }を使用して、すべてのマイクロアプリケーションが単一のReactインスタンスを使用するようにします。大規模なマイクロフロントエンドアーキテクチャでは、共有依存関係のバージョンを同期し、ビルドの一貫性を確保するために、Module Federationをモノレポシステム(Nx、Turborepo)と組み合わせて使用することをお勧めします。
よくある質問
Webpack 5は、永続キャッシュ(リビルドを最大5倍高速化)、マイクロフロントエンドのためのModule Federationの組み込みサポート、自動clean出力を導入しました。レガシーローダー(raw-loader、url-loader)と多くのNode.jsポリフィルが削除され、構成サイズが平均30%削減されました。
基本構成を生成するにはwebpack-cli initを使用します。一般的なプロジェクトでは、Webpack構成を隠すcreate-react-app(CRA)またはNext.jsを使用します。カスタム設定が必要な場合 — webpack-mergeを使用すると、さまざまな環境向けに構成を再利用可能なモジュールに分割できます。
Webpack Dev Serverは、HMR(Hot Module Replacement)をサポートする組み込みの開発サーバーです。ファイルの変更を監視し、ページを完全にリロードせずにブラウザ内のモジュールを更新します。モバイル開発の場合、host: '0.0.0.0'とHTTPS証明書を指定することで、開発サーバーをローカルネットワークからアクセス可能に構成できます。
Webpack 5は、画像処理に組み込みのAsset Modulesを使用します。asset/resourceはファイルをそのままコピーし、asset/inlineはbase64としてインライン化し(8KB未満のファイル)、assetはサイズに基づいて自動的に選択します。画像最適化には、WebP圧縮とロスレス最適化を備えたimage-webpack-loaderを追加します。
新しいプロジェクトの場合 — はい、Viteは大幅な速度向上をもたらします。数百のWebpackプラグインを使用する既存のエンタープライズプロジェクトの場合 — 移行には2~4週間かかる可能性があります。開発ビルドの速度がどれほど重要かを評価してください。完全ビルド時間が5分を超える場合は、移行が正当化されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。