/** * Vite 构建分包策略 * 优化:减少 chunk 数量,避免首屏加载排队 * 目标:控制在 6 个主要 chunk 以内 */ export function createManualChunks(id: string): string | undefined { // Monaco Editor - 外部依赖,不打包 if (id.includes('monaco-editor')) { return undefined; } // node_modules 依赖 if (id.includes('node_modules')) { // BPM 包 - 体积大,单独分包,动态加载 if (id.includes('@lingshu/bpm-page') || id.includes('@lingshu/bpm-components')) { return 'vendor-bpm'; } // Vant / 移动端组件库 - 仅移动端使用,单独分包按需加载 if (id.includes('vant-cisdi') || id.includes('vant/') || id.includes('@minmetals-ui/mobile-biz-components')) { return 'vendor-mobile'; } // VXE Table 相关 - 列表页需要,可延迟加载 if (id.includes('vxe-table') || id.includes('vxe-pc-ui') || id.includes('@vxe-ui')) { return 'vendor-vxe'; } // Echarts - 图表页需要,可延迟加载 if (id.includes('echarts') || id.includes('zrender')) { return 'vendor-echarts'; } // ERD Editor - 仅 modeling 模块使用,单独分包按需加载 if (id.includes('@dineug/erd-editor')) { return 'vendor-erd-editor'; } // @minmetals-ui/biz-components 和 @minmetals-ui/pro-components 体积大,单独分包延迟加载 if (id.includes('@minmetals-ui/biz-components') || id.includes('@minmetals-ui/pro-components')) { return 'vendor-minmetals'; } // 其他所有第三方库合并到 vendor(包括 Element Plus 等) return 'vendor'; } // 内部 workspace packages - 按包拆分,避免单文件过大 if (id.includes('/packages/')) { if (id.includes('packages/form-designer')) { // widget-mobile 单独分包,避免 vant/mobile-biz-components 被首屏加载 if (id.includes('/widget-mobile/') || id.includes('/page-load/mobile.vue')) { // 以下 widget-mobile 子路径的文件不依赖 vant / @minmetals-ui/mobile-biz-components, // 且被 PC 运行时路径静态引用。若一并放入 pkg-form-designer-mobile, // 会使 pkg-form-designer 在 PC 路由下产生对 mobile chunk 的静态依赖, // 导致浏览器提前加载 pkg-form-designer-mobile。保留在 pkg-form-designer 中。 if ( // 纯类型/枚举重导出 id.includes('/widget-mobile/config/WidgetType') // 样式常量(无 vant 依赖) || id.includes('/widget-mobile/config/widget-constants/') // 高级筛选字段类型常量 || id.includes('/widget-mobile/config/widget/advanced-filter/types') // 移动端多语言模块(仅 i18n 注册,无 vant 依赖) || id.includes('/widget-mobile/locales/') // widget-mobile 类型定义 || id.includes('/widget-mobile/types/') // composables 下的纯类型重导出 || id.includes('/widget-mobile/composables/list-filter/types') || id.includes('/widget-mobile/composables/list-fetch/types') ) { return 'pkg-form-designer'; } return 'pkg-form-designer-mobile'; } return 'pkg-form-designer'; } if (id.includes('packages/business-components')) { // 按功能域拆分 business-components,减少单 chunk 评估时间 if (id.includes('/widget/approve') || id.includes('/widget/bpm')) { return 'pkg-biz-approve'; } if (id.includes('/widget/list') || id.includes('/widget/table') || id.includes('/widget/grid')) { return 'pkg-biz-list'; } if (id.includes('/widget/person') || id.includes('/widget/org') || id.includes('/widget/dept') || id.includes('/widget/biz-org')) { return 'pkg-biz-org'; } if (id.includes('/widget/attachment') || id.includes('/widget/image') || id.includes('/widget/file')) { return 'pkg-biz-attachment'; } return 'pkg-business-components'; } return 'pkg-shared'; } // app 源码公共组件 - 这些组件同时被同步入口和动态路由 chunk 引用, // Rollup 会将其自动提取为共享 chunk,产生零碎 CSS 文件(如 dialog-*.css、del-dialog-*.css)。 // 显式分配到 vendor,使其 CSS 合并到 vendor-*.css,减少首屏 CSS 请求数。 if ( id.includes('/components/common/dialog') || id.includes('/components/business-common/del-dialog') ) { return 'vendor'; } // app 其他源码 - 不指定 chunk,让 Vite 自动处理(会合并到 index.js) return undefined; }