vite.config.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { defineConfig, loadEnv } from 'vite';
  2. import react from '@vitejs/plugin-react';
  3. import { visualizer } from 'rollup-plugin-visualizer';
  4. import federation from '@originjs/vite-plugin-federation';
  5. // https://vite.dev/config/
  6. export default defineConfig(({ mode }) => {
  7. const env = loadEnv(mode, process.cwd(), '');
  8. const apiTarget = env.VITE_API_BASE_URL || 'http://localhost:8000';
  9. const modChatApiTarget = env.VITE_MOD_CHAT_API_BASE_URL || apiTarget;
  10. return {
  11. plugins: [
  12. react(),
  13. federation({
  14. name: 'ax_frontend_app',
  15. remotes: {
  16. mod_chat: env.VITE_MOD_CHAT_REMOTE_URL || 'http://localhost:5172/assets/remoteEntry.js',
  17. },
  18. shared: {
  19. react: { requiredVersion: false },
  20. 'react-dom': { requiredVersion: false },
  21. 'react/jsx-runtime': {
  22. packagePath: './src/react-jsx-runtime.ts',
  23. requiredVersion: false,
  24. },
  25. 'react/jsx-dev-runtime': {
  26. packagePath: './src/react-jsx-dev-runtime.ts',
  27. requiredVersion: false,
  28. },
  29. },
  30. }),
  31. // Bundle 分析工具(通过 ANALYZE=true 环境变量启用)
  32. process.env.ANALYZE === 'true' && visualizer({
  33. open: false,
  34. filename: 'dist/stats.html',
  35. gzipSize: true,
  36. brotliSize: true,
  37. template: 'treemap',
  38. }),
  39. ].filter(Boolean),
  40. build: {
  41. // Keep production output minified for Lighthouse and real deployments.
  42. minify: 'oxc',
  43. cssMinify: 'lightningcss',
  44. sourcemap: false,
  45. reportCompressedSize: true,
  46. // Large optional libraries are split by dynamic imports.
  47. chunkSizeWarningLimit: 600,
  48. rollupOptions: {
  49. output: {
  50. // Do not eagerly preload every dependency of the application entry.
  51. // Dynamic panels and export libraries should be fetched only when used.
  52. hoistTransitiveImports: false,
  53. manualChunks(id: string) {
  54. if (/node_modules[\\/](?:react|react-dom)[\\/]/.test(id)) {
  55. return 'react-vendor';
  56. }
  57. if (/node_modules[\\/](?:axios|zustand|uuid)[\\/]/.test(id)) {
  58. return 'utils-vendor';
  59. }
  60. },
  61. },
  62. },
  63. // 启用 CSS 代码分割
  64. cssCodeSplit: true,
  65. // 小于此阈值的资源将内联为 base64
  66. assetsInlineLimit: 4096, // 4KB
  67. },
  68. // 开发服务器配置
  69. server: {
  70. port: 5173,
  71. host: true,
  72. strictPort: true,
  73. open: false,
  74. proxy: {
  75. '/api': {
  76. target: apiTarget,
  77. changeOrigin: true,
  78. },
  79. '/composer': {
  80. target: modChatApiTarget,
  81. changeOrigin: true,
  82. },
  83. '/registry': {
  84. target: env.VITE_MOD_CHAT_REGISTRY_API_BASE_URL || modChatApiTarget,
  85. changeOrigin: true,
  86. },
  87. '/agents': {
  88. target: modChatApiTarget,
  89. changeOrigin: true,
  90. },
  91. '/models': {
  92. target: modChatApiTarget,
  93. changeOrigin: true,
  94. },
  95. '/tools': {
  96. target: modChatApiTarget,
  97. changeOrigin: true,
  98. },
  99. '/sessions': {
  100. target: modChatApiTarget,
  101. changeOrigin: true,
  102. },
  103. },
  104. },
  105. preview: {
  106. port: 4173,
  107. host: true,
  108. strictPort: true,
  109. proxy: {
  110. '/api': {
  111. target: apiTarget,
  112. changeOrigin: true,
  113. },
  114. '/composer': {
  115. target: modChatApiTarget,
  116. changeOrigin: true,
  117. },
  118. '/registry': {
  119. target: env.VITE_MOD_CHAT_REGISTRY_API_BASE_URL || modChatApiTarget,
  120. changeOrigin: true,
  121. },
  122. '/agents': {
  123. target: modChatApiTarget,
  124. changeOrigin: true,
  125. },
  126. '/models': {
  127. target: modChatApiTarget,
  128. changeOrigin: true,
  129. },
  130. '/tools': {
  131. target: modChatApiTarget,
  132. changeOrigin: true,
  133. },
  134. '/sessions': {
  135. target: modChatApiTarget,
  136. changeOrigin: true,
  137. },
  138. },
  139. },
  140. // 依赖预构建优化
  141. optimizeDeps: {
  142. include: [
  143. 'react',
  144. 'react-dom',
  145. 'axios',
  146. 'zustand',
  147. 'antd',
  148. '@ant-design/icons',
  149. ],
  150. // 排除不需要预构建的大型依赖
  151. exclude: [
  152. 'mammoth',
  153. ],
  154. },
  155. };
  156. });