module.rules
とmodule.loaders
の両方が有効です。 module.rules
がwebpack 2に新しく改良されたローダー構成で導入されましたが、module.loaders
は引き続き簡単に受け入れることができます。 module.rules
が存在する場合、webpack 2はmodule.loaders
を完全に無視します。。
ルールは実際には変更されませんが、ルール内のローダー定義は変更されません。なぜなら、ルールはローダーではないので、これはあまり混乱させないからです。このことを詳述するために、module.rules
は、条件が満たされたときに各ルールが1つまたは複数のローダーを適用するルールのセットです。ローダーは、指定された入力を有効なJavaScriptに変換するJavaScriptモジュールです。入力は何でもかまいません(JS、CSS、プレーンテキストなど)。これらの入力タイプを適切に処理する方法は適切なローダーのみが認識します。
ローダーの定義が改善されました。たとえば、すべてのオプションをクエリースタイルで使用して文字列を作成する代わりに、各ローダのオプションをJavaScriptオブジェクトとして定義できるようになりました。具体的な違いは次のようになります。
WebPACKの1
{
test: /\.css/,
loader: 'style-loader!css-loader?modules&localIdentName=[path][name]__[local]--[hash:base64:5]'
}
WebPACKの2
{
test: /\.css/,
use: [
'style-loader',
{
loader: 'css-loader'
options: {
modules: true,
localIdentName: '[path][name]__[local]--[hash:base64:5]'
}
}
]
}
WebPACKの2バージョンが読み取りまたは修正する方がはるかに簡単です。もしあなたがstyle-loader
のオプションを持っていれば、あるいはさらに多くのローダーがあれば、文字列表現は(文字列連結の場合でも)手に入らなくなります。
ルール内ではuse
,loaders
およびloader
との違いもありますが、ほとんどの場合互換性がありますが、扱い方が異なります。
use
は(loader
は、互換性の理由のためにuse
の別名である)ローダの配列を受け取り:
use: ['babel-loader']
loader
は、単一のルールを定義するための省略形である。
loader: 'babel-loader'
// Equivalent to
use: ['babel-loader']
各ローダをuse
にオブジェクトまたは文字列のいずれかにすることができます。ここで、文字列は単なる別名バージョンです。
use: ['babel-loader']
// Equivalent to
use: [{ loader: 'babel-loader' }]
オブジェクトバリアントでは、上記の.css
の例に示すようなオプションを使用できます。
一部の設定で表示される別のショートカットは、loader
を使用すると、直接ルールにoptions
を定義できるということです。 1つのローダーで、複数のローダーで試してみるとwebpackが不平を言うことを覚えておいてください。
これはルールとローダー定義の概要を示しますが、すべてをカバーしているわけではありませんが、他の方法(例:use
に関数を渡すなど)があります。お気軽にsource for the rulesを読んでください。冒頭のコメントはすでに役立っていますが、すべてをカバーしているわけでもありません。