4.0 KiB
4.0 KiB
Context
DashBoard_vite 已完成主體搬遷,但報表頁仍處於混合狀態:
resource-status、resource-history等頁面已有 Vite 版本,卻存在實際行為缺陷。wip_overview、wip_detail仍以 inline script 為主,尚未納入 Vite entry 與共用模組治理。- 部分頁面仍有直接字串拼接輸出與原生
fetch路徑,無法完整承接既有MesApi的降級重試契約。
此變更是「遷移後硬化」階段:不改變既有業務操作語意,但將效果對齊、模組化覆蓋與前端複用一起完成。
Goals / Non-Goals
Goals:
- 讓 WIP 報表頁進入 Vite entry 管理,並保留目前 tab/drill-down 與
onclick操作語意。 - 修復已遷移模組中會影響報表可用性的缺陷(初始化、KPI、矩陣選取、API 呼叫路徑)。
- 強化共用路徑(escape、欄位契約、MesApi/backoff)以支撐後續前端運算擴展。
- 用測試明確覆蓋「asset exists -> module」、「asset missing -> fallback」的模板行為。
Non-Goals:
- 不改動後端路由設計與單一 port 服務模型。
- 不重寫 UI 視覺風格或更動既有商業邏輯判斷規則。
- 不在本次引入新的大型前端框架(維持 Vanilla + Vite entry 模式)。
Decisions
Decision 1: 採用「模板雙軌載入」完成 WIP 遷移
- 選擇:在
wip_overview.html、wip_detail.html加入frontend_asset()module 載入,保留既有 inline script 作 fallback。 - 理由:可在不破壞現場可用性的前提下,讓 Vite bundle 成為預設執行路徑,符合先前頁面遷移模式。
- 替代方案:直接刪除 inline script。
- 未採用原因:回退能力不足,且無法快速比對 parity。
Decision 2: 模組保持全域 handler 相容層
- 選擇:Vite entry 內對舊有
onclick所需函式維持window綁定,避免模板同步大改。 - 理由:降低一次性改動範圍,先確保行為完全對齊,再逐步收斂事件綁定方式。
- 替代方案:全面改為 addEventListener 並移除 inline
onclick。- 未採用原因:本次目標是 parity hardening,不是互動模型重寫。
Decision 3: 前端 API 路徑統一走 MesApi
- 選擇:JSON API 優先走
MesApi.get/post(或 core api bridge),僅 blob/download 等必要場景保留原生 fetch。 - 理由:沿用既有降級錯誤碼與 retry/backoff 策略,避免 pool exhausted 時前端重試失控。
- 替代方案:維持頁面各自
fetch。- 未採用原因:會破壞 resilience contract,一致性不足。
Decision 4: 字串輸出與欄位命名同步納入治理
- 選擇:針對動態 HTML 內容補 escape,並對照 field contract 驗證表格欄位與下載標頭語意一致。
- 理由:遷移期間常見 XSS/欄位漂移問題,必須和模組化同時收斂。
Risks / Trade-offs
- [Risk] 大型 inline script 搬入 module 時可能出現作用域差異 → Mitigation: 先保留 fallback,並針對
windowhandler 做顯式綁定。 - [Risk] 模組與 fallback 並存造成測試分支增加 → Mitigation: 以 template integration 測試固定兩條路徑行為。
- [Risk] escape 補強可能改變少數欄位原始顯示格式 → Mitigation: 僅針對 HTML 注入風險欄位處理,保留 NULL/日期等既有顯示語意。
- [Risk] 前端改走 MesApi 使錯誤提示型態改變 → Mitigation: 保持原錯誤訊息文案,僅替換底層請求路徑。
Migration Plan
- 先完成 OpenSpec task 分解與可執行順序。
- 新增 WIP Vite entries,更新 vite config,模板加上 module/fallback 雙軌。
- 修復
resource-history、resource-status關鍵缺陷並補安全性修正。 - Build + pytest 驗證,更新 task 勾選。
- 交付變更摘要與剩餘風險,供後續 archive。
Open Questions
- 是否需要在下一階段移除 WIP fallback inline script(目前先保留作為回退機制)。
- 是否要擴充前端單元測試(Vitest)覆蓋更多 DOM 互動,而不只依賴後端模板整合測試。