import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' import legacy from '@vitejs/plugin-legacy' export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()) return { plugins: [ // 关键调整:适配5+App的WebView(安卓5.0+/iOS 10+) legacy({ targets: ['Android >= 5.0', 'iOS >= 10'], // 精准适配移动端WebView additionalLegacyPolyfills: ['regenerator-runtime/runtime'], // 补充ES6+兼容 renderLegacyChunks: true, // 生成兼容包 polyfills: [ 'es.symbol', 'es.promise', 'es.array.iterator', 'es.object.assign' // 解决低版本WebView的对象赋值兼容 ] }), vue({ template: { compilerOptions: { isCustomElement: (tag) => { return ['block', 'category', 'field', 'shadow', 'value', 'sep', 'label'].includes(tag) } } } }), ], base: './', // 保留相对路径(核心,不能改) resolve: { alias: { '@': path.resolve(__dirname, './src') // 保留别名 } }, server: { host: '0.0.0.0', proxy: { '/admin-api': { target: env.VITE_BASE_URL, changeOrigin: true } } }, build: { outDir: 'aiWeb', // 保留原有输出目录(打包后生成aiWeb文件夹) target: 'es2015', // 关键:降低编译目标,适配旧WebView assetsDir: 'assets', // 明确静态资源目录 rollupOptions: { output: { entryFileNames: `assets/[name]-[hash].js`, chunkFileNames: `assets/[name]-[hash].js`, assetFileNames: ({ name }) => { const extType = name.split('.').pop(); if (/png|jpe?g|gif|svg|webp/i.test(extType)) { return `assets/images/[name]-[hash].[ext]`; } if (/woff2?|ttf|otf|eot/i.test(extType)) { return `assets/typeface/[name]-[hash].[ext]`; } if (/mp4/i.test(extType)) { return `assets/02video/[name]-[hash].[ext]`; } return `assets/[name]-[hash].[ext]`; } } }, // 可选:关闭压缩(避免低版本WebView解析压缩代码失败) minify: mode === 'production' ? 'terser' : false, terserOptions: { compress: { drop_console: false // 保留控制台日志,方便调试 } } } } })