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、上傳 等 |
| Composable | 15 個 | useModal、useToast、useTheme、useLoginCheck、useSeo、useTracker、useExposure 等 |
| Store | 2 個 | 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 / SwQrcodeScanner | QR 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/robots | robots.txt 生成(含 AI bot 策略) | 始終(SEO 強制啟用) |
nuxt-schema-org | JSON-LD 結構化資料 | 始終(SEO 強制啟用) |
@nuxtjs/i18n | 多語言國際化 | i18n.enabled 開啟時 |
@vite-pwa/nuxt | PWA 支援 | framework.pwa 為 true 時(嚴格布林) |
適用場景
Swift Web 專為內部業務專案設計,適合:
- 後台管理系統
- 面向使用者的 Web 應用程式(內容平台、會員系統等)
- 需要 SEO 的行銷頁面或落地頁
- 有多語言需求的國際化應用程式
前置要求
| 相依套件 | 版本要求 |
|---|---|
| Node.js | ^20.19.0 || >=22.12.0(不含 21) |
| pnpm | >= 11(engines 硬性要求,低版本 install 直接報錯) |
| 私有 npm 倉庫存取權限 | 需設定 .npmrc(見快速開始) |
下一步
- 快速上手 —— 5 分鐘建好專案、跑起來
- 開發規範 —— 團隊開發約定(命名 / 渲染策略 / SEO / SSR 安全)
- 框架設定 Module Options ——
swiftConfig能力總覽 - Nuxt 渲染模式選用指南 —— 框架「ISR 為主力」效能初衷的展開