雙籠體育的舊版後端建立在 Prisma + NextAuth + Next.js 之上,部署在 Vercel 平台。這套組合在開發初期相當順暢——工具成熟、生態豐富、文件齊全。
但隨著流量進入,一個致命的問題開始浮現:Prisma 的冷啟動。每當 Serverless 函式從閒置狀態喚醒,Prisma Client 的初始化時間就會讓請求延遲暴增,同時大量消耗 Vercel 的 Active CPU 資源,成本持續攀升,使用者體驗也大打折扣。
Prisma 在 Serverless 環境的冷啟動問題,導致 Vercel Active CPU 使用量異常偏高,並在尖峰時段造成明顯的回應延遲。這不是可以透過調參解決的問題——它是架構層面的根本限制。
我們最初的想法是把服務遷移到 Cloudflare Workers 上,利用邊緣運算的特性來解決冷啟動問題。然而,現有技術棧的每一個核心元件都成了阻礙:
Prisma 不適合 Edge Runtime
Prisma Client 依賴 Node.js 原生模組,無法在 Cloudflare Workers 的 V8 隔離環境中運行。雖然後來推出了 Prisma Accelerate,但引入了額外的複雜度與成本。
Next.js App Router 的邊緣限制
Next.js 的全端框架設計以 Node.js 為基礎,即便有 Edge Runtime 選項,許多套件和功能仍有相容性問題,遷移成本極高。
NextAuth 的邊緣相容性問題
NextAuth 的部分依賴項無法在 Edge Runtime 運行,且 Session 管理的設計假設了傳統 Node.js 環境。
技術決策
重新選擇每一個環節
既然無法透過打補丁解決問題,我們決定從架構層面重新出發,選擇每個環節都為邊緣運算原生設計的工具。
效能數據
冷啟動延遲:平台比較
Cloudflare Workers vs Vercel Functions(ms,數值越低越好)
* 橫軸以 Vercel 最大值 1500ms 為 100%。Cloudflare Workers 在 V8 隔離架構下幾乎消除冷啟動。
ORM 比較
Prisma vs Drizzle:啟動時間 & Bundle Size
Cold Start(Serverless)
以 Prisma 最大值 150ms 為基準
Bundle Size
體積縮減 96.5%,以 Prisma 1.6MB 為基準
TanStack Start 是以 TanStack Router 為核心的全端框架,天生與 Vite 整合,對邊緣環境友好,且不綁定任何特定部署平台。Drizzle ORM 輕量、型別安全,能夠在 Edge Runtime 中無縫運作,沒有 Prisma 那樣的初始化負擔。Better Auth 則是專為現代 TypeScript 專案設計的認證解決方案,完整支援邊緣環境,設定彈性也更高。
這三者組合在一起,讓我們的後端可以真正部署在 Cloudflare Workers 上,享受全球邊緣網路的低延遲,同時從根本上消除了冷啟動問題。
開發過程
AI 作為加速器:Claude Opus 4.8 的實際用量
這次重建不只是技術選型的改變,也是我們開發方式的一次實驗。我們大量借助 AI 加速整個遷移過程——從架構討論、程式碼生成,到技術文件的整理,Claude Opus 4.8 幾乎全程參與其中。
以下是這次專案實際的 Token 使用數據與總花費:
Claude Opus 4.8 — 本次專案用量
Tokens
Tokens
Tokens
Tokens
龐大的 Cache Read 數字反映了我們的使用方式:我們把專案的技術規格、資料庫 Schema 以及設計決策文件都放進 Context 中,讓每一次對話都能在完整的專案理解下進行。這讓 AI 輔助的品質大幅提升,也避免了每次都要重新解釋背景的摩擦。
AI 的加入讓開發週期顯著縮短——尤其是在研究新框架、處理型別問題,以及撰寫遷移腳本這幾個環節,省下了大量時間。
接下來
幾個月後見
新版後端目前仍在開發與測試階段。我們正在確保每個功能都在新架構下穩定運行,也在驗證 Cloudflare Workers 環境的各種邊際情況。
架構決策完成
完成 TanStack Start + Drizzle + Better Auth 的技術選型與可行性驗證。
核心功能開發中
主要業務邏輯正在向新架構遷移,包含用戶認證、資料層以及 API 端點。
測試與收尾
全面整合測試、效能基準測試,以及邊緣環境的相容性驗證。
重新上線
幾個月後,全新的雙籠體育後端將正式對外開放。
我們知道等待很難受。但這次我們想把事情做對,而不只是做快。新版的雙籠體育不只是技術棧的升級,也是整個產品體驗的一次重新出發。
感謝一直支持雙籠體育的朋友們。我們很快見。