const baseURL = process.env.VUE_APP_URL
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const path = require('path')

const resolve = (dir) => path.join(__dirname, '.', dir)
const productionGzipExtensions = ['js', 'css']

// 导入全局scss
function addStyleResource(rule) {
  rule.use('style-resource')
    .loader('style-resources-loader')
    .options({
      patterns: [
        path.resolve(__dirname, './src/static/styles/common.scss')
      ]
    })
}
// 开发的cdn
const devCdn = {
  css: ['https://unpkg.com/vant@2.12.48/lib/index.css'],
  js: []
}
// 打包的cdn
const proCdn = {
  css: [
    'https://unpkg.com/vant@2.12.48/lib/index.css'
  ],
  js: [
    'https://unpkg.com/vue@2.6.14/dist/vue.runtime.min.js',
    'https://unpkg.com/vue-router@3.5.4/dist/vue-router.min.js',
    'https://unpkg.com/vuex@3.6.2/dist/vuex.min.js',
    'https://unpkg.com/axios@0.27.2/dist/axios.min.js',
    'https://unpkg.com/vant@2.12.48/lib/vant.min.js'
  ]
}
// 打包忽略
const objExternals = {
  vue: 'Vue',
  axios: 'axios',
  vuex: 'Vuex',
  'vue-router': 'VueRouter',
  vant: 'vant'
}

module.exports = {
  publicPath: './',
  outputDir: 'dist',
  assetsDir: 'assets',
  lintOnSave: true,
  productionSourceMap: false, // 不需要生产环境的 source map
  chainWebpack: config => {
    const types = ['vue-modules', 'vue', 'normal-modules', 'normal']
    types.forEach(type => addStyleResource(config.module.rule('scss').oneOf(type)))
    // 配置，将当前页定义的cdn值传到主页面（index.html）
    config.plugin('html').tap(args => {
      // 这里我是除本地环境，其余均使用CDN，可自己选择是否配置
      args[0].cdn = process.env.VUE_APP_STAGE === 'development' ? devCdn : proCdn
      return args
    })
  },
  pluginOptions: {
    windicss: {
      preflight: false,
      // 具体配置请查看 https://github.com/windicss/vite-plugin-windicss/blob/main/packages/plugin-utils/src/options.ts
    },
  },
  configureWebpack: {
    devServer: {
      open: false,
      host: '0.0.0.0',
      port: '8800',
      hot: true,
      proxy: {
        '/api': {
          target: baseURL,
          secure: false,
          changeOrigin: true, // 是否允许跨域
          pathRewrite: {
            '^/api': '/'
          }
        }
      }
    },
    resolve: {
      extensions: ['.js', '.vue', '.json'],
      // 别名
      alias: {
        '@': resolve('src')
      }
    },
    // 定义webpack打包配置
    externals: process.env.VUE_APP_STAGE === 'development' ? {} : objExternals,
    plugins: [
      // 配置compression-webpack-plugin压缩ZIP加速
      new CompressionWebpackPlugin({
        algorithm: 'gzip',
        // eslint-disable-next-line
        test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
        threshold: 10240,
        minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
        deleteOriginalAssets: false // 删除原文件
      }),
      // build时生成打包报告
      new BundleAnalyzer({
        analyzerMode: 'disabled', // 启用:server 不启用:disabled
        openAnalyzer: true, // 是否自动打开报告页面
        analyzerPort: 9999 // 报告页面端口
      })
    ]
  }
}
