vue-cli脚手架build目录下utils.js工具配置文件详解


Posted in Javascript onSeptember 14, 2018

此文章用来解释vue-cli脚手架build目录中的utils.js配置文件

1.此配置文件是vue开发环境的wepack相关配置文件,主要用来处理css-loader和vue-style-loader

2.关于注释 •当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单独的注释模块,请自行查看

3.上代码

// 引入nodejs路径模块
var path = require('path')
// 引入config目录下的index.js配置文件
var config = require('../config')
// 引入extract-text-webpack-plugin插件,用来将css提取到单独的css文件中
// 详情请看(1)
var ExtractTextPlugin = require('extract-text-webpack-plugin')
// exports其实就是一个对象,用来导出方法的最终还是使用module.exports,此处导出assetsPath
exports.assetsPath = function (_path) {
  // 如果是生产环境assetsSubDirectory就是'static',否则还是'static',哈哈哈
  var assetsSubDirectory = process.env.NODE_ENV === 'production'
    ? config.build.assetsSubDirectory
    : config.dev.assetsSubDirectory
  // path.join和path.posix.join的区别就是,前者返回的是完整的路径,后者返回的是完整路径的相对根路径
  // 也就是说path.join的路径是C:a/a/b/xiangmu/b,那么path.posix.join就是b
  return path.posix.join(assetsSubDirectory, _path)
  // 所以这个方法的作用就是返回一个干净的相对根路径
}

// 下面是导出cssLoaders的相关配置
exports.cssLoaders = function (options) {
  // options如果没值就是空对象
  options = options || {}
  // cssLoader的基本配置
  var cssLoader = {
    loader: 'css-loader',
    options: {
      // options是用来传递参数给loader的
      // minimize表示压缩,如果是生产环境就压缩css代码
      minimize: process.env.NODE_ENV === 'production',
      // 是否开启cssmap,默认是false
      sourceMap: options.sourceMap
    }
  }

  // generate loader string to be used with extract text plugin
  function generateLoaders (loader, loaderOptions) {
    // 将上面的基础cssLoader配置放在一个数组里面
    var loaders = [cssLoader]
    // 如果该函数传递了单独的loader就加到这个loaders数组里面,这个loader可能是less,sass之类的
    if (loader) {
      loaders.push({
        // 加载对应的loader
        loader: loader + '-loader',
        // Object.assign是es6的方法,主要用来合并对象的,浅拷贝
        options: Object.assign({}, loaderOptions, {
          sourceMap: options.sourceMap
        })
      })
    }

    // Extract CSS when that option is specified
    // (which is the case during production build)
    // 注意这个extract是自定义的属性,可以定义在options里面,主要作用就是当配置为true就把文件单独提取,false表示不单独提取,这个可以在使用的时候单独配置,瞬间觉得vue作者好牛逼
    if (options.extract) {
      return ExtractTextPlugin.extract({
        use: loaders,
        fallback: 'vue-style-loader'
      })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }
    // 上面这段代码就是用来返回最终读取和导入loader,来处理对应类型的文件
  }

  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
  return {
    css: generateLoaders(), // css对应 vue-style-loader 和 css-loader
    postcss: generateLoaders(), // postcss对应 vue-style-loader 和 css-loader
    less: generateLoaders('less'), // less对应 vue-style-loader 和 less-loader
    sass: generateLoaders('sass', { indentedSyntax: true }), // sass对应 vue-style-loader 和 sass-loader
    scss: generateLoaders('sass'), // scss对应 vue-style-loader 和 sass-loader
    stylus: generateLoaders('stylus'), // stylus对应 vue-style-loader 和 stylus-loader
    styl: generateLoaders('stylus') // styl对应 vue-style-loader 和 styl-loader 
  }
}

// Generate loaders for standalone style files (outside of .vue)
// 下面这个主要处理import这种方式导入的文件类型的打包,上面的exports.cssLoaders是为这一步服务的
exports.styleLoaders = function (options) {
  var output = []
  // 下面就是生成的各种css文件的loader对象
  var loaders = exports.cssLoaders(options)
  for (var extension in loaders) {
    // 把每一种文件的laoder都提取出来
    var loader = loaders[extension]
    output.push({
      // 把最终的结果都push到output数组中,大事搞定
      test: new RegExp('\\.' + extension + '$'),
      use: loader
    })
  }
  return output
}

注释

(1)extract-text-webpack-plugin插件是用来将文本从bundle中提取到一个单独的文件中

基本使用方法如下

const ExtractTextPlugin = require("extract-text-webpack-plugin");
  module.exports = {
    module: {
      rules: [
        {
          test: /\.css$/, //主要用来处理css文件
          use: ExtractTextPlugin.extract({
            fallback: "style-loader", // fallback表示如果css文件没有成功导入就使用style-loader导入
            use: "css-loader" // 表示使用css-loader从js读取css文件
          })
        }
      ],
      plugins: [
        new ExtractTextPlugin("styles.css") //表示生成styles.css文件
      ]
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript设计模式之解释器模式详解
Jun 05 Javascript
javascript时间函数大全
Jun 30 Javascript
JavaScript将取代AppleScript?
Sep 18 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
May 03 Javascript
JavaScript获取两个数组交集的方法
Jun 09 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
Nov 30 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
利用JQuery实现datatables插件的增加和删除行功能
Jan 06 Javascript
Vue之Watcher源码解析(1)
Jul 19 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 #Javascript
在vue项目中使用md5加密的方法
Sep 14 #Javascript
在vue项目中引用Iview的方法
Sep 14 #Javascript
详解webpack-dev-server使用方法
Sep 14 #Javascript
JS 实现微信扫一扫功能
Sep 14 #Javascript
详解webpack2异步加载套路
Sep 14 #Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
Sep 14 #Javascript
You might like
php反射类ReflectionClass用法分析
2016/05/12 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
Python中的pprint折腾记
2015/01/21 Python
简单介绍Python中的floor()方法
2015/05/15 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python3下pygame如何实现显示中文
2020/01/11 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
大一学生职业生涯规划
2014/03/11 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
建筑管理专业求职信
2014/07/28 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
2015年外联部工作总结
2015/04/03 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
MySQL表字段时间设置默认值
2021/05/13 MySQL
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
Golang 链表的学习和使用
2022/04/19 Golang