vite.config.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { defineConfig, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import { resolve } from 'path'
  4. import AutoImport from 'unplugin-auto-import/vite'
  5. import Components from 'unplugin-vue-components/vite'
  6. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  7. /**
  8. * 开发代理后台环境(一键切换)
  9. * - online:线上 Tomcat http://121.43.55.7:11091/sjnmtybt (Swagger)
  10. * - local :本机 http://localhost:8088/sjnmtybt
  11. *
  12. * 切换方式(任选其一):
  13. * 1) npm run dev → 默认 online
  14. * 2) npm run dev:local → 本机后台
  15. * 3) npm run dev:online → 线上后台
  16. * 4) 改下面 DEFAULT_API_ENV,或设环境变量 VITE_API_ENV=local|online
  17. *
  18. * 注意:不能用 vite --mode local(与 .env.local 后缀冲突),故用 backend-local / backend-online。
  19. */
  20. const DEFAULT_API_ENV: 'online' | 'local' = 'online'
  21. const API_TARGETS = {
  22. online: 'http://121.43.55.7:11091',
  23. local: 'http://localhost:8088',
  24. } as const
  25. function resolveApiEnv(mode: string, fromEnv: string): 'online' | 'local' {
  26. if (mode === 'backend-local' || mode === 'local') return 'local'
  27. if (mode === 'backend-online' || mode === 'online') return 'online'
  28. if (fromEnv === 'local' || fromEnv === 'online') return fromEnv
  29. return DEFAULT_API_ENV
  30. }
  31. // https://vite.dev/config/
  32. export default defineConfig(({ mode }) => {
  33. const env = loadEnv(mode, process.cwd(), '')
  34. const fromEnv = (env.VITE_API_ENV || process.env.VITE_API_ENV || '').toLowerCase()
  35. const apiEnv = resolveApiEnv(mode, fromEnv)
  36. const apiTarget = API_TARGETS[apiEnv]
  37. console.log(`[vite] 开发代理后台 → ${apiEnv} (${apiTarget}/sjnmtybt)`)
  38. return {
  39. // 规避 Vite 8 开发客户端未注入 __BUNDLED_DEV__ 导致页面无法启动
  40. define: {
  41. __BUNDLED_DEV__: 'false',
  42. __SERVER_FORWARD_CONSOLE__: 'false',
  43. },
  44. plugins: [
  45. vue(),
  46. AutoImport({
  47. imports: ['vue', 'vue-router'],
  48. resolvers: [ElementPlusResolver()],
  49. dts: 'src/auto-imports.d.ts',
  50. }),
  51. // Element Plus 按需引入,减小首包体积
  52. Components({
  53. resolvers: [ElementPlusResolver()],
  54. dts: 'src/components.d.ts',
  55. }),
  56. ],
  57. resolve: {
  58. alias: {
  59. '@': resolve(__dirname, 'src'),
  60. },
  61. },
  62. css: {
  63. preprocessorOptions: {
  64. less: {
  65. javascriptEnabled: true,
  66. additionalData: (content: string, filename: string) => {
  67. if (filename.replace(/\\/g, '/').includes('/styles/variables.less')) {
  68. return content
  69. }
  70. return `@import "@/styles/variables.less";\n${content}`
  71. },
  72. },
  73. },
  74. },
  75. build: {
  76. // 单文件超过该体积时告警(单位 KB)
  77. chunkSizeWarningLimit: 500,
  78. cssCodeSplit: true,
  79. // Vite 5 / Rollup:大依赖拆 chunk(兼容本机 Node 20.13)
  80. rollupOptions: {
  81. output: {
  82. manualChunks(id) {
  83. if (!id.includes('node_modules')) return
  84. if (/[\\/](vue|vue-router)([\\/]|$)/.test(id)) return 'vue-vendor'
  85. if (/[\\/]element-plus([\\/]|$)/.test(id)) return 'element-plus'
  86. if (/[\\/]@element-plus[\\/]icons-vue([\\/]|$)/.test(id)) return 'element-icons'
  87. if (/[\\/]axios([\\/]|$)/.test(id)) return 'axios'
  88. return 'vendor'
  89. },
  90. },
  91. },
  92. },
  93. // 预构建常用 Element Plus 组件,避免首次进入某菜单时触发「optimized dependencies changed」整页刷新,
  94. // 刷新会清掉内存中的角色状态,路由守卫再把无权限页打回村合作社工作台。
  95. optimizeDeps: {
  96. include: [
  97. 'vue',
  98. 'vue-router',
  99. 'pinia',
  100. 'axios',
  101. 'element-plus/es',
  102. 'element-plus/es/locale/lang/zh-cn',
  103. '@element-plus/icons-vue',
  104. 'echarts',
  105. ],
  106. },
  107. // 排除原型目录,避免开发服务与打包过程触及该文件夹
  108. server: {
  109. host: true,
  110. port: 3001,
  111. fs: {
  112. deny: ['**/松江区农民土地退养补助金发放管理平台-原型/**'],
  113. },
  114. watch: {
  115. ignored: ['**/松江区农民土地退养补助金发放管理平台-原型/**'],
  116. },
  117. proxy: {
  118. // 业务 API:/api → {target}/sjnmtybt/api
  119. '/api': {
  120. target: apiTarget,
  121. changeOrigin: true,
  122. rewrite: (p) => `/sjnmtybt${p}`,
  123. },
  124. // 上传附件等相对路径(后端返回 /sjnmtybt/api/files/...)
  125. '/sjnmtybt': {
  126. target: apiTarget,
  127. changeOrigin: true,
  128. },
  129. // 认证登录(oauth)— 与 DMS/OAuth 网关一致
  130. '/oauth': {
  131. target: 'http://121.43.55.7:2101',
  132. changeOrigin: true,
  133. },
  134. '/proxy_oauth': {
  135. target: 'http://121.43.55.7:2101',
  136. changeOrigin: true,
  137. },
  138. // 其他系统接口
  139. '/external': {
  140. target: 'http://121.43.55.7:2101',
  141. changeOrigin: true,
  142. },
  143. },
  144. },
  145. }
  146. })