编辑:在原来的回答中,我描述的是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
的限制属性可以创建内联图片:
url(data:image/jpeg;base64,LzlqLzRBQ ... zdF3)
2. 支持CSS Modules
让我们考虑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
). If you use CSS Modules approach you can deal with this problem.
Now import styles to variable and this variable will contain object with mapping class names:
componentA
with CSS Modules looks: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 Modules 的 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 style-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>
@import './components/componentA';
@import './components/componentB'; // you must disable this manually
@import './components/componentC';
2. 使用 css-loader style-loader
现在你可以直接从组件中指向与其相关的样式(而不是像第一点那样将其放在单独的位置)。
例如,你的*.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'
在 .js
文件中包含 styles.css
时,你需要先将其转换为 .js
。这正是 css-loader 能够提供帮助的地方。
@import
和url()
。 - Davin Tryon