Next.js 15 & React 19:
Server Actions 與新特性完全指南
Server Actions、use() hook、PPR、Turbopack 穩定版 — 2026 年現代全端開發的最新樣貌
Section 1:Next.js 15 有哪些重大變化
Next.js 15 是一個里程碑版本,帶來了 React 19 預設整合、Turbopack 正式穩定、以及對 Caching 語義的重大調整。如果你從 Next.js 14 升級,有幾個 Breaking Changes 需要特別注意。
Turbopack 穩定版
dev server 速度比 webpack 快 5 倍,HMR(熱更新)快 96.3%。現在是 next dev 的預設打包工具。
React 19 成為預設
use() hook、useOptimistic()、useFormStatus() 等 React 19 新特性開箱即用,不再需要額外安裝 RC 版本。
Caching 語義更改
預設不再快取 GET Route Handlers 和 fetch 請求,回歸更直覺的行為。需要快取的地方必須明確宣告。
after() API
等 Response 送出後才執行的異步後處理 API。適合寄信、記錄 analytics、通知倉庫等不影響回應時間的工作。
connection() API
明確標記動態連線依賴,讓 Next.js 在靜態分析時能正確判斷頁面是靜態還是動態,提升 PPR 的準確性。
fetch 預設不再 cache
Next.js 14 中 fetch 預設等同 force-cache;15 改為 no-store。這是最容易造成升級問題的改變。
# 快速確認你的 Next.js 版本
Section 2:Server Actions 完整指南
Server Actions 讓你直接在 Server Component 或 'use server' 函式中處理表單提交和資料變更,不需要再手動建立 API Route。背後原理是 Next.js 自動產生一個隱藏的 RPC 端點,前端呼叫時透過 HTTP POST 傳遞序列化的參數。
Server Actions 的核心優勢
- • 表單送出不需要 JavaScript(Progressive Enhancement)
- • 資料驗證、資料庫操作都在 Server,不暴露商業邏輯
- • 自動整合 Next.js 的快取失效(revalidatePath、revalidateTag)
- • 配合 useActionState 可以無縫處理 loading 和 error 狀態
建立 Server Action(actions.ts)
在 Client Component 中使用 useActionState
useActionState 是 React 19 的新 Hook(取代了 Next.js 14 的 useFormState),讓你能追蹤 Server Action 的狀態(回傳值和 pending 狀態)。
在 Server Component 中直接使用
Section 3:React 19 新特性
React 19 帶來了幾個解決長久以來「非同步狀態管理」痛點的新 API。核心哲學是:讓 React 本身就能處理非同步資料流,不再需要依賴 react-query 或 SWR 才能有好的 DX。
use() Hook — 一統天下的資料讀取
use() 是一個特殊的 Hook,可以讀取 Promise 和 Context。與其他 Hook 不同,它可以在條件式和迴圈中使用。配合 Suspense,它讓 Promise 的消費變得極其簡潔。
useOptimistic() — 樂觀更新
樂觀更新(Optimistic Update)的概念是:假設操作會成功,立刻更新 UI;如果實際操作失敗,再 rollback 回原本的狀態。以前需要手動管理這個邏輯,useOptimistic 讓這件事變成兩行。
useFormStatus() — 表單送出狀態
useFormStatus 讓你在表單的子元件中存取表單的送出狀態,不需要把 isPending 一層層往下傳。這個 Hook 必須在 <form> 內部的元件中使用。
Section 4:PPR(Partial Prerendering)
PPR 是 Next.js 15 最具革命性的功能:在同一個頁面中同時擁有靜態和動態內容,打破了「整頁要嘛全靜態、要嘛全動態」的限制。它結合了 SSG 的速度優勢和 SSR 的動態能力,是現代全端架構的重大突破。
傳統 SSG
整頁靜態,速度快但資料可能過期,無法個人化
優點:速度極快
缺點:無法顯示動態/個人化內容
傳統 SSR
整頁動態,每次請求都重新渲染,速度受資料庫影響
優點:資料即時
缺點:TTFB 慢,受限於最慢的資料查詢
PPR
靜態骨架瞬間顯示,動態部分(Suspense 包裹)後續填入
優點:骨架瞬間顯示 + 資料即時
缺點:需要明確用 Suspense 包裹動態部分
開啟 PPR
實際頁面示例
PPR 目前仍是實驗性功能
Next.js 15 中 PPR 仍標記為 experimental,API 可能在正式版前有所調整。生產環境使用前請確認 Next.js 的版本更新說明。
Section 5:Caching 語義更改
Next.js 15 對 Caching 的語義做了重大調整,目的是讓行為更符合開發者的直覺。Next.js 14 的「預設全部快取」策略在大型應用中造成了許多意外的資料過期問題,15 版本回歸到更顯式(explicit)的快取控制。
Next.js 14 行為
- •
fetch()預設等同force-cache - • GET Route Handlers 預設被快取
- • 需要動態行為的地方要明確 opt-out
- • 容易造成「改了資料,頁面沒更新」的困惑
Next.js 15 行為(更直覺)
- •
fetch()預設等同no-store - • GET Route Handlers 預設不快取
- • 需要快取的地方要明確 opt-in
- • 行為符合大多數開發者的預期
fetch 快取行為對比
unstable_cache — 資料層快取
當你使用 ORM(如 Prisma)或直接查詢資料庫時,unstable_cache 讓你能在資料層加上快取,而不是在 HTTP 層。
Section 6:after() API — 異步後處理
after() 是 Next.js 15 新增的 API,讓你能在 Response 發送給用戶之後才執行某些工作。解決了一個長久以來的痛點:寄送確認信、記錄 analytics、通知其他服務,這些工作不應該讓用戶等待,但以前只能放在 Response 之前執行。
after() 的使用情境
寄送訂單確認信(不需要讓用戶等郵件服務)
記錄 analytics 事件(非同步,不影響主流程)
通知倉庫出貨系統(第三方 API call)
更新搜尋索引(如 Algolia、Elasticsearch)
發送 Slack 通知給內部團隊
清理暫存的上傳檔案
在 Route Handler 中使用
在 Server Action 中使用
Section 7:升級指南 — 從 Next.js 14 到 15
Next.js 15 提供了官方 codemod 工具自動處理大部分的 Breaking Changes,但仍有一些需要手動確認的地方。以下是升級前必須了解的重要改變。
使用官方 codemod 升級
主要 Breaking Changes
1. fetch 預設不再 cache
Breaking Change最容易造成升級問題的改變。如果你的頁面依賴 Next.js 14 的隱式快取,升級後可能會因為每次都重新 fetch 而變慢,或者快取設計需要重新規劃。
2. cookies() / headers() 現在是 async
Breaking ChangeNext.js 15 中讀取 cookies 和 headers 需要 await。這個改變讓 Next.js 在靜態分析時能更準確地判斷頁面的動態性。
3. params 和 searchParams 現在是 Promise
Breaking ChangePage 和 Layout 的 params、searchParams props 現在是 Promise,需要先 await 才能使用。codemod 可以自動修復大部分情況。
4. GET Route Handlers 不再預設 cache
需注意GET Route Handlers 在 Next.js 14 中如果沒有動態行為(沒用 cookies、headers 等),會被靜態快取。Next.js 15 改為預設不快取,行為更一致。
升級後的效益
完成升級後,你的應用將擁有 Turbopack 帶來的開發速度提升、React 19 的 Concurrent 特性、更直覺的 Caching 行為,以及 PPR 的靜態+動態混合能力。這些改變讓 Next.js 更接近「一個函式的抽象層」的願景 — 你只需要描述「要做什麼」,框架負責以最有效率的方式執行。