@MickeyWang
2018-01-11T15:41:33.000000Z
字数 2752
阅读 1447
forJD
现状:在hotel项目中,用less作为css预处理器,现在src/assets/css目录下有common.less文件,需要在每个组件中显式引入。
期望:现想在全局引入一个less文件,其中的变量及mixin等便可在各子组件得以访问,不必主动引入。
require('!style-loader!css-loader!less-loader!./assets/css/common.less');
结果:子组件中无法访问到common.less
结果:子组件中无法访问到common.less
let lessOptions = {
includePaths: [
'../src/assets/css'
],
data: '@import "~common.less";'
}
···
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less', lessOptions),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
结果:子组件中无法访问到common.less
结果:依旧达到预期效果
在此整理一些论坛、文章中关于此问题的延伸与观点。
在使用sass时,可以使用sass-resources-loader,其专为解决全局sass文件引入而生,以下摘自其在GitHub上的readme.md。
This loader will @import your SASS resources into every required SASS module. So you can use your shared variables & mixins across all SASS styles without manually importing them in each file. Made to work with CSS Modules!
经配置,在less中使用无效,虽然官网中说不限于sass。
@import '~assets/css/common.less';
可以为less-loader
在加载时注入全局变量。
loader: "less-loader",
options: {
globalVars: {
'primary-color': 'blue'
}
}
这样做对于全局变量的添加是生效的,为了方便后期配置维护,可以将所有需要的全局变量存入一个less文件,然后解析注入到配置项中。
下面是本次在hotel项目中,对于以上方案的实现。
1、首先在webpack.base.conf.js
文件的vue-loader
配置项中,添加cssLoader
的相关处理配置,即添加第9行。
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
js: 'babel-loader',
postcss: [
require('autoprefixer')()
],
loaders: utils.cssLoaders()
}
}
2、对utils.js
中cssLoaders
方法的返回值增加对于less的配置。(第4、5、6行)
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less',{
globalVars: getLessVariables(config.themePath)// 读取less全局变量文件
}),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
3、同时在cssLoaders
方法中加入读取less全局变量文件的方法
// 读取less全局变量文件
function getLessVariables(file) {
var themeContent = fs.readFileSync(file, 'utf-8')
var variables = {}
themeContent.split('\n').forEach(function(item) {
if (item.indexOf('//') > -1 || item.indexOf('/*') > -1) {return}
var _pair = item.split(':')
if (_pair.length < 2) return;
var key = _pair[0].replace('\r', '').replace('@', '')
if (!key) return;
var value = _pair[1].replace(';', '').replace('\r', '').replace(/^\s+|\s+$/g, '')
variables[key] = value
})
return variables
}
4、最后在assets/css
目录下添加全局less变量文件theme.less
。(注意遵循命名规范)
// 请以'g-'开头命名,以区分全局与局部less变量
@g-primary-color: grey;
在之后的开发使用上,只需要维护theme.less
文件,以及在需要引入全局变量的地方引入即可。如下:
.mainColor {
color: @g-primary-color;
}
需要注意的是,theme.less
文件的加载时机是在webpack打包前,所以只加载一次,不支持热更新(HMR),更改theme.less文件后,需要重启服务以生效。