跳转至

ADR-003: hermesx-webui 技术栈选型 — Vue 3 增量演进 vs React 18 重写

决策信息

字段
编号 ADR-003
标题 hermesx-webui 前端技术栈:Vue 3 增量演进
状态 Accepted
日期 2026-05-08
Owner tech-lead
关联需求 docs/artifacts/2026-05-08-hermesx-webui/prd.md

背景与约束

  • PRD 原始技术范围指定 React 18 + Zustand + TanStack Query + Tailwind。
  • 在 /team-plan 挑战会中发现 webui/ 目录已存在 Vue 3 + Pinia + Naive UI + Vue Router v4 项目(~484 行),具备:
  • 可用的 auth store(已使用 sessionStorage,已从 /v1/me 响应获取 tenant_id,未错误注入 header)
  • useApi composable(Bearer token + X-Hermes-User-Id,401/403 自动跳转)
  • AppShell 布局、ChatPage、MemoriesPage、SkillsPage、AdminTenantsPage 骨架
  • Vue Router v4 路由守卫结构
  • PRD 写作时尚未探知该目录存在,React 18 选型建立在"从零开始"的假设上。
  • 非目标:本 ADR 不影响后端 Go 实现。

备选方案

A: Vue 3 增量演进(采纳

复用现有 webui/ 基础,做以下调整:

变更点 内容
保留 Vue 3 + Pinia + Vue Router v4 + Naive UI + Vite + TypeScript
新增 @tanstack/vue-query v5(替代 stores 中的裸 fetch 状态管理)
新增 Tailwind CSS v4(补充 Naive UI 覆盖不到的自定义样式区域)
重命名 auth store 中 acpTokenadminApiKey(ACP 是编辑器协议,不是 admin key)
结构调整 Vite multi-page 模式(见 ADR-004)

优点: - 减少 2–3 天基础设施重建工作 - 现有 auth/API 层已解决挑战会提出的安全问题(sessionStorage ✓, tenant_id from response ✓) - Naive UI DataTable/Form/Modal 对企业级 Admin Console 覆盖优于裸 Tailwind 组件 - @tanstack/vue-query v5 与 React Query API 基本一致,学习成本低 - Vue 3 Composition API 与 React hooks 概念对齐,切换成本低

风险: - Naive UI 偶有 TypeScript 类型不完整问题(可通过 // @ts-expect-error 局部处理) - @tanstack/vue-query 社区规模略小于 React Query(文档完整,可接受)

B: React 18 重写

原因不采纳: - 484 行骨架代码须全部废弃,所有页面从零构建 - PRD 规格基于错误前提("从零开始"),发现既有代码后原因已失效 - Tailwind 需要自建 DataTable、Modal、Form 等组件,增加 1–2 周工作量 - 在功能对等前提下,两个方案的最终产品体验无可见差异

决策结果

采纳方案 A:Vue 3 增量演进。

最终技术栈:

Vue 3 + Pinia + Vue Router v4 + Naive UI
+ @tanstack/vue-query v5
+ Tailwind CSS v4
+ Vite 6 (multi-page mode)
+ TypeScript strict

影响范围: - webui/package.json:新增 @tanstack/vue-querytailwindcss - webui/src/stores/auth.tsacpToken 字段重命名为 adminApiKey,更新相关引用 - webui/src/composables/useApi.ts:admin 请求从 acpToken 切换到 adminApiKey - 兼容性:现有 useApi / auth 模式不破坏,只扩展

企业内控补充

  • 应用等级:内部工具(T4),无强制集团框架约束
  • 无集团前端框架白皮书限制

后续动作

动作 Owner 完成条件
更新 auth.ts: acpToken → adminApiKey frontend-engineer Phase 0 完成
安装 @tanstack/vue-query + tailwindcss frontend-engineer Phase 0 完成
配置 Vite multi-page(见 ADR-004) frontend-engineer Phase 0 完成