import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { visualizer } from 'rollup-plugin-visualizer'; // https://vite.dev/config/ export default defineConfig({ plugins: [ react(), // Bundle 分析工具(通过 ANALYZE=true 环境变量启用) process.env.ANALYZE === 'true' && visualizer({ open: true, filename: 'dist/stats.html', gzipSize: true, brotliSize: true, template: 'treemap', }), ].filter(Boolean), build: { // Enable minification for production builds (Req 13.9) // Vite 8+ uses oxc by default; 'esbuild' requires a separate install. // Leaving minify at its default ('oxc' in Vite 8) gives fast, aggressive // minification out of the box. // minify: 'esbuild', // uncomment if esbuild is installed separately // Raise the warning threshold slightly – Ant Design + Slate are large // but are split into their own vendor chunk below. chunkSizeWarningLimit: 600, rollupOptions: { output: { /** * 优化的 Manual chunk splitting 策略 * * 将 Ant Design 拆分为多个更小的 chunks,提高缓存命中率 * 并独立打包大型文档处理库 */ manualChunks(id: string) { // ========== React 核心框架 ========== if (id.includes('node_modules/react') || id.includes('node_modules/react-dom')) { return 'react-vendor'; } // ========== Ant Design 细粒度拆分 ========== // 核心组件(高频使用,首屏必需) if ( id.includes('node_modules/antd/es/button') || id.includes('node_modules/antd/es/input') || id.includes('node_modules/antd/es/space') || id.includes('node_modules/antd/es/spin') || id.includes('node_modules/antd/es/typography') || id.includes('node_modules/antd/es/config-provider') || id.includes('node_modules/antd/es/alert') ) { return 'antd-core'; } // 表单和反馈组件(中频使用) if ( id.includes('node_modules/antd/es/message') || id.includes('node_modules/antd/es/popconfirm') || id.includes('node_modules/antd/es/tooltip') || id.includes('node_modules/antd/es/select') ) { return 'antd-feedback'; } // 布局和导航组件(中频使用) if ( id.includes('node_modules/antd/es/drawer') || id.includes('node_modules/antd/es/list') || id.includes('node_modules/antd/es/card') || id.includes('node_modules/antd/es/divider') || id.includes('node_modules/antd/es/empty') ) { return 'antd-layout'; } // 数据展示组件(低频使用,按需加载) if ( id.includes('node_modules/antd/es/tree') || id.includes('node_modules/antd/es/table') || id.includes('node_modules/antd/es/dropdown') ) { return 'antd-data'; } // 其他 Ant Design 代码(图标、样式、工具等) if (id.includes('node_modules/antd') || id.includes('node_modules/@ant-design')) { return 'antd-vendor'; } // ========== 文档处理库(按需加载)========== if ( id.includes('node_modules/mammoth') || id.includes('node_modules/docx-preview') ) { return 'document-libs'; } // ========== 导出功能库(按需加载)========== if ( id.includes('node_modules/jspdf') || id.includes('node_modules/html2canvas') ) { return 'export-libs'; } // ========== Markdown 处理库 ========== if ( id.includes('node_modules/react-markdown') || id.includes('node_modules/remark-') || id.includes('node_modules/rehype-') || id.includes('node_modules/turndown') || id.includes('node_modules/unified') || id.includes('node_modules/micromark') ) { return 'markdown-vendor'; } // ========== Slate 编辑器 ========== if ( id.includes('node_modules/slate') || id.includes('node_modules/slate-react') || id.includes('node_modules/slate-history') ) { return 'slate-vendor'; } // ========== 工具库 ========== if ( id.includes('node_modules/axios') || id.includes('node_modules/zustand') || id.includes('node_modules/uuid') ) { return 'utils-vendor'; } // 其他 node_modules if (id.includes('node_modules')) { return 'vendor'; } }, }, // Rollup performs tree-shaking by default when building ES modules. // These options reinforce that unused exports are dropped (Req 13.9). treeshake: { moduleSideEffects: false, propertyReadSideEffects: false, }, }, // 启用 CSS 代码分割 cssCodeSplit: true, // 小于此阈值的资源将内联为 base64 assetsInlineLimit: 4096, // 4KB }, // 开发服务器配置 server: { port: 5173, host: true, open: false, }, // 依赖预构建优化 optimizeDeps: { include: [ 'react', 'react-dom', 'axios', 'zustand', 'antd', '@ant-design/icons', ], // 排除不需要预构建的大型依赖 exclude: [ 'mammoth', 'docx-preview', ], }, });