vite.config.ts 2.98 KB
import { resolve } from 'node:path'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import UnoCSS from 'unocss/vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import viteCompression from 'vite-plugin-compression'

const pathSrc = resolve(__dirname, 'src')

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd())

  return {
    base: env.VITE_BASE_PATH || '/',
    resolve: {
      alias: {
        '@': pathSrc
      }
    },
    plugins: [
      vue(),
      vueJsx(),
      UnoCSS(),
      // 自动导入 vue / vue-router / pinia 的 API,无需在每个文件手写 import
      AutoImport({
        imports: ['vue', 'vue-router', 'pinia'],
        resolvers: [ElementPlusResolver()],
        dts: 'types/auto-imports.d.ts'
      }),
      // 按需自动注册 Element Plus 组件(样式仍在 main.ts 全局引入,避免样式缺失)
      Components({
        resolvers: [ElementPlusResolver()],
        dts: 'types/components.d.ts'
      }),
      // 生产构建产出 .gz,交给 Nginx 直接吐
      viteCompression({
        verbose: false,
        disable: mode !== 'prod',
        threshold: 10240,
        algorithm: 'gzip',
        ext: '.gz'
      })
    ],
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/styles/variables.scss" as *;`
        }
      }
    },
    server: {
      host: '0.0.0.0',
      port: 5173,
      open: false,
      // 前后端分离:开发期把 /admin-api、/app-api 代理到本地后端(48080)
      proxy: {
        '/admin-api': {
          target: env.VITE_PROXY_TARGET || 'http://127.0.0.1:48080',
          changeOrigin: true
        },
        '/app-api': {
          target: env.VITE_PROXY_TARGET || 'http://127.0.0.1:48080',
          changeOrigin: true
        }
      }
    },
    build: {
      target: 'es2015',
      outDir: 'dist',
      chunkSizeWarningLimit: 2000,
      reportCompressedSize: false,
      minify: 'terser',
      terserOptions: {
        compress: {
          // 生产包去掉 console / debugger(保留 error、warn 便于排障)
          drop_console: false,
          drop_debugger: true,
          pure_funcs: ['console.log']
        }
      },
      rollupOptions: {
        output: {
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
          manualChunks: {
            vue: ['vue', 'vue-router', 'pinia', 'vue-i18n'],
            element: ['element-plus', '@element-plus/icons-vue']
            // editor(wangEditor)与 echarts 在 P4 逐页迁移时开始使用,
            // 现在就写进 manualChunks 会产出空的 chunk 并告警,故等到实际引入时再加。
          }
        }
      }
    }
  }
})