跳转至

ADR-004: hermesx-webui Vite Multi-Page 架构

决策信息

字段
编号 ADR-004
标题 Vite Multi-Page:User Portal (index.html) + Admin Console (admin.html)
状态 Accepted
日期 2026-05-08
Owner architect
关联需求 docs/artifacts/2026-05-08-hermesx-webui/prd.md

背景与约束

  • PRD 要求 Admin Console(/admin/)和 User Agent Portal(/)共存于同一仓库。
  • 挑战会架构师建议 Vite multi-page 优于单 SPA + 路由守卫,主要原因:
  • 两个 portal 的认证机制不同(user key vs admin key)
  • bundle 独立,不因 admin 依赖污染 user bundle
  • 与现有后端 /static/ 服务模式(index.html + admin.html)对齐
  • 非目标:不拆分为两个独立 npm 项目(维护成本过高)。

备选方案

A: 单 SPA + 路由守卫(不采纳)

所有页面在同一 Vue 应用中,通过 /admin/* 路由和路由守卫区分权限。

不采纳原因: - Admin 和 User bundle 无法分离,admin 依赖(如 Audit Log 大型表格)污染 user bundle - 路由守卫仅在前端守卫,无 bundle 级隔离 - 单 SPA 需要运行时判断"当前是 admin 还是 user",耦合度高

B: Vite Multi-Page(采纳

两个独立 HTML 入口点:

webui/
├── index.html          ← User Portal 入口(打包为 /index.html)
├── admin.html          ← Admin Console 入口(打包为 /admin.html 或 /admin/index.html)
├── src/
│   ├── user/
│   │   ├── main.ts     ← User Portal app 实例
│   │   ├── App.vue
│   │   └── router.ts
│   ├── admin/
│   │   ├── main.ts     ← Admin Console app 实例
│   │   ├── App.vue
│   │   └── router.ts
│   ├── shared/         ← 两个入口共享的代码
│   │   ├── api/        ← useApi.ts, useSse.ts
│   │   ├── stores/     ← auth.ts (Pinia, 各自实例化)
│   │   ├── types/      ← TypeScript 类型
│   │   └── components/ ← 共享 UI 组件
│   └── pages/          ← 页面组件(按 user/ 和 admin/ 分目录)
└── vite.config.ts      ← build.rollupOptions.input 配置两个入口

vite.config.ts 关键配置:

build: {
  rollupOptions: {
    input: {
      main: resolve(__dirname, 'index.html'),
      admin: resolve(__dirname, 'admin.html'),
    },
  },
}

优点: - 独立 bundle,User Portal 不加载任何 Admin 代码 - 天然权限隔离:admin.html 加载 admin 应用实例,永远不与 user 混用 - nginx 路由清晰:/adminadmin.html/index.html - 与后端现有 /static/ 服务模式完全兼容

决策结果

采纳方案 B:Vite Multi-Page。

nginx 路由配置:

location /admin {
    try_files $uri $uri/ /admin.html;
}
location / {
    try_files $uri $uri/ /index.html;
}

目录迁移计划(Phase 0): 1. 将现有 src/ 内容重组到 src/shared/ + src/user/ + src/admin/ 2. 创建 admin.html 入口 3. 更新 vite.config.ts 为 multi-page

后续动作

动作 Owner 完成条件
重组目录结构,配置 vite.config.ts frontend-engineer Phase 0
更新 nginx.conf(SSE 配置见 ADR-006) frontend-engineer Phase 0
验证 npm run build 产出两个 HTML qa-engineer Phase 0 验收