import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src') } }, // 生产/开发环境配置 base: process.env.NODE_ENV === 'production' ? '/' : '/', // 开发服务器配置 server: { port: 8081, host: '0.0.0.0', // 允许外部访问 allowedHosts: true, // 允许所有主机访问 proxy: { '/api': { // 开发时代理到本地后端(统一为 localhost:8080) target: process.env.VITE_APP_API_URL || 'http://localhost:8080', changeOrigin: true, secure: false, // 后端服务器路径已经包含 /api,所以不需要 rewrite // 前端请求 /api/xxx 会转发到 http://localhost:8080/api/xxx // 调试时将 cookie 域改写为 localhost cookieDomainRewrite: 'localhost', cookiePathRewrite: '/', configure: (proxy, _options) => { proxy.on('error', (err, _req, _res) => { console.log('proxy error', err); }); proxy.on('proxyReq', (proxyReq, req, _res) => { console.log('Sending Request to the Target:', req.method, req.url); }); proxy.on('proxyRes', (proxyRes, req, _res) => { console.log('Received Response from the Target:', proxyRes.statusCode, req.url); const setCookie = proxyRes.headers['set-cookie']; if (setCookie) { console.log('Proxy Set-Cookie:', setCookie); } }); } } } }, // public 目录配置(确保字体文件等静态资源被复制) publicDir: 'public', // 生产环境构建配置 build: { outDir: 'dist', assetsDir: 'static', copyPublicDir: true, // 使用 terser 压缩,移除 console minify: 'terser', terserOptions: { compress: { drop_console: true, drop_debugger: true } }, // 启用 CSS 代码分割 cssCodeSplit: true, // 禁用 source map sourcemap: false, // 代码分割优化 rollupOptions: { output: { // 为所有资源文件(包括SVG)生成内容哈希 assetFileNames: (assetInfo) => { // 获取文件扩展名 const extType = assetInfo.name.split('.').pop(); // 图片类型(包括SVG) if (/png|jpe?g|gif|svg|webp|ico/i.test(extType)) { return `static/images/[name]-[hash][extname]`; } // 字体类型 if (/woff2?|eot|ttf|otf/i.test(extType)) { return `static/fonts/[name]-[hash][extname]`; } // 其他资源 return `static/[name]-[hash][extname]`; }, // JS文件哈希 chunkFileNames: 'static/js/[name]-[hash].js', entryFileNames: 'static/js/[name]-[hash].js', manualChunks: { 'vue-vendor': ['vue', 'vue-router', 'pinia'], 'element-plus': ['element-plus', '@element-plus/icons-vue'], 'utils': ['axios'] } } }, // 块大小警告限制 chunkSizeWarningLimit: 1000 } })