是否可以像Stylus一样从JSON文件中加载变量到LESS CSS预处理器中?
使用文件myvars.json
的内容。
{
"color1": "#112345",
"color2": "#667890"
}
在 Stylus 中,我要做的是...
json('myvars.json')
body{ background-color: color1; }
能否在LESS中实现这一点?
我希望将文件保持为JSON格式,以便轻松地在JavaScript中重复使用它。
是否可以像Stylus一样从JSON文件中加载变量到LESS CSS预处理器中?
使用文件myvars.json
的内容。
{
"color1": "#112345",
"color2": "#667890"
}
在 Stylus 中,我要做的是...
json('myvars.json')
body{ background-color: color1; }
能否在LESS中实现这一点?
我希望将文件保持为JSON格式,以便轻松地在JavaScript中重复使用它。
less.js中,您可以使用JavaScript插值(使用反引号)。并调用一个函数,该函数从文件加载变量的json对象...您可以通过其键提取变量-也许是这个方向的某些内容:
@json_file: myvars.json;
@json: ~`json = function($key) { var request = new XMLHttpRequest(); request.open("GET", "@{json_file}", false); request.send(null); var my_json = JSON.parse(request.responseText); return my_json[$key]; }`;
body {
background-color: ~`json('color1')`;
}
这可能看起来不是很优雅,但它有效。更优雅的选项可能是在调用脚本之前在全局LESS对象中定义自定义用户函数,但我从未真正费心去尝试过,因为我一直在开发时只使用LESS客户端。
另一件你可以做的事情- 在浏览器中调用LESS脚本后,在JavaScript中加载json文件,并使用less.modifyVars()
函数重新编译具有json变量的LESS。您可以在html中执行类似以下操作(此处我使用普通JS,但如果您使用jQuery.getJSON,则会更简单):
<link rel="stylesheet/less" href="style.less" type="text/css">
<script type="text/javascript">less = { env: "development" };</script>
<script src="http://rawgithub.com/less/less.js/master/dist/less-1.4.1.min.js" ></script>
<script type="text/javascript">
var request = new XMLHttpRequest();
request.open("GET", "myvars.json", false);
request.send(null);
var my_json = JSON.parse(request.responseText);
less.modifyVars(my_json);
</script>
在你的 LESS 样式文件中加入类似下面的代码:
@color1: darkblue; //default value - will get overwritten by .modifyVars()
body {
background-color: @color1;
}
另外说明:所有LESS中的变量名都必须以一个at符号(@
)开头。然而,JSON变量不需要这样做,因为less.modifyVars()
会自动在缺失@符号时添加它们。
希望这能给您一些想法。可能有更好的方法来实现它...但这两种方法对我有效。
{
"color1": "#112345",
"color2": "#667890"
}
less/styles.less
@json-import "myvars.json";
body {
background-color: @color1;
}
gulpfile.js
var gulp = require('gulp');
var less = require('gulp-less');
var lessJsonImport = require('gulp-less-json-import');
gulp.task('less', function(){
gulp.src(['./less/**/*.less', '!./less/**/_*.less'])
.pipe(lessJsonImport())
.pipe(less())
.pipe(gulp.dest('./css'));
});
这里描述了一种相对较新的方法here:
myPluginFile.js
:
const axios = require('axios').default
module.exports = {
install: function (less, pluginManager, functions) {
functions.add("blue", function () {
const headers = {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
timestamp: +new Date(),
}
try {
const method = 'get'
const url = 'https://myAPI.com/myFile.json'
const options = { headers: { ...headers } }
const { data } = await axios[method](url, {}, options)
return data
} catch (error) {
console.info('Error', { msg: error.message })
}
});
},
};
myStyleFile.less
:
@plugin "myPluginFile";
/* Style the body */
body {
color: blue();
}
您可以使用globalVars
选项,提供从JSON文件加载的对象。
例如,使用less-loader插件,webpack.config.js
将如下所示:
function lessGlobalVars() {
return require('flat')(require('./path/to/config.json'),
{
delimiter: '_'
});
}
module.exports = {
module: {
rules: [
{
test: /\.less$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
},
{
loader: 'less-loader',
options: {
globalVars: lessGlobalVars()
}
}
]
}
]
}
};
config.json
:
{
"dimensions": {
"width": 100,
"height": 50
}
}
globalVars
只接受扁平结构,因此我们需要一个 flat 包,它将通过require('./path/to/config.json')
加载的对象分解为:
{
dimensions_width: 100,
dimensions_height: 50
}
globalVars
选项,将使全局变量@dimensions_width
和@dimensions_height
在所有less样式表中可用:.some-class {
width: @dimensions_width;
height: @dimensions_height;
}
在浏览器中使用LESS时,还可以使用“globalVars”选项,在加载LESS文件之前设置变量:http://lesscss.org/usage/#using-less-in-the-browser-options