webpackのローダーの注文は何ですか?


86

ファイルに一致する複数のテストを含むローダー構成がある場合、最初に一致するローダーのみが使用されることを期待しますが、そうではないようです。

ソースを読んでみましたが、ロードを実装していると思うビットを見つけても、それがどのように動作するのか理解できません。

ドキュメントには、その状況がどのように動作するかについても記載されていません。

回答:


108
{
    test: /\.css$/,
    loaders: ['style'],
},
{
    test: /\.css$/,
    loaders: ['css'],
},

そして

{
    test: /\.css$/,
    loaders: ['style', 'css'],
},

等しいように見えます。機能的には、これはstyle(css(file))(Miguelに感謝)と同じです。

loadersそれらの中で右から左に評価されることに注意してください。


2
うーん、あまり役に立たない振る舞いだと思います:-/その振る舞いにはpreLoadersを使用したいです...
w00t 2015

18
ローダーは関数のように機能するため、右から左になります。これを使用するときは"style!css"、関数のように想像してくださいstyle( css( file ) )。...この場合cssは最初に呼び出されます。
ミゲルアンジェロ

11
右から左に評価すると、しばらく苦労しました。@ miguel-angeloあなたのstyle( css( file ) )説明は私にとって安心です。
Evi Song

1
Webpack 3の構文を見ると、右から左への変換は基本的に下から上への変換を意味します...最も下:最初の別名最も内側の関数...
Frank Nocke 2017

1
これがいつ追加されたかはわかりませんが、注文に関するドキュメントがついにあります:webpack.js.org/concepts/loaders/#loader-features ローダーはチェーンできます。チェーン内の各ローダーは、処理されたリソースに変換を適用します。チェーンは逆の順序で実行されます。最初のローダーは、その結果(変換が適用されたリソース)を次のローダーに渡します。最後に、webpackは、JavaScriptがチェーンの最後のローダーによって返されることを期待しています。
EricMajerus19年

61

公式ドキュメントはそれを本当によく説明しています。残念ながら、必要な情報はすべて、ドキュメントのさまざまなセクションに分散しています。あなたが知る必要があるすべてをまとめさせてください。

1.1。

それらが正しい順序(下から上)であることを確認してください。

2.2。

これらは、リソースファイルのソースをパラメーターとして受け取り、新しいソースを返す関数です。

3.3。

ローダーはチェーン接続できます。それらはパイプラインでリソースに適用されます。最終的なローダーはJavaScriptを返すことが期待されています。他の各ローダーは、次のローダーに渡される任意の形式でソースを返すことができます。

そう...

あなたが持っている場合somefile.css、あなたはそれを通過しているloaderOneloaderTwoloaderThree定期的な連鎖機能のような振る舞いです。

{
    test: /\.css$/,
    loaders: ['loaderOne', 'loaderTwo', 'loaderThree']
}

とまったく同じ意味です...

loaderOne(loaderTwo(loaderThree(somefile.css)))

あなたがうなり声から来ているなら|| 混乱している一口の世界。ローダーの順序を右から左に読むだけです。


1
このmodule.loaderの配列がありますが、どの順序で実行されますか?
Saras Arya 2017

44
なぜ彼らは下から上にロードするのですか!??
light24bulbs

あなたは、ドキュメントでその「最終ローダー」を指定するために答えを変更することでloaderOne、あなたの例では
AAAAAA

1
@ light24bulbsを使用する.pushと、ルールに簡単なローダーを追加でき、追加することを心配する必要がありません。
サルケ

2

この回答は私には役立ちましたが、ローダーの順序に影響を与える別のポイントであるローダー名を補足したいと思いますアプローチ。

あなたが持っていると言うurl-loaderよりも優先して、あなたの設定ではfile-loader、あなたがしたい画像のパスをインポートし、後者で。何もしないと、url-loader(エンコードされたデータURLが作成される)を介してファイルがインポートされます。

インポートの前にを付けるとfile-loader!、インポートがそのローダーに送られます。

import image from 'file-loader!./my-img.png'

3
はい、それは避けたいのですが、ビルド時にファイルをリンクにするか埋め込むかを決めることができないためです。!!ところで、他のローダーをスキップすることから始めることもできます…
w00t 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.