vite.config.ts 4.8 KB

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