import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' import compression from 'vite-plugin-compression' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), // Element Plus 自动导入 AutoImport({ resolvers: [ElementPlusResolver()], imports: ['vue', 'vue-router', 'pinia'], dts: 'src/types/auto-imports.d.ts', }), Components({ resolvers: [ElementPlusResolver()], dts: 'src/types/components.d.ts', }), // Gzip 压缩 compression({ algorithm: 'gzip', ext: '.gz', threshold: 10240, // 大于 10KB 才压缩 }), ], resolve: { alias: { '@': resolve(__dirname, 'src'), }, }, server: { host: '0.0.0.0', port: 3000, proxy: { '/api': { target: 'http://localhost:8000', changeOrigin: true, }, }, }, build: { outDir: 'dist', sourcemap: false, minify: 'esbuild', // 块大小警告阈值 chunkSizeWarningLimit: 500, rollupOptions: { output: { chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/[ext]/[name]-[hash].[ext]', // 优化的代码分割策略 manualChunks(id) { // Vue 核心库 if (id.includes('node_modules/vue') || id.includes('node_modules/vue-router') || id.includes('node_modules/pinia')) { return 'vue-vendor' } // Element Plus if (id.includes('node_modules/element-plus')) { return 'element-plus' } // ECharts if (id.includes('node_modules/echarts') || id.includes('node_modules/vue-echarts') || id.includes('node_modules/zrender')) { return 'echarts' } // 其他第三方库 if (id.includes('node_modules')) { return 'vendor' } }, }, }, // 资源内联阈值 assetsInlineLimit: 4096, // CSS 代码分割 cssCodeSplit: true, }, // 预构建优化 optimizeDeps: { include: [ 'vue', 'vue-router', 'pinia', 'axios', 'element-plus', 'echarts', 'vue-echarts', ], }, })