详解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 核心参考教程 内置对象
Oct 13 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
Nov 06 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
jQuery的ready方法实现原理分析
Oct 26 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
详解Vue组件之作用域插槽
Nov 22 Javascript
JS中FileReader类实现文件上传及时预览功能
Mar 27 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
微信小程序轮播图swiper代码详解
Dec 01 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开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
详解如何减少python内存的消耗
2019/08/09 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Python configparser模块常用方法解析
2020/05/22 Python
Python while true实现爬虫定时任务
2020/06/08 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
几个数据库方面的面试题
2016/07/01 面试题
大学生职业规划前言模板
2013/12/27 职场文书
会计学专业自荐信
2014/06/25 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
python 调用js的四种方式
2021/04/11 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
python模板入门教程之flask Jinja
2022/04/11 Python