Webpack的装载程序顺序是什么?


86

当我有一个加载程序配置,其中有多个测试与一个文件匹配时,我希望只使用第一个匹配的加载程序,但事实并非如此。

我尝试阅读源代码,但是即使我发现我认为可以实现加载的部分,也无法理解它的行为。

该文档也没有提到这种情况应该如何表现。

Answers:


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

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

似乎是平等的。就功能而言,这与style(css(file))(感谢Miguel)相同。

请注意,loaders它们是从右到左评估的。


2
嗯,这不是非常有用的行为,我认为:-/我宁愿使用preLoaders来实现这一行为...
w00t

18
加载程序的作用类似于函数,这就是为什么它从右到左。当您使用this时"style!css",请想象它们就像函数:style( css( file ) )...在这种情况下css,首先被调用。
Miguel Angelo'3

11
从右到左的评估使我挣扎了一段时间。@ miguel-angelo您的style( css( file ) )解释使我感到欣慰。
Evi Song

1
从右到左最有可能实质上意味着从上到下,当我们查看Webpack 3语法时……最底部:第一个也就是最内层的函数……
Frank Nocke

1
我不知道何时添加此内容,但最终有了有关该命令的文档:webpack.js.org/concepts/loaders/#loader-features 可以链接加载程序。链中的每个加载器都将转换应用于已处理资源。链以相反的顺序执行。第一个加载程序将其结果(具有应用转换的资源)传递给下一个加载程序,依此类推。最后,webpack期望JavaScript由链中的最后一个加载器返回。
Eric Majerus,

61

官方文档对此进行了很好的解释。不幸的是,所有必要的信息都散布在文档的不同部分。让我总结您需要知道的所有内容。

1。

确保它们的顺序正确(从下到上)。

2。

它们是将资源文件的源作为参数并返回新源的函数。

3。

装载机可以链接。它们被应用到资源的管道中。最终的加载程序应返回JavaScript;每个其他加载器可以返回任意格式的源,并将其传递给下一个加载器。

所以...

如果你有somefile.css,你是使其通过loaderOneloaderTwoloaderThree是像一个普通的链接的功能的行为。

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

表示与...完全相同

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

如果您来自咕unt声|| 大吃一惊的世界,令人困惑。只需从右到左读取装载机的顺序即可。


1
我有这个module.loaders数组,它们按什么顺序执行?
萨拉斯·阿里亚

44
为什么要将底部加载到顶部!?
light24bulbs

您可能需要修改答案以指定文档中的“ final loader”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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.