AI 寫的 UI 為什麼總差一點?因為沒人告訴它什麼算好

🌏 Read this article in English


確認視窗的動畫,慢了 600 毫秒。

前陣子,團隊裡發生了一件事。

Junior 用 AI 寫了一個設定頁面。 功能跑起來了,介面也看起來乾淨。

但當他點擊「刪除帳號」時, 那個確認視窗的淡入動畫,緩慢了整整 600 毫秒。

Senior 看了一眼,沒說話。 只是把滑鼠移到「取消」按鈕,發現 Tab 鍵的焦點順序是反的。

Junior 著重展示生成速度:「你看,AI 寫得多快。」

Senior 終於開口: 「不是它寫得慢。 是沒人告訴它什麼算好。」

這很正常。

不是 Junior 不會、也不是 Senior 太挑。 是 AI 沒有被告知什麼算好。

AI 沒有品味。 它只是在猜下一個字。 沒人告訴它「好」長什麼樣,它就會往訓練資料的平均值靠。 而平均水準,就是平庸。

這就是為什麼我們需要「UI Skills」。

它不是建議。 是強制。


UI Skills 是什麼?

先說清楚,這裡的概念層級容易混淆。

UI Skills 是一套針對 AI Agent 設計的約束文件目錄。 其中最有代表性的是 baseline-ui,這是一套具體的 Skill 檔案。 而 Claude Code 則是載入這些規範的機制。

簡單說:

  • UI Skills 像是一本菜單。
  • baseline-ui 是其中一道食譜。
  • Claude Code 是照著做菜的廚師。

它的定位很明確: 不是建議(Suggestion)。 是強制(Constraint)。

Definition: UI Skills refers to a set of opinionated constraints designed for AI agents to generate consistent and high-quality UI code.

關鍵詞解析

詞彙含義為什麼重要
Opinionated明確取捨不怕得罪人,選定一個立場,降低模型漂移
Constraints約束明確的規則,可驗證
AI AgentAI 代理給 Claude/Cursor 等工具使用

六大約束領域

以 baseline-ui 為例,它覆蓋了 UI 開發的六大核心領域:

  1. 堆疊規範:必須使用 Tailwind CSS(Token 化 utility)、motion/react(動畫抽象)
  2. 元件系統:必須使用可存取的元件基礎設施(Base UI、React Aria、Radix)
  3. 互動設計:破壞性操作必須用警告對話框、禁止阻止貼上
  4. 動畫原則:互動回饋不得超過 200ms;未被明確要求時不新增
  5. 排版標準:標題用 text-balance、數據用 tabular-nums
  6. 效能最佳化:禁止在大型模糊/背景濾鏡上動畫

為什麼這樣設計有效?

因為它具體。

模糊的最佳實踐UI Skills 的約束
「動畫要快」「互動回饋不得超過 200ms」
「要考慮無障礙」「必須使用 React Aria 或 Base UI」
「效能要好」「禁止在大型模糊濾鏡上動畫」
「互動要安全」「破壞性操作必須有確認對話框」

具體數字(200ms)而非形容詞(快)。 指定工具(Tailwind)而非方向(用 utility-first)。 禁止事項明確而非「盡量避免」。

我觀察過很多團隊,他們以為寫了 Style Guide 就等於有規範。 但 Style Guide 對人類有效,給 AI 則需轉為可載入約束。 Skill 的約束是「活的」。 它直接嵌入在 AI 的 prompt 中。


從模糊到具體:設計模式的轉換

你可能會想: 「這不就是寫規範嗎?」

不完全是。

轉換範例

場景:動畫

模糊的規範: 「動畫要流暢,不要太長。」

UI Skills 的約束: 「互動回饋不得超過 200ms。」

為什麼這樣設計有效?

因為它可驗證。

當規則寫成「不超過 200ms」「必須用 React Aria」這類具體形式時, 人在 review 時可以一眼看出有沒有違規, 搭配 lint / 測試也能在 CI 階段攔下來。

約束的價值在於「可驗證性」。 規則一旦能被檢查,它就不再是建議,而是標準。


使用方式:從 Prompt 到 Review

UI Skills 的使用方式很簡單。

1. 嵌入 Prompt

在你的 AI 代理的 system prompt 中,加入 UI Skills 的約束。

You are an expert UI developer.
Follow these constraints strictly:

## Animation
- Duration must be <= 200ms
- Only animate composite properties

## Accessibility
- Use React Aria or Base UI
- No manual ARIA attributes unless necessary

2. 透過 Claude Code 載入 Skill

如果你使用的是 Claude Code,可以把 baseline-ui 當作 Skill 載入, 讓 Claude 在 review 一個檔案時,依照約束清單逐項評估。

需要先說清楚一件事: 這不是傳統意義上的 linter。 它沒有確定性的 AST 解析,也沒有窮盡的規則引擎。 它本質上是「Claude 帶著一份約束文件去讀你的程式碼」。

也因此,輸出的形式更接近一份 review note,例如:

## 可能不符合約束之處

1. **Animation Duration**
   - File: `src/components/Button.tsx`
   - 觀察:動畫 duration 設為 300ms,超過約束的 200ms 上限。
   - 建議:將 `duration={300}` 改為 `duration={200}`。

2. **Accessibility**
   - File: `src/components/Input.tsx`
   - 觀察:input 缺少 `aria-label`。
   - 建議:補上 `aria-label="Search"`。

注意:Claude 輸出的是「依約束做出的判讀與建議」, 不會自動修改檔案,也不保證涵蓋所有違規。 若要在 PR 階段強制攔下,需要另外把可程式化的部分接到 ESLint / 測試 hook 上。


與內部規範文件的對比

你可能在想: 「我們公司已經有自己的規範文件了,這跟 Style Guide 有什麼差?」

差別不在「有沒有」,而在「給誰看」。

差異在哪裡?

面向UI Skills典型內部規範文件
定位約束/規則參考/指南
語氣「必須」「禁止」「建議」「推薦」
可驗證性高(可自動檢查)中(需人工判斷)
技術綁定Tailwind、React Aria較通用
使用方式載入到 AI 代理的 prompt給人類工程師閱讀

UI Skills 是「意見導向」的。 它做了明確的取捨。 它選定了一個立場,並堅持到底。

典型內部規範文件是「參考性」的。 它試圖涵蓋所有情況。 人工 review 有效,但給代理使用需轉成可執行約束。

具體來說,如果你希望 AI 生成的 UI 符合團隊的標準,你需要的是「約束」,而不是「參考」。

意見導向(Opinionated)是 Skill 設計的關鍵。 不怕得罪人,選定一個立場,才能確保一致性。


可學習的設計原則

從 UI Skills 中,我們可以提煉出幾個設計原則。

這些原則不僅適用於 UI,也適用於其他類型的 Skill。

意見導向與具體數字

「中立」規範的可執行性較低。 如果規範說「可以使用 A 或 B」,AI 就會隨機選擇。 結果就是,代碼風格不一致。

如果你團隊使用 Tailwind,就說「必須使用 Tailwind」。 不要說「建議使用 Tailwind」。

同樣地,「快」是主觀的。 「200ms」是客觀的。 如果你希望動畫快,就說「不超過 200ms」。 不要說「動畫要快」。

工具綁定與禁止清單

指定用什麼,而非「選一個好的」。 「選一個好的」需要判斷力。 AI 的判斷依賴上下文;團隊規則能減少模型在相近方案間漂移。

如果你希望使用無障礙元件,就說「使用 React Aria」。 不要說「使用無障礙元件」。

「盡量避免」等於「可以做」。 「禁止」等於「不能做」。 如果你希望避免效能問題,就說「禁止在大型模糊濾鏡上動畫」。 不要說「盡量避免大型模糊濾鏡」。

可驗證

規則需同時具備明確性、可檢查性、可落地流程。 規則一旦能被檢查,它就不再是建議。

當約束寫成具體門檻(200ms、必須用 X 函式庫), 你就可以把可程式化的部分接到 lint 或測試上, 把不可程式化的部分留給 AI 與人共同 review。


如何應用到自己的 Skill

步驟 1:列出你團隊的「潛規則」

我們用什麼 CSS 框架? 動畫通常多長? 什麼情況要有確認對話框?

你可以開一個會議,讓團隊成員列出他們最常見的 UI 可優化處、風險場景或 review 檢查點。

步驟 2:把潛規則變成約束

「通常用 Tailwind」→「必須使用 Tailwind」 「動畫不要太長」→「動畫不超過 200ms」 「破壞性操作要有確認」→「破壞性操作必須有確認對話框」

「潛規則」是模糊的。 「約束」是具體的。

步驟 3:加入檢查機制

這裡有兩條路。

路徑一:直接採用 baseline-ui 把公開的 baseline-ui Skill 加入專案, 讓 Claude Code 在 review 階段依約束給出建議, 團隊保留最後決策權。

路徑二:建立自己的 Skill Fork baseline-ui 或新增一份自家的 SKILL.md, 放入團隊規則與檢查重點。 能程式化的部分(如 duration 上限、禁用屬性)接到 ESLint / 測試 hook, 不能程式化的部分(如「破壞性操作要有確認對話框」)交給 AI 輔助 review。


取捨與限制

過度約束會扼殺創意嗎? 還是讓 AI 學會「有邊界的自由」?

限制一:市場訊號尚未明朗

UI Skills 是一個新興的概念。 它的生態系還在發展中。 未來可能會出現更標準化的做法。

如果你現在就全面採用 UI Skills,可能會面臨生態系標準收斂後的重寫成本。 等更標準的規範出現,你需要重新對齊。

限制二:這不適用於所有框架

baseline-ui 偏 React/Tailwind,但 catalog 收錄多平台。

如果你使用的是 Vue 或 Angular,可能需要調整約束。 你可以參考 UI Skills 的設計原則,但需要替換掉技術綁定的部分。

限制三:過去不代表未來

AI 模型在進化。 今天的約束,明天可能不需要了。

五年後回頭看,這些約束多半會被新工具內化掉。 但眼下,模型還沒學會替你選邊站。 約束,還是得自己給。


你的團隊現在交給 AI 的,是規範還是運氣?

建立明確的約束,是讓 AI 真正融入專業開發流程的第一步。

目前判斷依據仍在累積,我會先用可驗證約束降低生成品質波動。

下次 AI 幫你產一個元件,停 5 秒問自己: 它做出這個選擇,是因為我教過它,還是它在猜?


Sources