[英]What is the purpose of css-loader in webpack
我开始使用Webpack 2,我看到很多项目正在使用css-loader,但我没有找到它的目的。
编辑:在原始答案中,我描述的是style-loader
而不是css-loader
。 由于css-loader
只能与style-loader
一起使用,因此很容易忘记这些加载器的不同用途。
css-loader
使您可以更好地控制导入.css
文件。
1.转换url(image.png) => require('./image.png')
由于现在使用了require
,因此可以使用例如file-loader
或url-loader
。 现在url(image.png)
可以转换为:
url(/public-path/0dcbbaa701328a3c262cfd45869e351f.png)
或者使用url-loader
limit属性创建内联图片:
url(data:image/jpeg;base64,LzlqLzRBQ ... zdF3)
2.启用CSS模块
让我们考虑componentA
和componentB
样式:
componentA/style.css
.wrapper {
background-color: blue;
}
.specificToComponentA {
// rest of styles
}
componentB/style.css
.wrapper {
background-color: red;
}
.specificToComponentB {
// rest of styles
}
componentA
看起来:
import './style.css';
export default function () {
document.body.innerHTML = `
<div class="wrapper">
<div class="specificToComponentA">componentA</div>
</div>
`;
}
和componentB
看起来:
import './style.css';
export default function () {
document.body.innerHTML = `
<div class="wrapper">
<div class="specificToComponentB">componentB</div>
</div>
`;
}
这些组件的背景颜色是什么颜色的? 这个问题与样式泄漏有关,很难判断它们是红色还是蓝色(很难预测样式style-loader
创建的style-loader
顺序)。 如果您使用CSS模块方法,您可以处理此问题。 现在将样式导入变量,此变量将包含具有映射类名称的对象:
带有CSS模块的componentA
看起来:
import s from './style.css';
export default function () {
document.body.innerHTML = `
<div class="${s.wrapper}">
<div class="${s.specificToComponentA}">componentA</div>
</div>
`;
}
s
对象将包含:
{
wrapper: "WO0HHIhH77",
specificToComponentA: "jPYPsVTDZu"
}
componentA/style.css
将被转换为
.WO0HHIhH77 {
background-color: blue;
}
.jPYPsVTDZu {
// rest of styles
}
和使用CSS模块的componentB
看起来:
import s from './style.css';
export default function () {
document.body.innerHTML = `
<div class="${s.wrapper}">
<div class="${s.specificToComponentB}">componentB</div>
</div>
`;
}
s
对象将包含:
{
wrapper: "C8EKTwiZfd", // Look, different than in componentA!!!
specificToComponentB: "KI5jRsC2R5"
}
componentB/style.css
将被转换为
.C8EKTwiZfd { // Look, different than in componentA!!!
background-color: red;
}
.KI5jRsC2R5 {
// rest of styles
}
现在,即使你不在两个组件中使用超级特定名称(如wrapper
,也可以确保它们不重叠, componentA
保持蓝色, componentB
保持红色。 它是封装描述为CSS模块的样式的强大功能 - 在css-loader
帮助下可以实现。
让我们考虑一下这个项目结构
├── components
│ │
│ ├── componentA
│ │ ├── style.css
│ │ └── index.js
│ │
│ ├── componentB
│ │ ├── style.css
│ │ └── index.js
│ │
│ └── componentC
│ ├── style.css
│ └── index.js
│
├── index.js
└── index.html
index.js
看起来像这样
import componentA from './components/componentA';
import componentB from './components/componentB';
import componentC from './components/componentC';
componentA();
componentB();
componentC();
1.没有css-loader样式加载器
每个*.js
组件通常都是这样的
export default function () {
// logic of this component
}
index.html
包含
<link href="components/componentA/style.css" rel="stylesheet" type="text/css">
<link href="components/componentB/style.css" rel="stylesheet" type="text/css">
<link href="components/componentC/style.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="dist/bundle.js"></script>
现在,如果要重构代码,例如禁用componentB
,则必须将其从index.js
删除
import componentA from './components/componentA';
// import componentB from './components/componentB';
import componentC from './components/componentC';
componentA();
// componentB();
componentC();
并且因为css和js是解耦的,所以你必须对index.html
样式做同样的事情
<link href="components/componentA/style.css" rel="stylesheet" type="text/css">
<!-- <link href="components/componentB/style.css" rel="stylesheet" type="text/css"> -->
<link href="components/componentC/style.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="dist/bundle.js"></script>
大型项目中的这种重复可能会导致死css代码 - 因为你必须在不同的地方做两件事,所以它很难维护。
注意: SASS或LESS有同样的问题。 它只从index.html
移到index.sass
:
@import './components/componentA';
@import './components/componentB'; // you must disable this manually
@import './components/componentC';
2.使用css-loader样式加载器
现在你直接从它指向与某个组件相关的样式(不是在1. point中的单独位置)例如你的*.js
组件看起来像
import './style.css';
export default function () {
// logic of this component
}
和index.html
<script type="text/javascript" src="dist/bundle.js"></script>
最重要的是,如果你有这个架构并想要禁用componentB
,那么你所做的只是
import componentA from './components/componentA';
// import componentB from './components/componentB';
import componentC from './components/componentC';
componentA();
// componentB();
componentC();
这就是全部! 不再需要在任何.html
或.sass
或.less
查找样式componentB/style.css
引用。 如果要添加新组件,也是如此:只需导入.js
文件即可添加js逻辑和css样式。 这更容易维护!
在.js
文件中, ES6 import
或CommonJS的require()
允许您只将JavaScript文件(模块)导入其中。 因此,当您通过import from './styles.css'
包含styles.css
,例如,在.js
文件中时,您需要首先转换为.js
。 这里是css-loader来救援的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.