| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- 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',
- ],
- },
- });
|