【学習メモ】webpack.config.jsを理解する
はじめに
webpack.config.jsファイルでよく使われるエントリのメモ。
webpack.config.jsについて、まずはサンプルコード
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: {
index: path.join(__dirname, 'src', 'index.js')
},
output: {
path: path.join(__dirname, 'out'),
filename: 'main.js'
},
devtool: 'cheap-module-eval-source-map',
target: 'node',
module: {
rules: [
{
test: /.js$/,
loader: 'babel-loader'
}
]
},
plugins: [
externalPlugins
]
}
entryとoutputについて
-
entry
: webpackがビルドする際に開始点となるJSファイルを設定 -
output
: ビルドファイルの設定。どこにどのようなファイルを出力すればよいか設定している。
具体的なコード
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: {
index: path.join(__dirname, 'src', 'index.js')
},
output: {
path: path.join(__dirname, 'out'),
filename: 'main.js'
},
...
}
entryエントリの設定
該当箇所
entry: {
index: path.join(__dirname, 'src', 'index.js')
},
これは、webpackがビルドした際に「./src/index.js
というファイルを探して読み込んでね。」という設定をしている。
まずpath.join
でパスを連結してくれていて、上記だと./src/index.js
というパスにしてくれている。
これを使うメリットとしては、macやwindowsなどの開発環境によって/
が¥
になったりするがそれを防ぐことができる。
そしてNode.jsの標準モジュールのpath
を読み込ませて使用しているので、path.join
として使用できる。
__dirname
はNode.jsで用意されているグローバル変数で、現在実行中のソースコードが格納されているディレクトリパスが格納されている。
簡単に言うと、手軽に絶対パスの記述ができるもの。
ちなみに、entryの設定でindex: ~~~~
となっている、このindex
というのがチャンクとなり、outputエントリなどで[name]
とするだけで"index"
という文字列が割り当てられるようになる。
outputの設定
該当箇所
output: {
path: path.join(__dirname, 'out'),
filename: 'main.js'
},
outputの設定箇所では、path
とfilename
が使われている。
-
path
: どのディレクトリに出力するかを指定している。 -
filename
: どのファイルに出力するかを指定している。
devtoolの設定
devtool:
を設定することによって、ソースマッピングのスタイルを選択して、デバッグプロセスを強化できる。
指定可能な値はstring
とfalse
。
stringの具体的な値としては、'cheap-module-eval-source-map'
や'source-map'
を指定する。
targetの設定
該当箇所
target: 'node',
target:
を設定することで、特定の環境をターゲットにするようにwebpackに指示する。
今回は、'node'
と指定しているので、Node.jsのような環境で使用するためにコンパイル指定いる。
moduleの設定
module:
オプションはプロジェクト内の様々なタイプのモジュールがどのように処理されるかを設定する。
要するにwebpackが特定のmoduleをどう扱うかを決定している。
webpackでのmoduleはJavaScriptやCSSファイルを指す。
ここでは、Ruleモジュールについて設定されているので、詳しく見ていく。
// ...
module.exports = {
// ...
module: {
rules: [
{
test: /.js$/,
loader: 'babel-loader'
},
{
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader'
}
]
},
{
test: /\.svg$/,
use: [
{
loader: 'babel-loader'
},
{
loader: 'react-svg-loader',
options: {
jsx: true
}
}
]
}
]
},
// ...
}
moduleのruleエントリについて詳しく
rule.test
rule.test:
は拡張子を設定するイメージ。
webpackでいうmodule(JavaScriptやCSSなど)を設定するということ。
今回で言うと、拡張子が.js
なので、test: /.js$/
と設定しています。
※jsxもマッチさせようと思うとtest: /\.jsx?$/,
こんな感じ。
※ただし、これは'x'
という文字は?
(オプショナル)なので、'js'
という文字列でもマッチする。
rule.loader
loader
は、読んで字のごとくローダーの種類を指定する。
該当箇所
{
test: /.js$/,
loader: 'babel-loader'
},
上記は、拡張子が.js
なので、JavaScriptファイルをbabel-loader
として読み込む設定をしている。
resolve, aliasの設定
// ...
resolve: {
alias: {
'@alias/components': path.resolve(__dirname, '../src/components'),
'@alias/src': path.resolve(__dirname, '../src'),
}
},
// ...
// (resolve.aliasを使用しない場合)
import MyComponent from './../../../components/MyComponent'
import { someSrc } from './../../src/constants'
// (resolve.aliasを使用した場合)
// 絶対パスを変数っぽく使えるように設定できる。
import MyComponent from '@alias/components/MyComponent'
import { someSrc } from '@alias/src'
Discussion