详解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 相关文章推荐
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
理解javascript中的MVC模式
Jan 28 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
Vue自定义指令详解
Jul 28 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
vue中template的三种写法示例
Oct 21 Javascript
ant design vue 表格table 默认勾选几项的操作
Oct 31 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 Javascript
TypeScript中条件类型精读与实践记录
Oct 05 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
关于手调机和数调机的选择
2021/03/02 无线电
php分页代码学习示例分享
2014/02/20 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
酒店led欢迎词
2014/01/09 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
留学推荐信中文范文
2015/03/26 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
公司保洁员管理制度
2015/08/04 职场文书
详解Spring事件发布与监听机制
2021/06/30 Java/Android
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
vue使用element-ui按需引入
2022/05/20 Vue.js
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers