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对象模型-执行模型
Apr 28 Javascript
半角全角相互转换的js函数
Oct 16 Javascript
JavaScript this调用规则说明
Mar 08 Javascript
读jQuery之二(两种扩展)
Jun 11 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
Jan 16 Javascript
javascript实现原生ajax的几种方法介绍
Sep 21 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
JS获得选取checkbox整行数据的方法
Jan 28 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
Vue.js动态添加、删除选题的实例代码
Sep 30 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
Jul 20 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类Class的概念
2012/06/14 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
php递归函数怎么用才有效
2018/02/24 PHP
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jquery使用经验小结
2015/05/20 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
15个值得收藏的JavaScript函数
2021/09/15 Javascript
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
Python的property属性详细讲解
2022/04/11 Python