| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import { defineConfig } from "vite";
- import react from "@vitejs/plugin-react-swc";
- import path from "path";
- import { componentTagger } from "lovable-tagger";
- import { visualizer } from 'rollup-plugin-visualizer';
- // https://vitejs.dev/config/
- export default defineConfig(({ mode }) => ({
- server: {
- host: "::",
- port: 8080,
- },
- plugins: [
- react(),
- mode === 'development' &&
- componentTagger(),
- mode === 'production' &&
- visualizer({
- filename: 'dist/bundle-analysis.html',
- open: false,
- gzipSize: true,
- brotliSize: true,
- }),
- ].filter(Boolean),
- resolve: {
- alias: {
- "@": path.resolve(__dirname, "./src"),
- },
- },
- build: {
- rollupOptions: {
- output: {
- manualChunks: {
- // Core vendor libraries - keep these together to avoid dependency issues
- 'vendor': [
- 'react',
- 'react-dom',
- 'react-router-dom',
- '@tanstack/react-query',
- '@supabase/supabase-js',
- ],
- // All Radix UI components together to avoid circular dependencies
- 'vendor-radix': [
- '@radix-ui/react-dialog',
- '@radix-ui/react-dropdown-menu',
- '@radix-ui/react-popover',
- '@radix-ui/react-select',
- '@radix-ui/react-tabs',
- '@radix-ui/react-toast',
- '@radix-ui/react-tooltip',
- '@radix-ui/react-checkbox',
- '@radix-ui/react-radio-group',
- '@radix-ui/react-slider',
- '@radix-ui/react-switch',
- '@radix-ui/react-label',
- '@radix-ui/react-accordion',
- '@radix-ui/react-collapsible',
- '@radix-ui/react-navigation-menu',
- '@radix-ui/react-scroll-area',
- '@radix-ui/react-separator',
- '@radix-ui/react-aspect-ratio',
- '@radix-ui/react-alert-dialog',
- '@radix-ui/react-avatar',
- '@radix-ui/react-context-menu',
- '@radix-ui/react-hover-card',
- '@radix-ui/react-menubar',
- '@radix-ui/react-progress',
- '@radix-ui/react-slot',
- '@radix-ui/react-toggle',
- '@radix-ui/react-toggle-group',
- ],
- // Utilities and styling
- 'vendor-utils': [
- 'clsx',
- 'class-variance-authority',
- 'tailwind-merge',
- 'tailwindcss-animate',
- 'cmdk',
- 'lucide-react',
- 'next-themes',
- 'sonner',
- 'vaul',
- 'embla-carousel-react',
- 'react-day-picker',
- 'react-resizable-panels',
- 'input-otp',
- ],
- // Forms and validation
- 'vendor-forms': [
- 'react-hook-form',
- '@hookform/resolvers',
- 'zod',
- ],
- // Internationalization
- 'vendor-i18n': [
- 'i18next',
- 'i18next-browser-languagedetector',
- 'react-i18next',
- ],
- // Charts
- 'vendor-charts': [
- 'recharts',
- 'date-fns',
- ],
- },
- // Optimize chunk loading
- chunkFileNames: (chunkInfo) => {
- const facadeModuleId = chunkInfo.facadeModuleId
- ? chunkInfo.facadeModuleId.split('/').pop().replace('.tsx', '').replace('.ts', '')
- : 'chunk'
- return `assets/${facadeModuleId}-[hash].js`
- },
- },
- },
- // Increase chunk size warning limit slightly to account for necessary chunks
- chunkSizeWarningLimit: 600,
- // Enable minification optimizations
- minify: 'terser',
- terserOptions: {
- compress: {
- drop_console: mode === 'production',
- drop_debugger: mode === 'production',
- },
- },
- },
- }));
|