vue-best-practices

vue-best-practices

熱門

必須用於 Vue.js 任務。強烈建議使用 Composition API 搭配 `<script setup>` 和 TypeScript 作為標準做法。涵蓋 Vue 3、SSR、Volar、vue-tsc。處理任何 Vue、.vue 檔案、Vue Router、Pinia 或 Vite 搭配 Vue 的工作時載入。除非專案明確要求 Options API,否則一律使用 Composition API。

5367星標
304分支
更新於 2026/6/23
SKILL.md
readonlyread-only
name
vue-best-practices
description

必須用於 Vue.js 任務。強烈建議使用 Composition API 搭配 `<script setup>` 和 TypeScript 作為標準做法。涵蓋 Vue 3、SSR、Volar、vue-tsc。處理任何 Vue、.vue 檔案、Vue Router、Pinia 或 Vite 搭配 Vue 的工作時載入。除非專案明確要求 Options API,否則一律使用 Composition API。

Vue 最佳實務工作流程

將此技能視為一組指令集。除非使用者明確要求不同順序,否則請依序遵循工作流程。

核心原則

  • 保持狀態可預測: 單一事實來源,其餘皆由此推導。
  • 讓資料流明確: 大部分情況使用 Props 向下、Events 向上。
  • 偏好小型、專注的元件: 更容易測試、重用和維護。
  • 避免不必要的重新渲染: 明智地使用 computed 屬性和 watcher。
  • 可讀性至上: 撰寫清晰、自我說明的程式碼。

1) 編碼前確認架構(必要)

  • 預設技術棧:Vue 3 + Composition API + <script setup lang="ts">
  • 如果專案明確使用 Options API,則載入 vue-options-api-best-practices 技能(若可用)。
  • 如果專案明確使用 JSX,則載入 vue-jsx-best-practices 技能(若可用)。

1.1 必讀核心參考(必要)

  • 在實作任何 Vue 任務之前,請務必閱讀並套用以下核心參考:
    • references/reactivity.md
    • references/sfc.md
    • references/component-data-flow.md
    • references/composables.md
  • 在整個任務期間,將這些參考保留在活躍的工作上下文中,而不僅在特定問題出現時才參考。

1.2 編碼前規劃元件邊界(必要)

對於任何非平凡的 feature,在實作前建立簡短的元件對應圖。

  • 用一句話定義每個元件的單一職責。
  • 預設將 entry/root 和路由層級的檢視元件作為組合表面。
  • 將 feature UI 和 feature 邏輯移出 entry/root/view 元件,除非任務刻意是小型單一檔案示範。
  • 在對應圖中定義每個子元件的 props/emits 合約。
  • 當新增超過一個元件時,偏好使用 feature 資料夾佈局(components/<feature>/...composables/use<Feature>.ts)。

2) 套用必要的 Vue 基礎(必要)

這些是必要且必須了解的基礎。使用已在第 1.1 節載入的核心參考,在每個 Vue 任務中套用所有這些基礎。

響應性

  • 來自 1.1 的必讀參考:reactivity
  • 保持來源狀態最小化(ref/reactive),盡可能使用 computed 推導其餘部分。
  • 必要時使用 watcher 處理副作用。
  • 避免在模板中重新計算昂貴的邏輯。

SFC 結構與模板安全

  • 來自 1.1 的必讀參考:sfc
  • 保持 SFC 區段順序為:<script><template><style>
  • 保持 SFC 職責專注;拆分大型元件。
  • 保持模板宣告式;將分支/推導移至 script。
  • 套用 Vue 模板安全規則(v-html、列表渲染、條件渲染選擇)。

保持元件專注

當元件具有超過一個明確職責時(例如資料編排 + UI,或多個獨立 UI 區段),則拆分元件。

  • 偏好較小的元件 + composable,而非單一「巨型元件」
  • UI 區段移至子元件(props 傳入、events 傳出)。
  • 狀態/副作用移至 composable(useXxx())。

套用客觀的拆分觸發條件。如果任何條件成立,則拆分元件:

  • 它同時擁有編排/狀態和多個區段的大量呈現標記。
  • 它有 3 個以上不同的 UI 區段(例如:表單、篩選器、列表、頁尾/狀態)。
  • 模板區塊重複或可能變得可重用(項目行、卡片、列表條目)。

Entry/root 和路由檢視規則:

  • 保持 entry/root 和路由檢視元件精簡:應用程式外殼/佈局、provider 接線和 feature 組合。
  • 當 feature 包含獨立部分時,不要將完整的 feature 實作放在 entry/root/view 元件中。
  • 對於 CRUD/列表 feature(待辦事項、表格、目錄、收件匣),至少拆分為:
    • feature 容器元件
    • 輸入/表單元件
    • 列表(和/或項目)元件
    • 頁尾/動作或篩選器/狀態元件
  • 僅對非常小的拋棄式示範允許單一檔案實作;如果選擇此方式,請明確說明為何不需要拆分。

元件資料流

  • 來自 1.1 的必讀參考:component-data-flow
  • 使用 props 向下、events 向上作為主要模型。
  • 僅對真正的雙向元件合約使用 v-model
  • 僅對深層樹狀依賴或共享上下文使用 provide/inject。
  • 保持合約明確並使用 definePropsdefineEmitsInjectionKey 進行型別化(視需要)。

Composables

  • 來自 1.1 的必讀參考:composables
  • 當邏輯被重用、有狀態或副作用較重時,將其提取到 composable 中。
  • 保持 composable API 小型、型別化且可預測。
  • 將 feature 邏輯與呈現元件分離。

3) 僅在需求要求時考慮選擇性功能

3.1 標準選擇性功能

預設不要加入這些功能。僅在需求存在時載入對應的參考。

3.2 較不常見的選擇性功能

僅在有明確的產品或技術需求時使用這些功能。

  • Directives:行為是 DOM 特定的,且不適合 composable/component -> directives
  • 非同步元件:重量級/不常使用的 UI 應延遲載入 -> component-async
  • 僅在模板無法表達需求時使用 Render functions -> render-functions
  • 當行為必須在應用程式範圍內安裝時使用 Plugins -> plugins
  • 狀態管理模式:應用程式範圍的共享狀態跨越 feature 邊界 -> state-management

4) 在行為正確後執行效能最佳化

效能工作是功能完成後的步驟。在核心行為實作並驗證之前,不要進行最佳化。

5) 完成前的最終自我檢查

  • 核心行為正常運作且符合需求。
  • 所有必讀參考都已閱讀並套用。
  • 響應性模型最小化且可預測。
  • 遵循 SFC 結構和模板規則。
  • 元件專注且重構良好,必要時進行拆分。
  • Entry/root 和路由檢視元件保持為組合表面,除非有明確的小型示範例外。
  • 元件拆分決策明確且可辯護(職責邊界清晰)。
  • 資料流合約明確且型別化。
  • 在重用/複雜性合理的情況下使用 Composables。
  • 如果適用,將狀態/副作用移至 composable。
  • 僅在需求要求時使用選擇性功能。
  • 僅在功能完成後才套用效能變更。