【发布时间】:2016-03-06 12:32:00
【问题描述】:
我有两个问题。
1) CSS Loader 和 Style Loader 是两个 webpack 加载器。我无法理解两者之间的区别。为什么我必须使用两个加载器,它们都做同样的工作?
2) 上述Readme.md文件中提到的.useable.less和.useable.css是什么?
【问题讨论】:
标签: webpack webpack-style-loader
我有两个问题。
1) CSS Loader 和 Style Loader 是两个 webpack 加载器。我无法理解两者之间的区别。为什么我必须使用两个加载器,它们都做同样的工作?
2) 上述Readme.md文件中提到的.useable.less和.useable.css是什么?
【问题讨论】:
标签: webpack webpack-style-loader
CSS 加载器获取一个 CSS 文件并返回带有 imports 和 url(...) 的 CSS,通过 webpack 的 require 功能解析:
var css = require("css!./file.css"); // => returns css code from file.css, resolves imports and url(...)
它实际上并没有对返回的 CSS 做任何事情。
样式加载器采用 CSS 并将其实际插入到页面中,以便样式在页面上处于活动状态。
它们执行不同的操作,但将它们链接在一起通常很有用,就像 Unix 管道一样。例如,如果你使用the Less CSS preprocessor,你可以使用
require("style!css!less!./file.less")
到
file.less 转换为纯 CSSimports 和 url(...)s【讨论】:
<style> 标记将CSS 添加到DOM”(这是从github.com/webpack/style-loader 的官方文档中复制的)
css-loader 将 css 文件作为字符串读取。您可以将其替换为 raw-loader 并在很多情况下获得相同的效果。由于它只是读取文件内容而没有其他内容,因此除非您将其与另一个加载器链接,否则它基本上是无用的。
style-loader 采用这些样式并在包含这些样式的页面的<head> 元素中创建一个<style> 标记。
如果您在使用 style-loader 后查看 bundle.js 中的 javascript,您会在生成的代码中看到一条注释
// 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>
该示例来自this tutorial。如果您通过更改行从管道中删除style-loader
require("!style-loader!css-loader!./style.css");
到
require("css-loader!./style.css");
你会看到<style>消失了。
【讨论】:
css-loader而不是raw-loader?
回答第二个问题“上面的Readme.md文件中提到的.useable.less和.useable.css是什么?”,默认当样式为require'd时,style-loader模块会自动注入一个<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”。
【讨论】:
让我从你的问题中回答 1)。 style-loader 和 css-loader 有什么区别?或者:他们是做什么的?
css-loader 结尾的导入将在 Javascript 中收到一个数组
@import 规则),文件名和文件内容(修改)为字符串css-loader,那么您必须自己对字符串进行处理,否则它们只会增加您的捆绑包大小style-loader 会将来自css-loader 的 Javascript 包装成更多的 Javascript
css-loader 的CSS 字符串创建<style> 元素并将它们注入到DOM 中style-loader 不能单独使用(你会得到一个错误),因为它不读取文件并且需要 css-loader-like Javascript 作为输入【讨论】:
Webpack 文档建议将 style-loader 与 css-loader 结合使用:
【讨论】:
1) 项的直接答案。
1) 是一个问题“为什么我必须使用两个装载机,而它们都做同样的工作?”,这里没有回答。注意问题词“为什么”。