webpack + vue 全局共享使用less变量的解决方案

vue-cli生成的工程下,样式使用了less语言,其中定义了一些全局变量,比如常用颜色,便于样式切换。

//theme.less

@main: #fff;
@sub: #fff;
@border: #fff;
@grey: #fff;

但是Vue单文件组建内,less变量不能共享和继承。
每个文件都要@import一遍也挺麻烦的。

不完美解决方案如下:

在./build/utils.js中
首先添加getLessVariables方法

....
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
}
....

然后给less-loader配置config

function generateLoaders(loader, loaderOptions) {
  ....
  return{
    ....
    less: generateLoaders('less', {
      modifyVars: getLessVariables('./src/style/theme.less')
    }),
    ....
  }
  ...
}

这样就能做到全局共享一个theme.less文件里的变量了。

但是
这个方法并不能实现热更新,修改theme后需要手动重启npm run dev

提前把变量都写好吧

完美解决方案如下:

使用sass的sass-resources-loader,也可以兼容less

./build/utils.jsexports.cssLoaders = function (options) { ... }中添加generateLessResourceLoader方法

function generateLessResourceLoader() {
    var loaders = [
      cssLoader,
      'less-loader',
      {
        loader: 'sass-resources-loader',
        options: {
          resources: [
            path.resolve(__dirname, '../src/style/theme.less'), 
            path.resolve(__dirname, '../src/style/mixins.less')
          ]
        }
      }
    ];
    if (options.extract) {
      return ExtractTextPlugin.extract({
        use: loaders,
        fallback: 'vue-style-loader'
      })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }
  }

然后把下边的

less: generateLoaders(),

替换成

less: generateLessResourceLoader('less'),

即可

这个方法可以完美实现全局less变量共享,和修改变量后的热重载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文http://www.cnblogs.com/libin-1/p/6596810.html 版本号 vue-c...
    tengrl阅读 3,758评论 0 0
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,729评论 7 110
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,531评论 1 32
  • 一个不错的预见,转发给大家:摘自朋友圈纵观中国发展大势,2017年将是伟大而又转折的一年,那么2017年将会发生哪...
    tgg2017阅读 211评论 0 0
  • 身边很多人都存在这样一种观念,我现在的读书学习是为了以后能有一份好的工作,赚很多的钱,然后让自己的家庭走出贫穷。这...
    小人丑阅读 1,316评论 0 1