Swift Web 介紹

Swift Web 是一套面向內部業務專案的 Nuxt 4 全端框架,由腳手架 CLI、核心框架模組、Starter 工程模板和 Standards 規範套件四部分組成,旨在為團隊提供統一的技術基線與開發規範,讓每個專案都能快速啟動並保持一致的工程品質。

為什麼選擇 Swift Web

Swift Web 不是「又一個元件庫加模板」,它帶著三個明確的設計目標,每一個都對應舊框架的真實痛點:

效能:ISR 快取為主力,告別 CPU 100%

舊框架所有頁面即時 SSR,存取量一大 Node 伺服器 CPU 經常打滿。Swift Web 把渲染策略提為一等公民——每個頁面必須顯式宣告 ISR / SSR / CSR / SSG 四選一(ESLint 強制,漏寫不讓合併),以 ISR 快取承接絕大多數流量,僅必要時走完整 SSR。效能不靠事後調優,而是在每個頁面誕生時就被強制決策。

核心能力統一管理,升級一次全專案受益

加密請求、自動登入鏈路、分片上傳、SEO 全家桶、統一埋點、廣告底座……這些跨專案重複造的能力全部收進 @swift-web/framework 統一維護,業務專案升級一次依賴即可獲得新能力與修復。同時不犧牲業務自由度:元件全部無樣式(視覺由業務自定)、擴充靠薄封裝而非 fork 改源碼,框架升級永遠不會變成合併地獄。

AI 友好:為 AI 輔助開發設計的工程約束

這是 Swift Web 含金量最高的部分。框架從第一天起就按「AI 是主力開發者之一」來設計規則——清晰、嚴格、機器可校驗,讓 AI 在護欄內穩定產出可預測的程式碼:

  • 規範單一事實源:開發規範集中在 @swift-web/standards,sync 注入每個倉庫的 CLAUDE.md,Claude Code / Cursor / Copilot 開箱即讀,不靠口耳相傳
  • AI 工具鏈零設定:sw create 生成的專案自帶 .mcp.json 與完整 AI 約定檔案,新專案第一分鐘就能讓 AI 正確幹活
  • 規則配機械兜底:渲染策略必填、SEO 必填、根 class 與檔名嚴格映射、快取必須走加密 util……關鍵規則都有配套 ESLint / Stylelint / commit hook 攔截,AI 寫錯當場報錯,而不是靠人工 review 兜底
  • MR 自動 AI review:提 MR 觸發 bot 整單審查 + inline 評論,驗證通過自動合併,AI 寫的程式碼由 AI 先審一遍

一句話:別的框架解決「人怎麼寫得快」,Swift Web 同時解決「AI 怎麼寫得對」。

四大組成部分

Swift Web 生態

@swift-web/cli        命令列腳手架(發布在私有 npm)
  └─ sw create / add / config / info / upgrade / run

@swift-web/framework  核心框架模組(發布在私有 npm)
  └─ 元件 / Composable / Store / 插件 / 中介層 / 模組選項

@swift-web/starter    專案工程模板(發布在私有 npm,僅供 cli 拉取,業務方不直接裝)
  └─ sw create 時用 `npm pack @swift-web/starter` 拉最新版本

@swift-web/standards  生態規範單一事實源(發布在私有 npm)
  └─ 開發規範 rules / ESLint / Prettier / Stylelint 可分發設定 / commit-msg 校驗

@swift-web/cli

命令列工具,bin 名稱為 sw。負責專案初始化、檔案生成、設定管理、腳本執行、AI 整合和版本升級檢查。全域安裝一次,對所有專案生效。

pnpm add -g @swift-web/cli
sw create YC001-WEB-我的專案
sw add page product-detail
sw upgrade

@swift-web/framework

Nuxt Module 形式的核心框架,透過 modules: ['@swift-web/framework'] 接入。提供所有專案共用的基礎能力,版本統一管理,升級一次全專案受益。

框架內建能力速覽:

類別數量內容
元件(Sw*)40+ 個基礎 UI(SwButton/SwImage/SwLink…)、媒體(SwVideoPlayer 等)、容器(SwRail/SwCarousel/SwVideoFeed)、廣告底座(12 個 SwAd*)、富文字、QR Code、上傳 等
Composable15 個useModal、useToast、useTheme、useLoginCheck、useSeo、useTracker、useExposure 等
Store2 個useUserStore、useSystemStore
插件9 個request、system.server、system.client、auth.client、console、error-handler、pwa-cleanup、tracker、websocket
路由守衛2 個login.global、guest.global
模組選項15 項theme、i18n、pwa、auth、obfuscate、websocket、errorHandler、styles、systemInfo、suppressConsole、image、manualChunks、request、seo(含 sitemap 排除)、tracker

@swift-web/starter(專案模板)

starter 是 npm 套件(發布到 verdaccio 私服 npm.djatm.cloud),但不給業務消費方直接裝 —— 由 sw create 在執行時用 npm pack @swift-web/starter 拉最新快照。包含完整的 Nuxt 4 工程設定、CI/CD 腳本(GitLab CI + PM2)、ESLint / Stylelint 規則(消費 @swift-web/standards base)、Vitest 單元測試與 Playwright E2E 骨架——無需手動設定。

@swift-web/standards(規範)

生態規範的單一事實源:開發流程 SOP、AI 協作約定、commit / 分支規範等集中維護在 rules/,透過 sync 注入 framework / starter / docs 及各業務專案的 CLAUDE.md,保證所有倉庫讀到同一份規則;同時發布可分發的 ESLint / Prettier / Stylelint base 設定與 commit-msg 校驗腳本,各專案以 import base from '@swift-web/standards/eslint' 方式消費。規則升級只改主源發一次版,全生態升級依賴即生效。詳見 開發規範。

框架能力詳解

40+ 個內建元件

所有框架元件統一使用 Sw 前綴,透過 Nuxt 自動匯入,無需手動 import。按家族分組:

基礎 UI

元件說明
SwButton基礎按鈕,支援多種變體
SwLink智慧連結,自動區分內外鏈、自動處理 rel
SwIcon業務 SVG 圖示渲染
SwImage圖片優化,自動生成 WebP/AVIF srcset,防 CLS
SwAsyncText非同步載入遠端文字(.bnc 自動走 AES 解密,一般 URL 直接當 UTF-8 讀取)
SwFormField表單欄位容器,整合 vee-validate
SwBreadcrumb麵包屑導航(headless,items 驅動,可選發 BreadcrumbList JSON-LD)
SwSegmented平鋪單選(segmented / pill),自帶方向鍵 a11y
SwSelect下拉單 / 多選,可清空、可分組
SwPagination頁碼翻頁(受控 v-model:page)

彈層與回饋

元件說明
SwModal / SwModalHost全域彈窗系統
SwToast全域訊息提示

媒體播放

元件說明
SwVideoPlayer / SwAudioPlayer / SwVideoPreview影片/音訊播放器(HLS 支援)

橫排 / 輪播 / 影片流(按「內容怎麼流動」選)

元件說明
SwRail橫向滾動橫排(scroll-snap,無 loop)
SwCarousel整屏切換輪播 banner(無縫 loop + autoplay)
SwVideoFeed直向短影片流(整屏一條 + 虛擬化 + 影片池)
SwGallery換行等高網格 + 載入更多(button / auto / none 三態)

上傳 / QR Code / 富文字

元件說明
SwUploadFile / SwUploadImage / SwUploadVideo檔案上傳元件(普通檔案 / 圖片 / 影片)
SwQrcodeGenerator / SwQrcodeScannerQR Code 生成與掃描
SwEditor富文字編輯器

廣告底座(自渲染 + 內建曝光/點擊埋點,詳見 廣告元件與埋點;通用打點見 打點底座)

元件說明
SwAdBanner / SwAdPopup / SwAdMrec / SwAdNative主力廣告位
SwAdSplash進站 / 開屏自動彈(App-Open / Splash,頻控)
SwAdPreroll影片前貼片(放播放器 #preroll-ad slot,掛載即報曝光)
SwAdPause影片暫停廣告(放播放器 #pause-ad slot)
SwAdText / SwAdMarquee / SwAdFloating / SwAdIcon / SwAdLabel文字/跑馬燈/側邊/圖示/標籤廣告位

主題 / 語言

元件說明
SwThemeSwitch主題切換器(配合 useTheme;僅 theme.mode: 'toggle' 時渲染,自 gate)
SwLangSwitch語言切換器(讀 i18n.locales 自動聯動;i18n 關 / 單語言不渲染,自 gate)

PWA 引導

元件說明
SwAddToHomescreenGuide加入主畫面引導(A2HS)

17 個 Composable

// 登入與鑑權
useLoginCheck() // 檢查登入態,未登入跳轉
useLoginBy() // 多方式登入(手機號/帳號密碼等)
useLoginDialog() // 彈出登入對話框
useAuthReady() // 等待登入流程結束(device + 憑證嘗試都跑過)

// UI 互動
useModal() // 命令式彈窗
useToast() // 訊息提示(成功/錯誤/警告)

// 媒體 / 上傳 / 解密
useUploader() // 檔案分片上傳
useDecryptedAsset() // 加密資源(.bnc)解密 + IndexedDB 快取

// 主題
useTheme() // 主題管理(mode 感知:resolvedTheme + toggle/system/dark/light;無條件註冊)

// SEO
useSeo() // 統一 SEO 入口(og / canonical / JSON-LD / robots)

// 埋點與廣告
useTracker() // 集團 WebSDK 統一埋點(track 自訂事件)
useAdTrack() // 廣告曝光/點擊埋點欄位自動組裝
useAdFrequency() // 廣告展示頻率控制(加密快取)
useExposure() // 通用進視口一次性曝光偵測(內容卡片曝光埋點 / 自有 SDK 逃生艙)

// PWA
useAddToHomescreen() // 加入主畫面(A2HS)能力偵測與觸發

// 互動 / 導覽
useHoverPreview() // 卡片 hover 放大浮層預覽的機制層(意圖判定 + 定位純函式)
useExternalRedirect() // 外部連結中轉頁:白名單校驗 + noindex + 倒數跳轉
useVideoPlayerPrefs() // 播放器偏好:跳過片頭片尾 / 自動播放下一集

useLocal / useSession(加密本地快取)歸為工具函式;useUserStore / useSystemStore 是全域 Store,見下兩節。

2 個全域 Store

useUserStore() // 使用者資訊(登入態、token、使用者資料)
useSystemStore() // 系統資訊(伺服器端注入的全域設定)

9 個插件

插件執行環境功能
request通用初始化 API 請求客戶端,注入 $request
system.server伺服器端SSR 期拉 /system/info 寫入 systemStore
system.client客戶端SSR 失敗時 client 兜底重拉
auth.client客戶端device + auth 身份唯一建立點(hydrate 後)
console通用正式環境停用 console.log/warn(suppressConsole 開啟時注入)
error-handler.client客戶端全域錯誤捕捉與上報
pwa-cleanup.client客戶端dev 模式清理上一個專案殘留的 Service Worker(防 localhost 快取劫持)
tracker.client客戶端集團 WebSDK 埋點底座(懶載入 init + 自動 pageView;tracker 開啟時注入)
websocket.client客戶端註冊 $ws,支援斷線重連(websocket 開啟時注入)

15 個模組選項

透過 nuxt.config.ts 中的 swiftConfig 鍵設定(完整欄位參考見 framework/module-options):

swiftConfig: {
  theme: { mode: 'toggle' },                          // 主題模式(system/toggle/dark/light)
  i18n: { enabled: true, defaultLocale: 'zh-CN' },   // 多語言
  pwa: true,                                          // PWA
  auth: {                                             // 路由守衛 + client auth init
    guardedPaths: ['/mine'],
    guestPaths: ['/login', '/register'],
  },
  obfuscate: true,                                    // JS 混淆(正式預設開啟)
  websocket: true,                                    // WebSocket 客戶端
  errorHandler: { enabled: true, endpoint: '/_error-report' },  // 全域錯誤監控
  styles: { reset: true, responsive: true },          // CSS 基礎層注入開關
  systemInfo: true,                                   // /system/info 拉取(false / 物件 可選)
  suppressConsole: true,                              // 正式環境停用 console
  image: { provider: 'noop' },                        // SwImage provider 路由
  manualChunks: {},                                   // Vite 自訂分包
  request: { timeout: 20_000 },                       // $request 全域逾時 / 全域 headers
  seo: {                                              // SEO 套件(永久啟用)
    aiBotPolicy: 'allow',                             // AI 訓練爬蟲策略('allow' | 'disallow')
    sitemap: { exclude: ['/preview/**'] },            // sitemap 追加排除路徑(私有路徑已預設排除)
  },
  tracker: true,                                      // 集團統一埋點底座(設定缺失自動降級靜默)
}

專案架構

專案目錄/
├── app/
│   ├── components/      業務元件(PascalCase 命名)
│   ├── pages/           路由頁面(kebab-case 命名)
│   ├── layouts/         版面配置檔案(全小寫命名)
│   ├── composables/     業務級 composable
│   ├── store/           業務級 Pinia store
│   ├── api/             API 模組(按功能分檔案)
│   ├── assets/          CSS 變數、全域樣式
│   └── plugins/         業務級插件
├── public/
│   └── images/          圖片原始檔案(jpg/png/webp/svg)
├── i18n/                多語言翻譯檔案(zh-CN/zh-TW/en)
├── server/              Nitro 伺服器端 API
├── .env                 本地環境變數(不提交 git)
├── nuxt.config.ts       Nuxt 設定(含框架模組選項)
└── swift.config.json    Swift Web 專案中繼資料

分層原則

┌─────────────────────────────────────────┐
│           業務層(starter)              │
│   app/pages → app/components → app/api │
│              ↓ 使用(自動匯入)          │
├─────────────────────────────────────────┤
│          框架層(framework)             │
│   Sw* 元件 / use* composable / store   │
│      不得反向引用業務層內容              │
└─────────────────────────────────────────┘

整合的第三方模組

框架自動安裝並設定以下模組,業務專案無需重複設定:

模組用途註冊方式
@pinia/nuxt全域狀態管理始終
@vueuse/nuxt常用組合式工具函式始終
@nuxt/fonts字型優化載入始終
@nuxt/scripts第三方腳本懶載入始終
@nuxtjs/sitemap動態 sitemap.xml 生成始終(SEO 強制啟用)
@nuxtjs/robotsrobots.txt 生成(含 AI bot 策略)始終(SEO 強制啟用)
nuxt-schema-orgJSON-LD 結構化資料始終(SEO 強制啟用)
@nuxtjs/i18n多語言國際化i18n.enabled 開啟時
@vite-pwa/nuxtPWA 支援framework.pwa 為 true 時(嚴格布林)

適用場景

Swift Web 專為內部業務專案設計,適合:

  • 後台管理系統
  • 面向使用者的 Web 應用程式(內容平台、會員系統等)
  • 需要 SEO 的行銷頁面或落地頁
  • 有多語言需求的國際化應用程式

前置要求

相依套件版本要求
Node.js^20.19.0 || >=22.12.0(不含 21)
pnpm>= 11(engines 硬性要求,低版本 install 直接報錯)
私有 npm 倉庫存取權限需設定 .npmrc(見快速開始)

下一步