架構
本頁以單張概覽圖說明 QuickUI 各模組的層級關係與原始碼位置。
系統概覽
graph TB
T["模板:id 指向的元素 / render()"] --> V["vDOM::for → :if → :path → {{ }}"]
D["data(Proxy)"] -->|"set 觸發"| L["Lifecycle:300 ms 去抖動"]
L --> V
I["i18n 語系資料"] --> V
V --> P["diff → Patch[]"]
P -->|"requestAnimationFrame"| R["實體 DOM"]
R --> O["Listener:lazyload / temp-svg"]
分層
| 層 | 原始碼 | 職責 |
|---|---|---|
| 入口 | src/model(QUI.ts) |
建立實例、載入 i18n、包裝 reactive data、套用 Patch、處理屬性與事件綁定 |
| 虛擬 DOM | src/model(vDOM.ts) |
把元素轉成 tag/props/children/data,展開 :for、:if、:path,替換 {{ }},產生 Patch |
| 生命週期 | src/model(Lifecycle.ts) |
包住初始渲染與更新的時序,執行 when 鉤子,更新去抖動 300 ms |
| 工具函式 | src/function |
createReactiveObject、htmlParser、createElement、getElement、calc、dateFormat 等 |
| 監聽器 | src/listener |
IntersectionObserver 驅動的圖片延遲載入與 SVG 內嵌 |
| 共用常數 | src/*.ts |
全域別名、正規表示式、指令名稱、注入頁面的效果 CSS |
所有檔案由 tsc 依 tsconfig.json 的 outFile 合併為單一腳本 src/QuickUI.debug.js,沒有模組匯入;公開名稱透過 window.QUI、window._、window.$ 掛到全域。
跨切原則
| 原則 | 實作 |
|---|---|
| 零依賴 | 只用瀏覽器原生 API(Proxy、fetch、IntersectionObserver、requestAnimationFrame) |
| 模板即 DOM | 模板是頁面上的 HTML,不需要編譯步驟;每次渲染都從原始模板的複本重建 vDOM |
| 資料快照 | 每次渲染以 JSON.parse(JSON.stringify(data)) 取快照,函式、Date、undefined 不會進入模板 |
| 批次寫入 | Patch 一律在 requestAnimationFrame 內套用 |
延伸閱讀
- 渲染流程細節:渲染流程
- 資料變更偵測:響應式資料
- 各模組展開圖:doc/architecture.zh.md