详解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 通用loading动画效果实例代码
Jan 14 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
node.js中的events.emitter.removeListener方法使用说明
Dec 10 Javascript
javascript弹出窗口实现代码
Nov 12 Javascript
利用bootstrapValidator验证UEditor
Sep 14 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
Dec 25 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
vue+element ui实现锚点定位
Jun 29 Vue.js
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 Smarty生成EXCEL文档的代码
2008/08/23 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
PHP队列用法实例
2014/11/05 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
浅析node.js的模块加载机制
2018/05/25 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Python Sleep休眠函数使用简单实例
2015/02/02 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
Django添加sitemap的方法示例
2018/08/06 Python
python实现海螺图片的方法示例
2019/05/12 Python
Python的log日志功能及设置方法
2019/07/11 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
美国家具网站:Cymax
2016/09/17 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
大学生工作推荐信范文
2013/12/02 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
出售房屋委托书范本
2014/09/24 职场文书
初中毕业感言300字
2015/07/31 职场文书
节水宣传标语口号
2015/12/26 职场文书
小学毕业教师寄语
2019/06/21 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Mysql binlog日志文件过大的解决
2021/10/05 MySQL