vite.config.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { defineConfig } from "vite";
  2. import react from "@vitejs/plugin-react-swc";
  3. import path from "path";
  4. import { componentTagger } from "lovable-tagger";
  5. import { visualizer } from 'rollup-plugin-visualizer';
  6. // https://vitejs.dev/config/
  7. export default defineConfig(({ mode }) => ({
  8. server: {
  9. host: "::",
  10. port: 8080,
  11. },
  12. plugins: [
  13. react(),
  14. mode === 'development' &&
  15. componentTagger(),
  16. mode === 'production' &&
  17. visualizer({
  18. filename: 'dist/bundle-analysis.html',
  19. open: false,
  20. gzipSize: true,
  21. brotliSize: true,
  22. }),
  23. ].filter(Boolean),
  24. resolve: {
  25. alias: {
  26. "@": path.resolve(__dirname, "./src"),
  27. },
  28. },
  29. build: {
  30. rollupOptions: {
  31. output: {
  32. manualChunks: {
  33. // Core vendor libraries - keep these together to avoid dependency issues
  34. 'vendor': [
  35. 'react',
  36. 'react-dom',
  37. 'react-router-dom',
  38. '@tanstack/react-query',
  39. '@supabase/supabase-js',
  40. ],
  41. // All Radix UI components together to avoid circular dependencies
  42. 'vendor-radix': [
  43. '@radix-ui/react-dialog',
  44. '@radix-ui/react-dropdown-menu',
  45. '@radix-ui/react-popover',
  46. '@radix-ui/react-select',
  47. '@radix-ui/react-tabs',
  48. '@radix-ui/react-toast',
  49. '@radix-ui/react-tooltip',
  50. '@radix-ui/react-checkbox',
  51. '@radix-ui/react-radio-group',
  52. '@radix-ui/react-slider',
  53. '@radix-ui/react-switch',
  54. '@radix-ui/react-label',
  55. '@radix-ui/react-accordion',
  56. '@radix-ui/react-collapsible',
  57. '@radix-ui/react-navigation-menu',
  58. '@radix-ui/react-scroll-area',
  59. '@radix-ui/react-separator',
  60. '@radix-ui/react-aspect-ratio',
  61. '@radix-ui/react-alert-dialog',
  62. '@radix-ui/react-avatar',
  63. '@radix-ui/react-context-menu',
  64. '@radix-ui/react-hover-card',
  65. '@radix-ui/react-menubar',
  66. '@radix-ui/react-progress',
  67. '@radix-ui/react-slot',
  68. '@radix-ui/react-toggle',
  69. '@radix-ui/react-toggle-group',
  70. ],
  71. // Utilities and styling
  72. 'vendor-utils': [
  73. 'clsx',
  74. 'class-variance-authority',
  75. 'tailwind-merge',
  76. 'tailwindcss-animate',
  77. 'cmdk',
  78. 'lucide-react',
  79. 'next-themes',
  80. 'sonner',
  81. 'vaul',
  82. 'embla-carousel-react',
  83. 'react-day-picker',
  84. 'react-resizable-panels',
  85. 'input-otp',
  86. ],
  87. // Forms and validation
  88. 'vendor-forms': [
  89. 'react-hook-form',
  90. '@hookform/resolvers',
  91. 'zod',
  92. ],
  93. // Internationalization
  94. 'vendor-i18n': [
  95. 'i18next',
  96. 'i18next-browser-languagedetector',
  97. 'react-i18next',
  98. ],
  99. // Charts
  100. 'vendor-charts': [
  101. 'recharts',
  102. 'date-fns',
  103. ],
  104. },
  105. // Optimize chunk loading
  106. chunkFileNames: (chunkInfo) => {
  107. const facadeModuleId = chunkInfo.facadeModuleId
  108. ? chunkInfo.facadeModuleId.split('/').pop().replace('.tsx', '').replace('.ts', '')
  109. : 'chunk'
  110. return `assets/${facadeModuleId}-[hash].js`
  111. },
  112. },
  113. },
  114. // Increase chunk size warning limit slightly to account for necessary chunks
  115. chunkSizeWarningLimit: 600,
  116. // Enable minification optimizations
  117. minify: 'terser',
  118. terserOptions: {
  119. compress: {
  120. drop_console: mode === 'production',
  121. drop_debugger: mode === 'production',
  122. },
  123. },
  124. },
  125. }));