详解vue项目中如何引入全局sass/less变量、function、mixin


Posted in Javascript onJune 02, 2018

让我们考虑下场景:当使用rem/vw开发移动端的时候,你定义了一个px转rem的函数,或者是网站配色的全局变量等,然后到工程里为每个vue文件或者组件@import ‘publicfilename.scss',那得重复做这样的工作很多很多...次,万一这些公用文件目录路径变怎么办呢,哭都来不及,想想都觉得恐怖呀!

接下来拯救我们的神器就要登场了---sass-resources-loader,它可以省去重复性的引入,还支持less,postcss等,具体用法如下:

npm install -d sass-resource-loader

首先我们找到项目里build目录,在该目录下找到util.js

更新前util.js代码如下:

'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
 const assetsSubDirectory = process.env.NODE_ENV === 'production'
  ? config.build.assetsSubDirectory
  : config.dev.assetsSubDirectory

 return path.posix.join(assetsSubDirectory, _path)
}

exports.cssLoaders = function (options) {
 options = options || {}

 const cssLoader = {
  loader: 'css-loader',
  options: {
   sourceMap: options.sourceMap
  }
 }

 // generate loader string to be used with extract text plugin
 function generateLoaders (loader, loaderOptions) {
  const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]

  if (loader) {
   loaders.push({
    loader: loader + '-loader',
    options: Object.assign({}, loaderOptions, {
     sourceMap: options.sourceMap
    })
   })
  }

  // Extract CSS when that option is specified
  // (which is the case during production build)
  if (options.extract) {
   return ExtractTextPlugin.extract({
    use: loaders,
    fallback: 'vue-style-loader'
   })
  } else {
   return ['vue-style-loader'].concat(loaders)
  }
 }

 // https://vue-loader.vuejs.org/en/configurations/extract-css.html
 return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass: generateLoaders('sass', { indentedSyntax: true }),
  scss: generateLoaders('sass'),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
 }
}

// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
 const output = []
 const loaders = exports.cssLoaders(options)

 for (const extension in loaders) {
  const loader = loaders[extension]
  output.push({
   test: new RegExp('\\.' + extension + '$'),
   use: loader
  })
 }

 return output
}

exports.createNotifierCallback = () => {
 const notifier = require('node-notifier')

 return (severity, errors) => {
  if (severity !== 'error') return

  const error = errors[0]
  const filename = error.file && error.file.split('!').pop()

  notifier.notify({
   title: packageConfig.name,
   message: severity + ': ' + error.name,
   subtitle: filename || '',
   icon: path.join(__dirname, 'logo.png')
  })
 }
}

/**
 * 增加 hljs 的 classname
 */
exports.wrapCustomClass = function (render) {
 return function (...args) {
  return render(...args)
   .replace('<code class="', '<code class="hljs ')
   .replace('<code>', '<code class="hljs">')
 }
}
/**
 * Format HTML string
 */
exports.convertHtml = function (str) {
 return str.replace(/(&#x)(\w{4});/gi, $0 => String.fromCharCode(parseInt(encodeURIComponent($0).replace(/(%26%23x)(\w{4})(%3B)/g, '$2'), 16)))
}

看util.js文件,我们首先找到我需要修改目标在哪:

// https://vue-loader.vuejs.org/en/configurations/extract-css.html
 return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass: generateLoaders('sass', { indentedSyntax: true }),
  scss: generateLoaders('sass'),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
 }

我们那sass为例,用sass-resources-loader对其改造:

/**
  * sass Less 源文件
  * @param name classFile
  * @returns {string}
  */
 function resolveResouce(name) {
  return path.resolve(__dirname, '../static/' + name);
 }

 //导入全局sass mixin function等
 function generateSassResourceLoader(){
  var loaders = [
   cssLoader,
   //'postcss-loader',
   'sass-loader',
   {
    loader:'sass-resources-loader',
    options: {
     //需要一个全局路径
     resources: [resolveResouce('index.scss')]
    }
   }
  ]
  if(options.extract){
   return ExtractTextPlugin.extract({
    use:loaders,
    fallback: 'vue-style-loader'
   })
  }else{
   return ['vue-style-loader'].concat(loaders)
  }
 }

工具写好好了,接下来直接把上门return对象做些调整,代码如下

// https://vue-loader.vuejs.org/en/configurations/extract-css.html
 return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass:generateSassResourceLoader(),
  scss:generateSassResourceLoader(),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
 }

从代码中可以看出,我们把sass和scss的loader换成我们自己根据sass-resources-loader写的方法了,这样就实现了我们的目标。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript学习笔记之获取当前目录的实现代码
Dec 14 Javascript
让ie6也支持websocket采用flash封装实现
Feb 18 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
May 17 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
使用JQuery在线制作ppt并在线演示源码特效
Sep 08 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
canvas轨迹回放功能实现
Dec 20 Javascript
ionic2中使用自动生成器的方法
Mar 04 Javascript
js闭包学习心得总结
Apr 17 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
Aug 07 Javascript
vue之将echart封装为组件
Jun 02 #Javascript
React学习笔记之高阶组件应用
Jun 02 #Javascript
浅谈node中的cluster集群
Jun 02 #Javascript
详解AngularJS 过滤器的使用
Jun 02 #Javascript
简化vuex的状态管理方案的方法
Jun 02 #Javascript
深入了解javascript 数组的sort方法
Jun 01 #Javascript
js 数组详细操作方法及解析合集
Jun 01 #Javascript
You might like
php中文字符截取防乱码
2008/03/28 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
python脚本监控docker容器
2016/04/27 Python
Python生成器以及应用实例解析
2018/02/08 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
python调用私有属性的方法总结
2020/07/24 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
成品库仓管员岗位职责
2014/04/06 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python