// demo.less
@base: #f938ab;
.box-shadow(@style, @c) when (iscolor(@c)) {
-webkit-box-shadow: @style @c;
box-shadow: @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
.box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box {
color: saturate(@base, 5%);
border-color: lighten(@base, 30%);
div { .box-shadow(0 0 5px, 30%) }
}
上面的less会被less-loader解析成为
// demo.css
.box {
color: #fe33ac;
border-color: #fdcdea;
}
.box div {
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
假如我们有a.css、b.css、c.css:
// a.css
@import './b.css'; // 导入b.css
.a {
font-size: 16px;
}
// b.css
@import './c.css'; // 导入c.css
.b {
color: red;
}
// c.css
.c {
font-weight: bolder;
}
再看一下css-loader对上面css的解析
// css-loader输出
exports = module.exports = require("../../../node_modules/css-loader/lib/css-base.js")(false);
// imports
// 文件需要的依赖js模块,这里为空
// module
exports.push([ // 模块导出内容
module.id,
".src-components-Home-index__c--3riXS {\n font-weight: bolder;\n}\n.src-components-Home-index__b--I-yI3 {\n color: red;\n}\n.src-components-Home-index__a--3EFPE {\n font-size: 16px;\n}\n",
""
]);
// exports
exports.locals = { // css-modules的类名映射
"c": "src-components-Home-index__c--3riXS",
"b": "src-components-Home-index__b--I-yI3",
"a": "src-components-Home-index__a--3EFPE"
};
可以理解为css-loader将a.css、b.css和c.css的样式内容以字符串的形式拼接在一起,并将其作为js模块的导出内容。
直觉上似乎我们只需要像下面这样返回一段js代码,将css-loader返回的结果插入DOM就行:
module.exports = function (content) {
return `
const style = document.createElement('style');
style.innerHTML = '${content}';
document.head.appendChild(style);
`;
};
此文对照原文加工学习
原文链接:https://juejin.cn/post/6944668149849522213