vite.config.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. // Vendor chunk for React ecosystem
  34. 'vendor-react': ['react', 'react-dom', 'react-router-dom'],
  35. // UI library chunks (large Radix UI components)
  36. 'vendor-ui-core': [
  37. '@radix-ui/react-dialog',
  38. '@radix-ui/react-dropdown-menu',
  39. '@radix-ui/react-popover',
  40. '@radix-ui/react-select',
  41. '@radix-ui/react-tabs',
  42. '@radix-ui/react-toast',
  43. '@radix-ui/react-tooltip',
  44. ],
  45. 'vendor-ui-forms': [
  46. '@radix-ui/react-checkbox',
  47. '@radix-ui/react-radio-group',
  48. '@radix-ui/react-slider',
  49. '@radix-ui/react-switch',
  50. '@radix-ui/react-label',
  51. 'react-hook-form',
  52. '@hookform/resolvers',
  53. 'zod',
  54. ],
  55. 'vendor-ui-layout': [
  56. '@radix-ui/react-accordion',
  57. '@radix-ui/react-collapsible',
  58. '@radix-ui/react-navigation-menu',
  59. '@radix-ui/react-scroll-area',
  60. '@radix-ui/react-separator',
  61. '@radix-ui/react-aspect-ratio',
  62. ],
  63. 'vendor-ui-misc': [
  64. '@radix-ui/react-alert-dialog',
  65. '@radix-ui/react-avatar',
  66. '@radix-ui/react-context-menu',
  67. '@radix-ui/react-hover-card',
  68. '@radix-ui/react-menubar',
  69. '@radix-ui/react-progress',
  70. '@radix-ui/react-slot',
  71. '@radix-ui/react-toggle',
  72. '@radix-ui/react-toggle-group',
  73. ],
  74. // Data & State management
  75. 'vendor-data': [
  76. '@tanstack/react-query',
  77. '@supabase/supabase-js',
  78. ],
  79. // Utilities & Styling
  80. 'vendor-utils': [
  81. 'clsx',
  82. 'class-variance-authority',
  83. 'tailwind-merge',
  84. 'tailwindcss-animate',
  85. 'cmdk',
  86. ],
  87. // Internationalization
  88. 'vendor-i18n': [
  89. 'i18next',
  90. 'i18next-browser-languagedetector',
  91. 'react-i18next',
  92. ],
  93. // Charts & Data Visualization
  94. 'vendor-charts': [
  95. 'recharts',
  96. 'date-fns',
  97. ],
  98. // UI Enhancements
  99. 'vendor-ui-enhanced': [
  100. 'lucide-react',
  101. 'next-themes',
  102. 'sonner',
  103. 'vaul',
  104. 'embla-carousel-react',
  105. 'react-day-picker',
  106. 'react-resizable-panels',
  107. 'input-otp',
  108. ],
  109. },
  110. // Optimize chunk loading
  111. chunkFileNames: (chunkInfo) => {
  112. const facadeModuleId = chunkInfo.facadeModuleId
  113. ? chunkInfo.facadeModuleId.split('/').pop().replace('.tsx', '').replace('.ts', '')
  114. : 'chunk'
  115. return `assets/${facadeModuleId}-[hash].js`
  116. },
  117. },
  118. },
  119. // Increase chunk size warning limit slightly to account for necessary chunks
  120. chunkSizeWarningLimit: 600,
  121. // Enable minification optimizations
  122. minify: 'terser',
  123. terserOptions: {
  124. compress: {
  125. drop_console: mode === 'production',
  126. drop_debugger: mode === 'production',
  127. },
  128. },
  129. },
  130. }));