webpackとエントリーポイント
皆様、webpackは使っていますか?
一部では脱webpackという流れもあるような話を見かけましたが、
私はwebpack大好きでJS関連のプロダクトの場合はとりあえず入れてます。
しかし、webpackにはわかりづらい点があります。
loaderやruleあたりのチェインもそれなりにわかりづらいのですが、1
それ以前の基本的な設定である、entry
と[name]
の関連性です。
わかってしまえば簡単なのですが、私は最初ハマりました。
この記事はごく基本的なentry
のことについて記載します。
entry
とは
公式ドキュメントの以下のあたりに書いている
https://webpack.js.org/concepts/entry-points/
module.exports = {
entry: './path/to/my/entry/file.js',
};
こういうやつです。
設定しない場合の挙動
entry
を設定していない場合、webpackは
./src/index.js
を./dist/main.js
に出力する
という挙動になります。2
細かく書くと、
-
./src/index.js
をエントリーポイントとし -
index.js
内でimport、requireされ使われているファイルをバンドルして -
./dist/main.js
に出力する
という動きです。
entry
,output
のデフォルト値
このデフォルトの挙動は、当然ながら設定で変更できます。
しかし、そもそものデフォルトの設定値がマニュアルには載っていません(たぶん)
デフォルトの設定値を記載すると、以下のようになります。
module.exports = {
entry: './src',
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
};
これは、以下の設定しているのと同じことです。
module.exports = {
entry: {
main: './src'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
};
つまり、実質、
module.exports = {
entry: {
main: './src/index.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
};
としているのと同じです。
理解していないとハマる
これらのデフォルト値と挙動は、理解していないと少し複雑なことをしようとするとハマります。
例1:エントリーポイントと出力先を変更する
エントリーポイントを./src/js/entry.js
出力先を./dist/index.bundle.js
に変更したいとします。
module.exports = {
entry: './src/js/entry.js'
output: {
filename: 'index.bundle.js',
path: __dirname + '/dist'
}
};
この例は動作します。
例2:複数のエントリーポイントを設定する
エントリーポイントを./src/js/entry.js
と、'./src/js/index.js'とし、
それぞれを./dist/entry.bundle.js
と./dist/index.bundle.js
に出力したいとします。
module.exports = {
entry: [
'./src/js/entry.js',
'./src/js/index.js'
],
output: {
filename: '[name].bundle.js',
path: __dirname + '/dist'
}
};
この例は失敗しmain.bundle.js
しか出力されません。 3
想定通りに動かすには以下のように設定します。
module.exports = {
entry: {
entry: './src/js/entry.js',
index: './src/js/index.js'
},
output: {
filename: '[name].bundle.js',
path: __dirname + '/dist'
}
};
結論
以上のことからわかる、webpackの基本的なentry
と[name]
の設定についてまとめます。
[name]
とはエントリーポイント名である
- エントリーポイントのファイル名ではありません
entry
を配列や文字列で設定した場合、エントリーポイント名はmain
になる
-
[name]
はmain
に変換されます - オブジェクトを使うことで複数のエントリーポイントを設定できます
この2点を抑えておけば、エントリーポイントと出力先周りでハマることは減るでしょう。
参考資料
私がこの記事に書いていることを理解したきっかけになったスライドです。4