let path = require('path') // 引入path模块
const webpack = require('webpack') // 引入webpack模块
const ThemeColorReplacer = require('webpack-theme-color-replacer') // 引入webpack-theme-color-replacer插件 主题色替换插件
const {getThemeColors, modifyVars} = require('./src/utils/themeUtil') // 引入主题色替换工具
const {resolveCss} = require('./src/utils/theme-color-replacer-extend') // 引入主题色替换工具
const CompressionWebpackPlugin = require('compression-webpack-plugin') // 引入webpack压缩插件

const productionGzipExtensions = ['js', 'css'] // 需要压缩的文件后缀
const isProd = process.env.NODE_ENV === 'production' // 是否生产环境

const assetsCDN = { // 静态资源CDN地址
  // webpack 编译好的文件存在哪里
  externals: { 
    vue: 'Vue',
    'vue-router': 'VueRouter',
    vuex: 'Vuex',
    axios: 'axios',
    nprogress: 'NProgress',
    clipboard: 'ClipboardJS',
    '@antv/data-set': 'DataSet',
    'js-cookie': 'Cookies'
  },
  css: [
  ],
  js: [
    '/js/vue.min.js',
    '/js/vue-router.min.js',
    '/js/vuex.min.js',
    '/js/axios.min.js',
    '/js/nprogress.min.js',
    '/js/clipboard.min.js',
    '/js/data-set.min.js',
    '/js/js.cookie.min.js'
  ]
}

module.exports = {
  devServer: { // 代理配置
    // proxy: {
    //   '/api': { //此处要与 /services/api.js 中的 API_PROXY_PREFIX 值保持一致
    //     target: process.env.VUE_APP_API_BASE_URL,
    //     changeOrigin: true,
    //     pathRewrite: {
    //       '^/api': ''
    //     }
    //   }
    // }
  },
  pluginOptions: { // 插件配置
    'style-resources-loader': { // 全局样式配置
      preProcessor: 'less', // 预处理器
      patterns: [path.resolve(__dirname, "./src/theme/theme.less")], // 引入全局样式
    }
  },
  // webpack配置
  configureWebpack: config => { // webpack 配置
    config.entry.app = ["babel-polyfill", "whatwg-fetch", "./src/main.js"]; // 兼容ie
    config.performance = { // 性能配置
      hints: false // 关闭性能提示
    }
    config.plugins.push( // 配置主题色替换插件
      new ThemeColorReplacer({ // 主题色替换插件
        fileName: 'css/theme-colors-[contenthash:8].css', // 生成的文件名
        matchColors: getThemeColors(), // 主题色 从src/utils/themeUtil.js中获取
        injectCss: true, // 是否注入css
        resolveCss // 解析css
      })
    )
    // Ignore all locale files of moment.js
    config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)) // 忽略moment的本地化文件
    // 生产环境下将资源压缩成gzip格式
    if (isProd) { // 如果是生产环境
      // add `CompressionWebpack` plugin to webpack plugins
      config.plugins.push(new CompressionWebpackPlugin({ // 配置webpack压缩插件
        algorithm: 'gzip', // 压缩算法
        test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), // 匹配文件名
        threshold: 10240, // 对超过10k的数据压缩
        minRatio: 0.8 // 压缩比例，值为0 ~ 1
      }))
    }
    // if prod, add externals
    if (isProd) { // 如果是生产环境
      config.externals = assetsCDN.externals // 配置静态资源CDN地址
    }
  },
  chainWebpack: config => { // webpack 链式配置
    // 生产环境下关闭css压缩的 colormin 项，因为此项优化与主题色替换功能冲突
    if (isProd) { // 如果是生产环境
      config.plugin('optimize-css') // 配置css压缩
        .tap(args => { // 获取参数
            args[0].cssnanoOptions.preset[1].colormin = false // 关闭colormin
          return args // 返回参数
        })
    }
    // 生产环境下使用CDN
    if (isProd) { // 如果是生产环境
      config.plugin('html') // 配置html
        .tap(args => { // 获取参数
          args[0].cdn = assetsCDN // 配置静态资源CDN地址
        return args // 返回参数
      })
    }
  },
  css: { // css配置
    loaderOptions: { // css预设器配置项
      less: { // 配置less（其他样式解析用法一致）
        lessOptions: { // less 配置
          modifyVars: modifyVars(), // 主题色 从src/utils/themeUtil.js中获取
          javascriptEnabled: true // 允许内联js 用于动态修改主题色
        }
      }
    }
  },
  publicPath: process.env.VUE_APP_PUBLIC_PATH, // 部署应用包时的基本 URL
  outputDir: 'dist', // 生产环境构建文件的目录
  assetsDir: 'static', // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录
  productionSourceMap: false // 生产环境的 source map
}
