import {defineConfig} from 'vite'
import Vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
import {resolve} from 'path'
import {visualizer} from "rollup-plugin-visualizer";
import DefineOptions from 'unplugin-vue-define-options/vite' // 引入插件
import {Plugin as importToCDN} from 'vite-plugin-cdn-import';
import viteImagemin from 'vite-plugin-imagemin'
import viteCompression from 'vite-plugin-compression'

function pathResolve(dir) {
  return resolve(__dirname, ".", dir)
}

const lifecycle = process.env.npm_lifecycle_event;

// https://vitejs.dev/config/
export default defineConfig({
  base: './',
  envDir: "env",
  plugins: [
    // VueMacros({
    //   plugins: {
    //     vue: Vue(),
    //     vueJsx: VueJsx(), // if needed
    //   },
    //   betterDefine: true,
    //   // reactivityTransform: {
    //   //   exclude: [/node_modules/, /jQuery\.js/]
    //   // }
    // }),
    lifecycle === 'report' ? visualizer({open: false}) : null,
    DefineOptions(),
    Vue(),
    VueJsx(),
    importToCDN({
      modules: [
        {
          name: 'vue',
          var: 'Vue',
          path: `https://lib.baomitu.com/vue/3.4.21/vue.runtime.global.prod.min.js`,
        },
        {
          name: 'vue-router',
          var: 'VueRouter',
          path: 'https://lib.baomitu.com/vue-router/4.3.0/vue-router.global.prod.min.js',
        },
        {
          name: 'vue-demi',
          var: 'VueDemi',
          path: 'https://lib.baomitu.com/vue-demi/0.14.7/index.iife.min.js',
        },
        {
          name: 'mockjs',
          var: 'Mock',
          path: 'https://lib.baomitu.com/Mock.js/1.0.1-beta3/mock-min.js',
        },
        {
          name: 'axios',
          var: 'axios',
          path: 'https://lib.baomitu.com/axios/1.6.8/axios.min.js',
        }
      ],
    }),
    // viteCompression({
    //   verbose: false,
    //   disable: false,
    //   threshold: 10240,
    //   algorithm: 'brotliCompress',
    // }),
    // viteCompression({
    //   verbose: false,
    //   disable: false,
    //   algorithm: 'gzip',
    //   threshold: 10240,
    // }),
    // viteImagemin({
    //   gifsicle: {
    //     optimizationLevel: 7,
    //     interlaced: false,
    //   },
    //   optipng: {
    //     optimizationLevel: 7,
    //   },
    //   mozjpeg: {
    //     quality: 20,
    //   },
    //   pngquant: {
    //     quality: [0.8, 0.9],
    //     speed: 4,
    //   },
    //   svgo: {
    //     plugins: [
    //       {
    //         name: 'removeViewBox',
    //       },
    //       {
    //         name: 'removeEmptyAttrs',
    //         active: false,
    //       },
    //     ],
    //   },
    // }),
  ],
  resolve: {
    alias: {
      "@": pathResolve("src"),
    },
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  build: {
    sourcemap: false,
    rollupOptions: {
      // https://rollupjs.org/guide/en/#outputmanualchunks
      output: {
        manualChunks(id, {getModuleInfo}) {
          const reg = /(.*)\/src\/components\/(.*)/
          if (reg.test(id)) {
            const importersLen = getModuleInfo(id).importers.length;
            // 被多处引用
            if (importersLen > 1) return 'common'
          }
          if (id.includes('node_modules')) return 'vendor'

          if (id.includes('/src/pages/home/Publish.vue')) return 'other'

          if (id.includes('/src/pages/home/Music.vue')) return 'other'
          if (id.includes('/src/pages/home/MusicRankList.vue')) return 'other'
          if (id.includes('/src/pages/home/LivePage.vue')) return 'other'
          if (id.includes('/src/pages/home/SearchPage.vue')) return 'other'

          if (id.includes('/src/pages/shop/Shop.vue')) return 'other'
          if (id.includes('/src/pages/shop/GoodsDetail.vue')) return 'other'

          if (id.includes('/src/pages/message/Message.vue')) return 'other'
          if (id.includes('/src/pages/message/Fans.vue')) return 'other'
          if (id.includes('/src/pages/message/AllMessage.vue')) return 'other'
          if (id.includes('/src/pages/message/notice/DouyinHelper.vue')) return 'other'
          if (id.includes('/src/pages/message/notice/SystemNotice.vue')) return 'other'
          if (id.includes('/src/pages/message/notice/TaskNotice.vue')) return 'other'
          if (id.includes('/src/pages/message/notice/LiveNotice.vue')) return 'other'
          if (id.includes('/src/pages/message/notice/MoneyNotice.vue')) return 'other'

          if (id.includes('/src/pages/me/Me.vue')) return 'other'
          if (id.includes('/src/pages/me/Visitors.vue')) return 'other'
          if (id.includes('/src/pages/me/RequestUpdate.vue')) return 'other'
          if (id.includes('/src/pages/me/userinfo/EditUserInfo.vue')) return 'other'
          if (id.includes('/src/pages/me/userinfo/EditUserInfoItem.vue')) return 'other'
          if (id.includes('/src/pages/me/MyMusic.vue')) return 'other'

          if (id.includes('/src/pages/other/VideoDetail.vue')) return 'other'
          if (id.includes('/src/pages/other/AlbumDetail.vue')) return 'other'

          if (id.includes('/src/pages/people/FindAcquaintance.vue')) return 'other'
          if (id.includes('/src/pages/people/FollowAndFans.vue')) return 'other'
        },
        chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
        entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
        assetFileNames: 'assets/[name]-[hash].[ext]', // 资源文件像 字体,图片等
      },
    },
    assetsInlineLimit: 2048
  },
  esbuild: {
    drop: ['console', 'debugger']
  },
  server: {
    port: 3000,
    open: true,
    host: '0.0.0.0',
    fs: {
      strict: false,
    }
  }
})