详解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 相关文章推荐
js 颜色选择器(兼容firefox)
Mar 05 Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 Javascript
jquery实现勾选复选框触发事件给input赋值
Feb 01 Javascript
轻松实现js弹框显示选项
Sep 13 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
如何提高javascript加载速度
Dec 26 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
js中less常用的方法小结
Aug 09 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
微信小程序实现简单购物车功能
Dec 30 Javascript
AJAX学习笔记
May 18 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 array_intersect()函数使用代码
2009/01/14 PHP
php中的动态调用实例分析
2015/01/07 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
jquery实现抽奖功能
2020/10/22 jQuery
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
python实现调用其他python脚本的方法
2014/10/05 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python flask搭建web应用教程
2019/11/19 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
团队经理竞聘书
2014/03/31 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang