import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import path from 'path' // https://vite.dev/config/ export default defineConfig({ plugins: [react()], resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, build: { // Target modern browsers for smaller bundles target: 'es2020', // Code splitting configuration rollupOptions: { output: { // Manual chunks for vendor separation manualChunks(id: string | undefined) { if (!id) return; if (id.includes('node_modules')) { if (id.includes('react') || id.includes('react-dom') || id.includes('react-router')) { return 'react-vendor'; } if (id.includes('@radix-ui') || id.includes('lucide-react') || id.includes('class-variance-authority') || id.includes('tailwind-merge') || id.includes('clsx')) { return 'ui-vendor'; } if (id.includes('@tanstack/react-query') || id.includes('axios')) { return 'data-vendor'; } if (id.includes('recharts')) { return 'charts'; } if (id.includes('date-fns')) { return 'utils'; } return 'vendor'; } }, // Chunk naming pattern chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: (assetInfo) => { const info = assetInfo.name?.split('.') || ['']; const ext = info[info.length - 1]; if (ext === 'css') { return 'assets/css/[name]-[hash][extname]'; } return 'assets/[name]-[hash][extname]'; }, }, }, // Optimize chunk size warnings chunkSizeWarningLimit: 500, // Minification options minify: 'terser', terserOptions: { compress: { drop_console: true, drop_debugger: true, }, }, // Enable CSS code splitting cssCodeSplit: true, // Generate sourcemaps for debugging sourcemap: true, }, // Optimize dependencies pre-bundling optimizeDeps: { include: [ 'react', 'react-dom', 'react-router-dom', '@tanstack/react-query', 'axios', 'date-fns', 'lucide-react', 'class-variance-authority', 'clsx', 'tailwind-merge', ], exclude: ['recharts'], // Lazy load charts }, })