vite.config.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { defineConfig, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. import legacy from '@vitejs/plugin-legacy'
  5. export default defineConfig(({ mode }) => {
  6. const env = loadEnv(mode, process.cwd())
  7. return {
  8. plugins: [
  9. // 关键调整:适配5+App的WebView(安卓5.0+/iOS 10+)
  10. legacy({
  11. targets: ['Android >= 5.0', 'iOS >= 10'], // 精准适配移动端WebView
  12. additionalLegacyPolyfills: ['regenerator-runtime/runtime'], // 补充ES6+兼容
  13. renderLegacyChunks: true, // 生成兼容包
  14. polyfills: [
  15. 'es.symbol',
  16. 'es.promise',
  17. 'es.array.iterator',
  18. 'es.object.assign' // 解决低版本WebView的对象赋值兼容
  19. ]
  20. }),
  21. vue({
  22. template: {
  23. compilerOptions: {
  24. isCustomElement: (tag) => {
  25. return ['block', 'category', 'field', 'shadow', 'value', 'sep', 'label'].includes(tag)
  26. }
  27. }
  28. }
  29. }),
  30. ],
  31. base: './', // 保留相对路径(核心,不能改)
  32. resolve: {
  33. alias: {
  34. '@': path.resolve(__dirname, './src') // 保留别名
  35. }
  36. },
  37. server: {
  38. host: '0.0.0.0',
  39. proxy: {
  40. '/admin-api': {
  41. target: env.VITE_BASE_URL,
  42. changeOrigin: true
  43. }
  44. }
  45. },
  46. build: {
  47. outDir: 'aiWeb', // 保留原有输出目录(打包后生成aiWeb文件夹)
  48. target: 'es2015', // 关键:降低编译目标,适配旧WebView
  49. assetsDir: 'assets', // 明确静态资源目录
  50. rollupOptions: {
  51. output: {
  52. entryFileNames: `assets/[name]-[hash].js`,
  53. chunkFileNames: `assets/[name]-[hash].js`,
  54. assetFileNames: ({ name }) => {
  55. const extType = name.split('.').pop();
  56. if (/png|jpe?g|gif|svg|webp/i.test(extType)) {
  57. return `assets/images/[name]-[hash].[ext]`;
  58. }
  59. if (/woff2?|ttf|otf|eot/i.test(extType)) {
  60. return `assets/typeface/[name]-[hash].[ext]`;
  61. }
  62. if (/mp4/i.test(extType)) {
  63. return `assets/02video/[name]-[hash].[ext]`;
  64. }
  65. return `assets/[name]-[hash].[ext]`;
  66. }
  67. }
  68. },
  69. // 可选:关闭压缩(避免低版本WebView解析压缩代码失败)
  70. minify: mode === 'production' ? 'terser' : false,
  71. terserOptions: {
  72. compress: {
  73. drop_console: false // 保留控制台日志,方便调试
  74. }
  75. }
  76. }
  77. }
  78. })