'use strict'
//1、path模块是路径设置,不论是在这个配置中还是其他配置中,都是必不可少的。
//2、util是对vue-loader对于css预编译一些提取的工具模块,因为对于个人开发而言,里面提供了sass,less,stylus,possCss等一系列预编译解析的loader。
//3、config是对开发环境和生产环境的一系列不同参数的路径等配置。
//4、vueLoaderConfig也是同样基础生产环境和开发环境对vue-loader进行配置。
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

//这是一个封装函数,进行传参,获取绝对路径,方便对import时引入地址的方便填写。
//path.join()是对多个字符串进行拼接,此时__dirname是build文件路径..代表在出去一层,就是文件的根路径,dir这个参数则是你要传的文件夹,如果我们传crs的话就从src目录开始查找。
function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

const createLintingRule = () => ({
  test: /\.(js|vue)$/,
  loader: 'eslint-loader',
  enforce: 'pre',
  include: [resolve('src'), resolve('test')],
  options: {
    formatter: require('eslint-friendly-formatter'),
    emitWarning: !config.dev.showEslintErrorsInOverlay
  }
})

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    //main.js是webpack的入口文件,在main.js中加载的是App.vue文件,所以App.vue是渲染的入口,在main.js的里面#app指代的是index.html里的id为app的DOM元素。
    app: './src/main.js'   
  },
  //output是我们输出文件的路径。
 
  output: {
    //1、path代表我们要输出的路径,config.build.assetsRoot里是assetsRoot: path.resolve(__dirname, '../dist'),这个是想把打包出来的文件路径放在根目录的dist目录下。
    path: config.build.assetsRoot,
    //2、filename: '[name].js'文件名,这个是用来打包后出的文件名,为什么用name,因为会打包出来三个文件,第一个是源代码文件,第二个是runtime文件,第三个是ventor文件,所以每个文件打包出来的名字就跟定义的chunkname一致。
    filename: '[name].js',
    //3、publicPath...是静态文件访问的路径,这个要根据你的静态文件的loader进行拼接配置。
    //当进行环境是生产环境的话我们就用config文件中config.build.assetsPublicPath这个属性
    //如果是生产环境 ,我们则用config.dev.assetsPublicPath中的属性,
    //两者都是“/”
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  //resolve是用来对模块进行解析,就是所谓的libary第三方库
  resolve: {
    //extensions 是用来对模块的后缀进行解析,当我们引入自己写的模块,比方说:
    //var config = require('../config') webpack.base里引入了config模块的时候,没有带js后缀,
    //文件本质上是不会识别的,但有了这个配置,会先进行.js后缀进行匹配,没有在匹配.vue,没有在匹配
    //.json,如果还是没有找到就会报错,文件没有找到no find.
    extensions: ['.js', '.vue', '.json'],
    //2、alias是配置别名,什么是别名呢,如果你在一个很深的文件引入其他文件中又一个很深的文件,
    //相对路径会写到吐血,那用别名我们定入一个入口位置,我们用@来代替src目录的绝对路径,此时就
    //用到了上面function resolve封装的函数,此时绝对路径就定位到了src目录,因为我们所有文件
    //都放在src目录下,就可以通过src目录直接定位到你想要找的文件。
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      ...(config.dev.useEslint ? [createLintingRule()] : []),
        //1、test是用来解析所有.vue后缀的文件
        //2、loader我们用什么npm什么形式的loader去解析
        //3、include是代表我们解析的文件只包含那些东西。
        //比方说babel-loader是进行es6转换成es5的,但是考虑性能问题,打包时间问题,
        //我们不考虑解析node-module里的文件include: [resolve('src'), resolve('test')]
        //这里用一个数组来包括的要解析的文件夹路径,还是再次用到了relsove这个封装的函数
        //options是对解析文件参数配置
        //1.对于url-loader来说 limit10000代表当小时1000kb的文件我们则可以转面base64
        //2.name : 对输出的内容地行地址转换,当我们一个图在dev开发的时候用../../aa/aa.jpg,
        //你想到生产环境地址肯定不会对那怎么样此时就要用到地址转换
        //options: vueLoaderConfig 是对vue文件的style样式进行解析,解析编译,再进行ExtractTextPlugin来进行合并
      {
        // 对所有.vue文件使用vue-loader
        test: /\.vue$/,
        loader: 'vue-loader',
         options: vueLoaderConfig
      },
      {
        // 对src和test文件夹下的.js文件使用babel-loader
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test')]
      },
      {
        // 对图片资源文件使用url-loader,query.name指明了输出的命名规则
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        //对字体资源文件使用url-loader,query.name指明了输出的命名规则
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
  node: {
    setImmediate: false,
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  }
}

Logo

前往低代码交流专区

更多推荐