Files
ERP/ofbiz-framework/plugins/modern-ui/app/vite.config.ts
QiufengandClaude Opus 4.8 5e51dc3f56 SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)
恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。

== 此快照内容 ==
- 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091)
- 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static)
- 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB)
- 交接文档 go.md + go-code-reference/endpoints/entities/database.md
- 多代理建设脚本 .claude/wf-*.js

== 状态 ==
- 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板)
- 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用
- W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成)
- 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456

== 排除(gitignore, 可再生) ==
node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui)
完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules)

时间戳: 20260615-191517

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 19:19:15 +08:00

81 lines
2.8 KiB
TypeScript

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
const chunkSizeWarningLimit = 850
function chunkGroup(id: string) {
const normalizedId = id.replaceAll('\\', '/')
if (normalizedId.includes('/node_modules/')) {
// Heavy, self-contained leaf libs (no Vue import) — isolate so they don't
// bloat the main vendor chunk. Pure parsers, zero cross-chunk init-order risk.
if (normalizedId.includes('/node_modules/pdfjs-dist/')) {
return 'vendor-pdfjs'
}
if (normalizedId.includes('/node_modules/xlsx/')) {
return 'vendor-xlsx'
}
if (normalizedId.includes('/node_modules/mammoth/')) {
return 'vendor-mammoth'
}
// Element Plus + its icons depend on Vue one-way (no circular) — proven safe
// to keep as their own cacheable chunks.
if (normalizedId.includes('/node_modules/@element-plus/icons-vue/')) {
return 'vendor-element-icons'
}
if (normalizedId.includes('/node_modules/element-plus/')) {
return 'vendor-element-plus'
}
// vue + @vue + EVERY Vue-coupled lib (tiptap / prosemirror / yjs /
// vuedraggable / sortablejs ...) MUST share one chunk. Splitting Vue into its
// own `vendor-vue` chunk let those libs evaluate before Vue finished
// initializing, throwing a cross-chunk TDZ at runtime:
// "ReferenceError: Cannot access 'W' before initialization" → blank page.
// Circular deps WITHIN a single chunk are hoisted correctly by Rollup.
return 'vendor'
}
if (normalizedId.includes('/src/components/erp/ErpPageRenderer.vue')) {
return 'erp-page-renderer'
}
if (normalizedId.includes('/src/components/erp/')) {
return 'erp-components'
}
}
export default defineConfig({
plugins: [vue()],
base: '/',
server: {
port: 5175,
proxy: {
// OA backend (Java / Spring Boot). All OA calls live under /api/oa/*.
// Proxying keeps the browser same-origin in dev, so no CORS is needed.
'/api': {
target: 'http://localhost:8090',
changeOrigin: true,
secure: false
},
// Real-time collaboration WebSocket (yjs CRDT relay). ws:true upgrades the
// connection so /ws/collab/{docId} reaches the backend in dev too.
'/ws': {
target: 'ws://localhost:8090',
ws: true,
changeOrigin: true
}
}
},
build: {
// Single-deployable: build straight into the Spring Boot backend's static
// resources, so `gradlew bootJar` then bundles the SPA into the one runnable jar
// (served on the same port as the API — no separate vite / proxy / CORS).
outDir: '../../../../oa-backend/src/main/resources/static',
assetsDir: 'assets',
emptyOutDir: true,
chunkSizeWarningLimit,
rollupOptions: {
output: {
manualChunks: chunkGroup
}
}
}
})