お役立ちコラム
フロントエンド

【Webpack入門】インストール方法とJavaScriptファイルのバンドル手順

※本記事には広告が含まれます

今回から複数回に渡って、モジュールバンドラー「Webpack」の使い方を解説していきます。

Webpackを使うことで、複数のJavaScriptファイルを1つのファイルにまとめられるほか、SassをCSSにコンパイルしたり、VueやReactといったブラウザがそのままでは理解できないコードを、ブラウザで動作するJavaScriptに変換したりすることができます。

Web制作の現場では「あると便利」なツールという位置づけですが、モダンなフロントエンド開発においては、ほぼ必須の開発環境となっています。

これからWebpackの導入を検討しているコーダーの方は、ぜひ最後までご覧下さい。

※本記事は、Webpack 5(v5.104.1)を使用した環境を前提としています。

Webpackを使用するメリット

Webpackのメインの機能は、複数のJavaScriptファイルを1つのファイルにまとめるモジュールバンドラーとしての機能です。

Webpackのようなモジュールバンドラーが存在する前は、JavaScriptファイルを1つずつ個別に読み込む必要があり、読み込み順を間違えると、エラーが発生するといった問題がありました。

また、ファイル数が増えることでHTTPリクエスト数も増加し、ページ表示速度が低下しやすいという課題がありました。

Webpackでは、ビルド時にJavaScriptファイルの依存関係を解析し、複数のファイルを1つ(または必要に応じて複数)にまとめて出力することで、これらの課題を解決してくれます。

◾️Webpackを使用するメリット

  • 依存関係を自動で解決して、複数のJavaScriptファイルを1つにまとめられる
  • CSSや画像もJavaScriptファイル1つにまとめられる
  • 開発時にはファイルをモジュール毎に分けて管理できる
  • Sassのコンパイルやベンダープレフィックスの付与、JavaScriptファイルの文法チェックなど、さまざまな処理を自動化できる

など

Webpackを使用する上で必要な環境

Webpackは、Node.js上で動作します。

そのため、Webpackを利用するには、あらかじめNode.jsをインストールしておく必要があります。

Node.jsをインストールすると、パッケージ管理ツールであるnpmも同時に利用できるようになり、コマンドラインを使ってWebpackや各種プラグインのインストール・管理が可能になります。

Node.js・npmの基本や、インストール方法については以下の記事で詳しく解説していますので、インストールがまだの方はこちらをご覧下さい。

(関連記事)npmとは?Voltaを使ってNode.jsとnpmをインストールする方法

Webpackのインストール方法

Node.js・npmのインストールが完了したら、Webpackをインストールする方法を解説します。

今回は、Webpack解説用に「webpack-test」というプロジェクトフォルダを用意しました。

このフォルダにWebpackをインストールし、基本的な設定を行っていきます。

Webpackをインストールするには、コマンドラインを起動します。

今回は、Visual Studio Codeからターミナルを開いてWebpackをインストールしてみます。

プロジェクトフォルダをVisual Studio Codeにドラッグ&ドロップします。

「ターミナル>新しいターミナル」をクリックします。

すると、カレントディレクトリが「webpack-test」になった状態でターミナルが起動します。

ここで、まずはnpmプロジェクトの初期化を行いたいので、以下のコマンドを実行します。

npm init -y

そうすると、npmプロジェクトが初期化されて、package.jsonファイルが生成されました。

なお、package.jsonファイルにtypeが指定されている場合は、削除しておきましょう

{
  "name": "webpack-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs", // 削除
  "devDependencies": {
    "webpack": "^5.104.1",
    "webpack-cli": "^6.0.1"
  }
}

続いて、Webpackの本体をインストールします。

Webpackは以下のコマンドで、インストールできます。

npm install -D webpack webpack-cli

上のコマンドでは、「webpack」と「webpack-cli」の2つのパッケージをインストールしていますが、前者はモジュールバンドラー本体で、後者はWebpackをコマンドラインから操作するためのツールです。

Webpackを使用する際は、この2つのパッケージをセットでインストールする必要があります。

インストールができると、package.jsonファイルの「devDependencies」に「webpack」「webpack-cli」の2つのパッケージが追加されていることが確認できます。

{
  "name": "webpack-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^5.104.1",
    "webpack-cli": "^6.0.1"
  }
}

JSファイルをバンドルする方法

続いて、Webpackで複数のJSファイルをバンドルする(1つにまとめる)方法を解説します。

Webのフロントエンド開発では、コードの可読性や保守性の観点から、機能ごとにJavaScriptファイルを分けて管理するのが一般的です。

このように、機能単位で分割されたJavaScriptファイルのことを「モジュール」と呼びます。

モジュールは、本来それぞれが独立したファイルとして存在しますが、ブラウザでそのまま読み込む場合は、モジュールの数だけHTTPリクエストが発生してしまいます。

そこでWebpackを使用することで、開発時はJavaScriptファイルを分割したまま管理しつつ、本番では1つのファイルにまとめる構成を取ります。

なお、JavaScriptをモジュールとして記述する方法はいくつかありますが、現在では標準仕様であるES Modules形式を使用するのが一般的です。

まずは、srcフォルダにindex.jsとsub.jsを用意しました。

そのうちsub.jsに処理を記述し、index.jsからそのファイルを読み込むようにします。

ESモジュールでは、import / export構文によってJavaScriptモジュールを読み込むことができます。

import { sayHello } from "./sub";

sayHello("Webpack");
export function sayHello(name) {
  console.log(`Hello, ${name}!`);
}

上記の例では、index.jsがエントリーポイントとなり、import文によってsub.jsに定義された処理を読み込んで実行していますが、Webpackでは、このエントリーポイントを起点として、読み込まれているモジュールをたどりながら、複数のJavaScriptファイルを1つにまとめます。

次に、Webpackの設定ファイルを作成し、エントリーポイントやバンドル後の出力先を設定していきます。

Webpackの設定ファイルは、「webpack.config.js」という名前で作成します。

以下は、エントリーポイントと出力先を指定した、最小限の設定例です。

const path = require("node:path"); 

module.exports = {
  entry: "./src/index.js", 
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
};

それぞれの記述の意味は以下の通り。

const path = require("node:path"); // Node.jsに標準で用意されているpathモジュールの読み込み

module.exports = {
  entry: "./src/index.js", // エントリーポイントの指定
  output: {
    // 出力先ディレクトリを絶対パスで指定
    // __dirnameは、このwebpack.config.jsが置かれているディレクトリ
    // path.resolveを使うことで、webpack.config.jsがあるディレクトリ配下のdistを出力先として指定
    path: path.resolve(__dirname, "dist"),
    filename: "main.js", // 出力時のファイル名の指定
  },
};

ここまで設定が完了したら、最後にWebpackのコマンドを実行します。

npx webpack

これで「dist」フォルダが作成され、その中にindex.jsとsub.jsがまとめられたmain.jsが生成されます。

なお、ターミナル上に「WARNING」が出ていますが、これはmodeオプションをセットしていないためです。

Webpackでは、modeオプションによってビルドの挙動(開発中のコードを、本番用に使いやすく整えるための処理のしかた)が切り替わります。

modeを指定していない場合、Webpackは自動的にproductionモード(本番環境向け)で動作し、ファイルサイズを小さくするためにコードが圧縮・最適化された状態で出力されます。

一方、developmentモードを指定すると、コードの圧縮は行われず、ブラウザ上でソースマップを確認しながらデバッグしやすい形で出力されます。

const path = require("node:path");

module.exports = {
  mode: "development",
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
};
developmentモードではブラウザのコンソールでエラーを確認した際に、どのファイルのどの行でエラーが起きたのかが分かりやすく表示される
productionモードではコードが圧縮・最適化されるため、エラー発生箇所を元のソースコードまで辿れない

基本的には、開発時にはdevelopmentを指定し、ウェブサイトを公開する際にはproductionに設定します。

Webpackではwebpack.config.js ファイルを用意していない場合、自動的にsrc/index.jsがエントリーポイントとして扱われ、出力先はdist/main.jsになります。また、この場合のビルドモードはproductionが使用されます。

そのため、特別な設定を行っていなければ、webpack.config.jsを削除して再度npx webpackを実行しても、同じ結果が得られます。

ビルド時間を短縮するwatchモードについて

WebpackでJavaScriptファイルをバンドルするには、modeに限らず毎回npx webpackを実行してビルドを行う必要がありますが、都度コマンドを入力し、ビルドが完了するのを待つのは手間がかかります。

そこで、ビルド時にwatchモードを指定することで、ファイルの変更を監視し、保存時に自動で再ビルドされるように設定できます。

npx webpack --watch

watchモードを使用すると、開発中にコマンドを再実行する必要がなくなり、作業効率を大きく向上させることができます。

依存関係のないJSファイルをまとめてバンドルする方法

上の例では、index.jsとsub.jsには依存関係がある場合のバンドル方法を解説しました。

しかし、以下のようにindex.jsとsub.jsに依存関係がない場合、エントリーポイントに指定したJavaScriptファイルのみがバンドル対象となり、2つのファイルを1つにまとめることはできません。

function sayHello(name) {
  console.log(`Hello, ${name}!`);
}

sayHello("Webpack");
function sayHey(name) {
  console.log(`Hey, ${name}!`);
}

sayHey("Webpack");

依存関係のないJavaScriptファイルをまとめてバンドルしたい場合は、entryに配列形式でまとめたいJavaScriptファイルを指定します。

const path = require("node:path");

module.exports = {
  mode: "production",
  entry: ["./src/index.js", "./src/sub.js"],
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
};

entryに配列を指定すると、それぞれのファイル間に依存関係がなくても、まとめて1つのバンドルファイルとして出力されます。

複数のエントリーポイントを使って、複数のJavaScriptファイルを出力する方法

MPAサイト(ページごとにサーバーから新しいHTMLを取得する形式のサイト)では、ホームページではhome.js、アバウトページではabout.jsのように、ページごとに読み込むJavaScriptファイルを分けたい場合があります。

その場合は、ページごとにエントリーポイントを分けることで、ビルド時に複数のバンドルファイルを出力することができます。

複数のエントリーポイントから複数の出力ファイルを生成するには、entryにオブジェクト形式でエントリーポイントを指定します。

const path = require("node:path");

module.exports = {
  mode: "production",
  entry: { home: "./src/home.js", about: "./src/about.js" },
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "[name].js",
  },
};

outputのファイル名を[name].jsと指定すると、オブジェクトのキーが出力されるバンドルファイル名となります。

まとめ

今回はWebpackの入門として、Webpackの概要やインストール方法、JavaScriptファイルをバンドルする方法など、基本的な使い方を解説しました。

本記事では、Webpackを使ってJavaScriptファイルのバンドルのみを行いましたが、WebpackではCSSや画像もJavaScriptファイルにバンドルすることができます。

そこで次回は、Webpackを使ってSassをコンパイルする方法や、コンパイルされたCSSをJavaScriptファイルにバンドルしたり、ベンダープレフィックスを付与したりする方法など、広くCSSを扱う方法について解説します。

今回は以上になります。最後までご覧頂き、ありがとうございました。

Webサイトのスポット修正・保守ならお任せ下さい!

ちょっとした修正や調整をしたいけれど、「制作会社に頼んだら高額になりそう」「どこに相談すればいいかわからない」そんなお悩みはありませんか?

弊所「E-VALUE WORKS」では、テキスト修正や軽微な調整などのスポット対応から、月額での保守・管理(外部Web担当)まで、ニーズに合わせたWebサイトの修正・保守サービスを提供しています。

「これって依頼できる?」という段階でも構いません。まずはお気軽にご相談ください。

E-VALUE WORKS アイコン
HOMEお役立ちコラムフロントエンド【Webpack入門】インストール方法とJavaScriptファイルのバンドル手順