111 lines
4.5 KiB
TypeScript
111 lines
4.5 KiB
TypeScript
|
|
/**
|
|||
|
|
* 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;
|
|||
|
|
}
|