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 相关文章推荐
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
javascript实现设置、获取和删除Cookie的方法
Jun 01 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
Oct 14 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
Oct 19 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
Sep 25 Javascript
判断div滑动到底部的scroll实例代码
Nov 15 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
微信小程序吸底区域适配iPhoneX的实现
Apr 09 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
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
加速XP搜索功能堪比vista
2007/03/22 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
代理商会议邀请函
2014/01/27 职场文书
临床医师个人自我评价
2014/04/06 职场文书
教师求职信范文
2014/05/24 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
总经理致辞
2015/07/29 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL