目標
webpackで複数entryを簡単に実現するためのパッケージglobの使い方をまとめます。
関連するドキュメントはネット上にありますが、必要とする情報が分散していたためまとめて記事とします。
前提とする環境
本記事で前提とする環境は以下の通りです。バージョンが異なる場合、この記事の内容は適用できない場合があります。記事を読む前にバージョンをご確認ください。
- macOS : 10.15.6
- webpack : 4.44.1
- glob : 7.1.6
node-glob
インストールはnpm上から行えます。
npm i glob
基本的な使い方
▼webpack.config.js
const glob = require("glob");
const entries = glob.sync("./src/**/*.js");
module.exports = {
entry: entries,
...
}
基本的な記法は、.gitignoreで見慣れたminimatchと同じです。
上記の例の場合、srcフォルダー以下のすべてのjsファイルを取り出して、entryに渡しています。
これでディレクトリ構造を保ったまま、複数のentryをwebpackに渡せます。
除外
▼webpack.config.js
const entries = glob.sync("./src/**/*.js", {
ignore: './src/**/_*.js'
})
第2引数のOptionオブジェクトのignoreに除外パターンを追加することで、検索結果から特定のファイルを除外できます。
上記の例の場合_
から始まるファイルネームを持つファイルを除外します。
ignoreはstringもしくは配列で指定します。複数のパターンを除外する場合は配列を与えます。
検索ディレクトリの変更
▼webpack.config.js
const entries = glob.sync("**/*.js", {
cwd: "./src"
});
オプションにcwd
を設定すると、そのディレクトリをルートとして検索が行われます。
もしも以下のようなファイル群があったとして
./src/script1.js
./src/script2.js
./src/sub/script3.js
./src/sub/script4.js
cwdを設定した結果は
[ "script1.js",
"script2.js",
"sub/script3.js",
"sub/script4.js" ]
という配列で出力されます。
出力フォルダーの調整
▼webpack.config.js
const path = require("path");
const glob = require("glob");
const srcDir = "./src";
const entries = glob
.sync("**/*.js", {
ignore: "**/_*.js",
cwd: srcDir,
})
.map(function (key) {
// [ '**/*.js' , './src/**/*.js' ]という形式の配列になる
return [key, path.resolve(srcDir, key)];
});
// 配列→{key:value}の連想配列へ変換
const entryObj = Object.fromEntries(entries);
module.exports = {
entry: entryObj,
output: {
path: path.join(__dirname, "dist"),
filename: "[name]",
},
};
glob.sync()の戻り値はstring配列です。出力フォルダーの調整を行う場合、この配列を{key:value}の連想配列に整形する必要があります。
複数エントリー指定の正確な仕様については公式ドキュメントを参照してください。
出力ファイル名は'[name]'と指定しておくことで、entryのファイル名を維持したまま出力が可能です。