結論先講

一個「能動」的前端專案跟一個「好的」前端專案差距有多大?大概就是你一個人寫 side project 跟一個五人團隊維護三年的差距。好的前端專案不只是畫面漂亮、功能正常,它還需要在型別安全、元件一致性、效能、可及性、測試覆蓋、部署流程上都有基本的保障。

這篇文章就是一張體檢表。拿去對照你手上的專案,看看哪些做到了、哪些還缺。不用一次全補齊,但至少知道差距在哪。


體檢清單

1. TypeScript

如果你 2026 年還在用純 JavaScript 寫正式專案,我真的會幫你默哀。TypeScript 帶來的好處太多了:

  • 編譯期就能抓出一堆 bug
  • IDE 自動補全和重構超好用
  • 程式碼即文件,型別就是最好的說明
// 不好:any 到處飛
function fetchUser(id: any): any {
  return api.get(`/users/${id}`);
}
 
// 好:型別明確
interface User {
  id: string;
  name: string;
  email: string;
  role: 'admin' | 'editor' | 'viewer';
}
 
async function fetchUser(id: string): Promise<User> {
  const response = await api.get<User>(`/users/${id}`);
  return response.data;
}

檢查項目:

  • 使用 TypeScript(strict: true
  • 幾乎沒有 any 型別
  • API 回應有對應的 interface/type

2. 元件庫 / Design System

不是說一定要用 MUI 或 Ant Design,但你的專案需要有一套一致的元件規範

  • 有統一的 Button、Input、Modal 等基礎元件
  • 色彩、間距、字型有定義(Design Tokens)
  • 有 Storybook 或類似的元件展示工具

3. 響應式設計(Responsive Design)

  • 支援手機、平板、桌機三種斷點
  • 使用 CSS Grid / Flexbox,不是 float hack
  • 有實際在不同裝置上測試過

4. 效能預算(Performance Budget)

{
  "budgets": [
    { "type": "initial", "maximumWarning": "500kb", "maximumError": "1mb" },
    { "type": "anyScript", "maximumWarning": "150kb" }
  ]
}
  • 設定 Lighthouse 效能分數門檻(至少 80)
  • First Contentful Paint < 1.5s
  • Bundle size 有上限且 CI 會檢查
  • 圖片有做最佳化(WebP/AVIF、lazy loading)

5. Error Boundaries

React 有 Error Boundary,Vue 有 errorCaptured。重點是你的應用不該因為一個元件爆掉就整頁白屏。

// React Error Boundary 基本版
class ErrorBoundary extends React.Component<Props, State> {
  static getDerivedStateFromError(error: Error) {
    return { hasError: true, error };
  }
 
  componentDidCatch(error: Error, info: React.ErrorInfo) {
    errorReportingService.log(error, info);
  }
 
  render() {
    if (this.state.hasError) {
      return <FallbackUI error={this.state.error} />;
    }
    return this.props.children;
  }
}
  • 全域 Error Boundary
  • 關鍵區塊有獨立 Error Boundary
  • 錯誤有回報到監控系統(Sentry 等)

6. 國際化(i18n / l10n)

即使你現在只做中文,架構先做好未來才好擴充。

  • 文字不寫死在元件裡
  • 使用 i18n 框架(react-intl、vue-i18n 等)
  • 日期、數字格式化有考慮 locale

7. 無障礙(Accessibility)

  • 語意化 HTML(button 不是 div onClick
  • 圖片有 alt text
  • 鍵盤可操作
  • 色彩對比度符合 WCAG AA

8. SEO Meta

  • 每頁有獨立的 title 和 description
  • Open Graph / Twitter Card meta tags
  • Sitemap 和 robots.txt
  • 結構化資料(JSON-LD)

9. Analytics 追蹤

  • 頁面瀏覽追蹤
  • 關鍵事件追蹤(註冊、購買等)
  • 錯誤追蹤(與 Error Boundary 整合)

10. 測試(Unit + Visual)

  • 單元測試覆蓋率 > 70%
  • 元件有 snapshot 或 visual regression 測試
  • E2E 測試涵蓋核心流程(Playwright / Cypress)

11. CI/CD

  • Push 就跑 lint + test + build
  • PR 有預覽環境(Preview Deployment)
  • 主分支合併自動部署

12. Bundle 分析

  • 有 bundle analyzer 工具(webpack-bundle-analyzer 等)
  • 定期檢查 tree-shaking 效果
  • 沒有重複引入相同套件的不同版本

13. 環境設定

  • 環境變數管理(.env.development.env.production
  • 沒有把 API key 寫在程式碼裡
  • .env.example 說明需要哪些變數

14. 文件

  • README 有寫且有用
  • 元件有 JSDoc 或 Storybook 文件
  • 架構決策有記錄(ADR)

比較表:常見前端框架的預設支援度

功能Next.jsNuxt 3SvelteKitRemix
TypeScript內建內建內建內建
SSR/SSG兩者都有兩者都有兩者都有SSR 為主
路由檔案系統檔案系統檔案系統檔案系統
Image 最佳化next/imagenuxt-image需套件需套件
SEOnext/headuseHeadsvelte:headmeta export
i18n需套件@nuxtjs/i18n需套件需套件
測試需設定@nuxt/test-utilsvitest 整合需設定
效能預算需設定需設定需設定需設定

實戰範例:一個合格的 package.json scripts 區塊

{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "eslint . --ext .ts,.tsx",
    "lint:fix": "eslint . --ext .ts,.tsx --fix",
    "format": "prettier --write .",
    "type-check": "tsc --noEmit",
    "test": "vitest",
    "test:coverage": "vitest --coverage",
    "test:e2e": "playwright test",
    "analyze": "ANALYZE=true next build",
    "storybook": "storybook dev -p 6006",
    "prepare": "husky install"
  }
}

FAQ

Q1: 小專案也需要這些嗎?

不用全部。但 TypeScript、基本測試、CI/CD 這三個是最低標準。即使是 side project,養成好習慣以後進大團隊才不會痛苦。

Q2: Design System 一定要自己做嗎?

不一定。用 Shadcn/ui、Radix、Headless UI 這類無樣式元件庫,再加上你自己的 Design Tokens,是一個很好的平衡點。

Q3: Lighthouse 分數一定要 100 嗎?

不用。80 以上就算合格,90 以上是優秀。追求 100 分的 ROI 通常不好,把時間花在使用者真正在意的地方比較值得。

Q4: 效能預算怎麼訂?

看你的目標用戶。如果是面向東南亞市場、手機用戶多,bundle size 就要壓更小。一般來說,首次載入的 JavaScript 壓在 300KB 以下(gzipped)是個合理的目標。

Q5: 測試覆蓋率要多高才夠?

70% 是個務實的目標。與其追求數字,不如確保核心商業邏輯和共用元件有測到。100% 覆蓋率不代表沒有 bug。


系列導航