基於 Vue 3 + TypeScript + Vite 的現代化前端專案模板。
本專案採用 Feature-Based 資料夾架構,讓功能模組更加內聚且易於維護。
src/features/ 目錄下,每個 feature 作為一個獨立模組stores, components, utils, types 等src/ 根目錄下(如 src/hooks/, src/stores/, src/utils/)src/
├── features/ # 功能模組目錄
│ └── example/ # 範例功能模組
│ ├── index.vue # 主元件
│ ├── api.ts # API 請求
│ └── index.spec.ts # 單元測試
├── hooks/ # 共用的 Composition API hooks
│ └── useRequest.ts # API 請求 hook
├── stores/ # 全域狀態管理
│ ├── axios.ts # Axios 實例與攔截器
│ └── counter.ts # 範例 store
├── mocks/ # MSW mock 資料
│ ├── browser.ts # 瀏覽器環境 mock
│ ├── node.ts # Node 環境 mock
│ ├── handlers.ts # API handlers
│ └── data/ # Mock 資料
├── router/ # Vue Router 配置
├── utils/ # 共用工具函數
│ └── cn.ts # Tailwind CSS 類名合併工具
├── types/ # 全域型別定義
├── plugins/ # Vue 插件
│ └── icons/ # Iconify 整合
├── config/ # [選用] 專案全域設定
├── const/ # [選用] 常數定義
└── assets/ # 靜態資源
├── css/
└── icons/ # 圖標資源
專案內建自動化的 Iconify 圖標整合工具,會自動掃描專案中使用的圖標並產生對應的 JSON 檔案,實現按需載入,減少打包體積。圖標檔案放在 src/assets/icons/ 目錄下,建構時會自動處理。
useRequest Hook - 提供統一的 API 請求介面三者關係:
Component → useRequest → Axios Store → Backend API
↓ (開發環境)
MSW
cn 是基於 clsx 和 tailwind-merge 的工具函數,用於智能合併 Tailwind CSS 類名,解決類名衝突問題。
cn('px-2 py-1', 'px-4') // 輸出: 'py-1 px-4' (後者覆蓋前者)
當專案需求擴展時,以下是可優先選用的套件:
原則: 除非是複雜或難以實現的元件(如 Table、Popper、DatePicker、VirtualSelect 等),否則盡可能自行開發。
理由:
原則: 盡可能將商業邏輯移至元件之外(如獨立的 composables、utils 或 stores)。
好處:
原則: 測試不是必須的,但如果寫了測試,就必須保證測試通過才能 commit。
要求:
執行方式: 建議使用 Git hooks(如 husky + lint-staged)確保 commit 前測試通過。
npm install
npm run dev
# 單元測試
npm run test:unit
# E2E 測試(首次需安裝瀏覽器)
npx playwright install
npm run test:e2e
npm run lint