Webpack样式加载器与CSS加载器


238

我有两个问题。

1)CSS加载器样式加载器是两个webpack加载器。我无法理解两者之间的区别。为什么当它们都完成相同的工作时,我必须使用两个装载机?

2)在上面的Readme.md文件中提到的.useable.less和.useable.css是什么?


Answers:


283

CSS加载器获取一个CSS文件,importsurl(...)通过webpack的require功能返回CSS 并通过其解析:

var css = require("css!./file.css");
// => returns css code from file.css, resolves imports and url(...) 

它实际上对返回的CSS 不做任何事情。

样式加载器采用CSS并将其实际上插入到页面中,以便样式在页面上处于活动状态。

它们执行不同的操作,但是将它们链接在一起通常很有用,例如Unix管道。例如,如果您使用的是Less CSS预处理器,则可以使用

require("style!css!less!./file.less")

  1. file.less成纯CSS有不太装载机
  2. 使用CSS加载器解析CSS中的所有importsurl(...)
  3. 使用样式加载器将这些样式插入页面

24
您能告诉我,将样式插入页面会给您带来什么压力?因为我使用的是CSS的ExtractTextPlugin,并且根据您所写的内容,所以我不应该使用样式加载器。另外,我的感觉是,使用样式加载器会使我的样式与JS捆绑在一起,直到使用了extract插件为止。注意:我正在使用webpack。并且在删除了该样式加载器之后,对我来说并没有什么变化,因为我在上面告诉我,我已经在由
Extract

6
@ user3241111我认为他的意思是:“通过注入<style>标签将CSS添加到DOM中”(这是从github.com/webpack/style-loader的官方文档中复制的
exmaxx

1
因此,想法是webpack会剥离所有处理过的CSS并将其放置在文档的开头,从而避免了HTTP对<link>标签和url样式定义的请求?我认为这是重点。魅力和魅力四射的东西也可以做到这一点。我敢肯定,这样加载速度更快。但是我可能是不正确的。
Tamb

通过imports我想你指的@import指令。默认情况下,此指令不会将导入的CSS规则合并到导入程序中,而是创建另一个GET请求。您是说这css-loader将返回合并的输出吗?
adi518

1
并返回CSS-
Max Koretskyi

55

css-loader以字符串形式读取css文件。您可以将其替换raw-loader为很多情况,并获得相同的效果。由于它仅读取文件内容,而没有其他任何内容,因此除非您将其与另一个加载程序链接在一起,否则它基本上是没有用的。

style-loader采用这些样式,并<style><head>包含这些样式的页面元素中创建一个标签。

如果您bundle.js在使用后查看其中的javascript ,style-loader您会在生成的代码中看到一条注释,内容为

// style-loader:通过添加标签将一些CSS添加到DOM

例如,

<html>
    <head>
        <!-- this tag was created by style-loader -->
        <style type="text/css">
            body {
                background: yellow;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript" src="bundle.js" charset="utf-8"></script>
    </body>
</html>

该示例来自本教程。如果您style-loader通过更改行从管道中删除

require("!style-loader!css-loader!./style.css");

require("css-loader!./style.css");

您会看到<style>消失了。


5
那么我什么时候应该使用css-loader而不是raw-loader
罗伊·纳米尔

4
css-loader会像import / require()一样解释@import和url()并将解析它们。原始加载程序仅加载指定的文件。
安德鲁(Andrew)

13

要回答第二个问题“以上Readme.md文件中提到的.useable.less和.useable.css是什么?”,默认情况下,当样式为时require'd,样式加载器模块会自动将<script>标签注入DOM,然后该标签会保留在DOM中,直到关闭或重新加载浏览器窗口。样式加载器模块还提供了一个所谓的“引用计数API”,它使开发人员可以添加样式并在以后不再需要它们时将其删除。API的工作方式如下:

const style = require('style/loader!css!./style.css')
// The "reference counter" for this style starts at 0
// The style has not yet been injected into the DOM
style.use()  // increments counter to 1, injects a <style> tag
style.use()  // increments counter to 2
style.unuse()  // decrements counter to 1
style.unuse()  // decrements counter to 0, removes the <style> tag

按照惯例,使用此API加载的样式表具有扩展名“ .usable.css”,而不是如上所述的简单的“ .css”。


这个答案与Webpack配置无关。
安德鲁·科斯特

@AndrewKoster我不明白你的意思。这是原始发布者的两部分问题的第二部分的答案,该问题分为两部分,有关样式加载器模块的内部工作原理和文件命名约定。
chrisarnesen

当然可以,但是正如您所说,问题有两个部分。该答案(和已接受的答案)完全忽略了问题的第一部分,这是更重要且更通用的部分。解决这些装载机是什么以及如何配置它们的唯一答案是Brian Ogden的回答,没有人投票(出于某种原因)。
安德鲁·科斯特

我没有使用带有疯狂的感叹号的任何奇怪的require语法,但是我仍然需要知道如何在Webpack中配置这些加载器。与用疯狂的require语法所做的所有事情相比,我的用例似乎更常见。
Andrew Koster

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.