详解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 相关文章推荐
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
jquery里的each使用方法详解
Dec 22 Javascript
修改jquery.lazyload.js实现页面延迟载入
Dec 22 Javascript
JS trim去空格的最佳实践
Oct 30 Javascript
js登录弹出层特效
Mar 07 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
javascript编程实现栈的方法详解【经典数据结构】
Apr 11 Javascript
JS监听事件的叠加和移除功能
Nov 19 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
May 07 Javascript
jquery分页优化操作实例分析
Aug 23 jQuery
Vue extend的基本用法(实例详解)
Dec 09 Javascript
uniapp微信小程序:key失效的解决方法
Jan 20 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准确取得服务器IP地址的方法
2015/06/02 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
js操作滚动条事件实例
2015/01/29 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python基础练习之几个简单的游戏
2017/11/10 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
django 多数据库配置教程
2018/05/30 Python
python3的输入方式及多组输入方法
2018/10/17 Python
基于python的Paxos算法实现
2019/07/03 Python
python实现中文文本分句的例子
2019/07/15 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
会计员岗位职责
2014/03/15 职场文书
市场营销工作计划书
2014/05/06 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
校运会新闻稿
2015/07/17 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
浅谈Python数学建模之数据导入
2021/06/23 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python