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 并告警,故等到实际引入时再加。 } } } } } })