webpackとは
謂わずと知れたバンドルツール。
JSのみならず、CSSやimageファイル等をひとまとめにしてくれる便利ツール。
設定を分割しない構成
ディレクトリ構成
root/
├ dist/
│ └ ビルド後のファイル
├ src/
│ ├ css
│ └ js 等
├ webpack.config.js
└ package.json
root/webpack.config.js
// pathとかpluginとか
const path = require('path')
module.exports = {
entry: {
// エントリポイント
app: ...
},
output: {
// filenameとかpathとか
path: ... ,
filename: ...
},
module: {
rules: [
// loaderの設定
{
test: ... ,
loaders: [ ... ],
}
]
},
devServer: {
// webpack-dev-server用の設定
},
plugins: [
// プラグイン設定
]
}
root/package.json
"scripts": {
"build": "webpack",
"build:prod": "webpack --mode=production",
"start": "webpack-dev-server --hot --inline",
"start:prod": "webpack-dev-server --hot --inline --mode=production",
"test": "jest --watch"
},
この設定でしばらく開発していたが...
-
build
とstart
がそれぞれdev
/prod
とあるのは微妙だし、役割が曖昧 - 開発環境では
--mode=development
でサーバを立ち上げればOK - 本番環境では
--mode=production
でビルドすればOK - 開発用/本番用で
webpack.config.js
を分けたい!
webpackのベストプラクティス
公式にちゃんとあった
Production - Webpack
webpack.config.js
をマージできるモジュール
webpack-merge - Merge designed for Webpack
webpack.config.js
を分割した構成
ディレクトリ構成
root/
├ dist/
│ └ ビルド後のファイル
├ src/
│ ├ css
│ └ js 等
├ webpack.common.js // 汎用設定
├ webpack.dev.js // 開発用設定
├ webpack.prod.js // 本番用設定
└ package.json
まず、開発用/本番用のどちらでも使う設定を記述する。
root/webpack.common.js
// pathとかpluginとか
const path = require('path')
module.exports = {
entry: {
// エントリポイント
app: ...
},
output: {
// filenameとかpathとか
path: ... ,
filename: ...
},
module: {
rules: [
// loaderの設定
{
test: ... ,
loaders: [ ... ],
}
]
},
plugins: [
// プラグイン設定
]
}
そして、開発用/本番用それぞれで必要な設定を記述し、webpack.common.js
とマージする
root/webpack.dev.js
const merge = require('webpack-merge') // webpack-merge
const common = require('./webpack.common.js') // 汎用設定をインポート
// common設定とマージする
module.exports = merge(common, {
mode: 'development', // 開発モード
output: {
publicPath: ... ,
},
devtool: 'inline-source-map', // 開発用ソースマップ
devServer: {
// webpack-dev-serverの設定
...
}
})
root/webpack.prod.js
const merge = require('webpack-merge') // webpack-merge
const common = require('./webpack.common.js') // 汎用設定をインポート
// common設定とマージする
module.exports = merge(common, {
mode: 'production', // 本番モード
output: {
publicPath: ... ,
},
})
scripts
でどの設定を呼び出すか指定する必要がある
root/package.json
"scripts": {
"build": "webpack --config webpack.prod.js",
"start": "webpack-dev-server --hot --inline --config webpack.dev.js",
"test": "jest --watch"
},
まとめ
- 開発用/本番用の
webpack
設定は分けよう(公式推奨だし...) - てかちゃんと公式ドキュメント読もう
- まだまだwebpackは奥が深いので、勉強頑張っていこう