跳至主要内容
💬 回報這一頁

ADR-0005:token 是唯一的硬相依

  • 狀態:已採用
  • 日期:2026-07

背景

一個設計工具箱可以在很多層要求宿主相依:token、元件、版面框架、圖示集、 狀態管理慣例、甚至建置工具。

相依越多,一致性越高,但被採用的門檻也越高——而沒有被採用的設計系統一致性是零

選項

選項相依面
A. 全套框架(token + 元件 + 版面 + 建置)最一致,但只有全新專案能用
B. 只有 token 是硬相依,其餘可選門檻低,任何專案都能踏第一步
C. 什麼都不相依,純文件零門檻,但一致性完全靠自律

決定

採 B。

硬相依 @dooping/tokens ← 唯一建議 npm 安裝的一層
複製走 @dooping/react ← registry,複製後就是你的
只讀 模式 Patterns ← 用你自己的技術棧實作

@dooping/tokens 的產物刻意做成框架中立

  • tokens.css:純 CSS 變數,任何宿主都吃得下(不含任何 Tailwind 指令)
  • tailwind-preset.cjs:可選,給用 Tailwind 的人
  • index.ts:型別化的 JS 讀取 API,給非 CSS 宿主(Canvas 圖表、伺服器端 PDF、Figma plugin)
  • 深色同時提供 .dark[data-theme="dark"] 兩種鉤子

理由

  1. token 幾乎不會被改,元件一定會。 把不會被改的東西做成套件才有機會真的統一; 把會被改的東西做成套件,只會逼所有人 fork。
  2. 第一步的門檻決定採用率。 「裝一個 CSS 變數套件」是任何團隊都願意試的; 「換掉整套 UI」不是。
  3. 兩種深色鉤子的成本只是多一個 CSS 選擇器,但少支援一個就少掉一整類宿主。 (這個文件站本身就是靠 [data-theme] 那一條。)

影響

  • token 的破壞性變更成本很高(影響所有宿主),所以移除或改名一律 major, 且要先標記棄用。見「治理 → 版本策略」。
  • token 的 JSON 來源不能直接被 TS 用 import attributes 引入 (with { type: "json" } 在各家打包器支援度不一致)——改由建置腳本產生 .ts 資料模組。 這是實際踩到的坑。
  • 元件層不得反過來要求宿主安裝額外的執行期相依(狀態管理、路由), 由邊界守衛測試強制。