Files

111 lines
4.5 KiB
TypeScript
Raw Permalink Normal View History

2026-05-23 14:05:22 +08:00
/**
* 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;
}