import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import path from "path"; import { visualizer } from "rollup-plugin-visualizer"; // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ server: { host: "0.0.0.0", port: 3000, cors: true, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", }, }, plugins: [ react(), visualizer({ filename: "dist/stats.html", open: false, gzipSize: true, brotliSize: true, }), ].filter(Boolean), resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, build: { // Tree shaking 최적화 treeshake: { moduleSideEffects: false, propertyReadSideEffects: false, }, rollupOptions: { output: { manualChunks: { // 벤더 라이브러리들을 별도 청크로 분리 vendor: ["react", "react-dom"], router: ["react-router-dom"], ui: [ "@radix-ui/react-dialog", "@radix-ui/react-dropdown-menu", "@radix-ui/react-select", "@radix-ui/react-toast", "@radix-ui/react-avatar", "@radix-ui/react-label", "@radix-ui/react-separator", "@radix-ui/react-switch", "@radix-ui/react-tabs", "@radix-ui/react-alert-dialog", "@radix-ui/react-progress", "@radix-ui/react-slot", ], charts: ["recharts"], query: ["@tanstack/react-query", "@tanstack/react-query-devtools"], clerk: ["@clerk/clerk-react"], supabase: ["@supabase/supabase-js"], sentry: ["@sentry/react", "@sentry/tracing"], date: ["date-fns"], utils: ["clsx", "class-variance-authority", "tailwind-merge"], }, }, }, // 청크 크기 경고 임계값 조정 chunkSizeWarningLimit: 1000, // 압축 최적화 (esbuild 사용) minify: "esbuild", }, }));