3-9 less-loader 的less 转成 css 的底层原理
Less是CSS预处理语言,扩展了CSS语言,增加了变量、Mixin、函数等特性,Less-loader的作用就是将less代码转译为浏览器可以识别的CSS代码。
// 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);
}
所以less-loader的原理很简单,就是调用less库提供的方法,转译less语法后输出,如下:
// less-loader实现(经简化)
const less = require('less');
module.exports = function(content) {
const callback = this.async(); // 转译比较耗时,采用异步方式
const options = this.getOptions(); // 获取配置文件中less-loader的options
less.render(
content,
createOptions(options), // less转译的配置
(err, output) => {
callback(err, output.css); // 将生成的css代码传递给下一个loader
}
);
};

浙公网安备 33010602011771号