资讯专栏INFORMATION COLUMN

vue项目中如何引入全局sass/less变量、function、mixin

hqman / 589人阅读

摘要:让我们考虑下场景当使用开发移动端的时候,你定义了一个转的函数或者是网站配色的全局变量等,然后到工程里为每个文件或者组件那得重复做这样的工作很多很多次,万一这些公用文件目录路径变怎么办呢,哭都来不及,想想都觉得恐怖呀接下来拯救我们的神器就要登

让我们考虑下场景:当使用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("", "")
  }
}
/**
 * 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写的方法了,这样就实现了我们的目标。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107889.html

相关文章

  • 大话css预编译处理(三):基础语法篇

    摘要:值得庆幸的是,这三款预处理器语言的语法和语法都差不多。在这一节中,我们依次来对比一下这三款预处理器语言各种特性的异同之处,以及使用方法。预处理器语言支持任何变量例如颜色数值文本。 一、Sass、LESS和Stylus的语法 每一种语言都有自己一定的语法规则,CSS预处理器语言也不例外,在真正使用CSS预处器语言之前还有一个不可缺少的知识点,就是对语法的理解。值得庆幸的是,这三款CSS预...

    刘东 评论0 收藏0
  • 前端面试题总结——VUE(持续更新

    摘要:前端面试题总结持续更新中是哪个组件的属性模块的组件。都提供合理的钩子函数,可以让开发者定制化地去处理需求。 前端面试题总结——VUE(持续更新中) 1.active-class是哪个组件的属性? vue-router模块的router-link组件。 2.嵌套路由怎么定义? 在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套。 //引入两个组件 ...

    SimonMa 评论0 收藏0
  • vue入门文章

    摘要:本来想自己写一篇关于入门的文章。后面可能在这篇文章基础上,有所内容的增加。预处理器定义了一种新的专门的编程语言,编译后成正常的文件。 本来想自己写一篇关于vue入门的文章。但是看到链接的文章后,觉得写得太详细了,实在有保存下来的必要。后面可能在这篇文章基础上,有所内容的增加。 CSS预处理器 定义了一种新的专门的编程语言,编译后成正常的CSS文件。为CSS增加一些编程的特性,无需考虑浏...

    seanHai 评论0 收藏0
  • webpack多页应用架构系列(十):如何打造一个自定义的bootstrap

    摘要:我个人惯用的是,因此本文以为例来介绍如何打造一个自定义的。引入全局的方法请看我之前的这篇文章多页应用架构系列四老式插件还不能丢,怎么兼容,我的脚手架项目也是使用的这套方案。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000007043716如果您对本系列文章感兴趣,欢迎关注订阅...

    jindong 评论0 收藏0
  • 现代CSS进化史

    摘要:第一个主流的预处理器是年发布的,它提供了一个新的更简洁的语法缩进代替大括号,没有分号等等,同时增加了一些缺失的高级特性,像变量工具方法还有计算。 英文:https://medium.com/actualize-...编译:缪斯 showImg(https://segmentfault.com/img/bV3vCJ?w=1129&h=735); CSS一直被web开发者认为是最简单也是最...

    msup 评论0 收藏0

发表评论

0条评论

hqman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<