增量靜態再生 (Incremental Static Regeneration)
Next.js 允許您在網站建置完成後,仍能建立或更新靜態頁面。增量靜態再生 (ISR) 讓您可以針對每個頁面使用靜態生成功能,無需重新建置整個網站。透過 ISR,您既能保留靜態頁面的優勢,又能擴展至數百萬個頁面。
須知:目前
edge
運行時 與 ISR 不相容,但您可以透過手動設定cache-control
標頭來利用stale-while-revalidate
機制。
要使用 ISR,請在 getStaticProps
中加入 revalidate
屬性:
當請求發送到在建置階段預先渲染的頁面時,最初會顯示快取的頁面。
- 在初始請求後 10 秒內對該頁面的任何請求也會被快取並立即回應。
- 10 秒過後,下一個請求仍會顯示快取的(過期)頁面
- Next.js 會在背景觸發頁面的重新生成。
- 一旦頁面成功生成,Next.js 會使快取失效並顯示更新後的頁面。如果背景重新生成失敗,舊頁面仍會保持不變。
當請求發送到尚未生成的路徑時,Next.js 會在第一次請求時進行伺服器端渲染。後續請求將從快取中提供靜態檔案。在 Vercel 上,ISR 會全局持久化快取並處理回滾。
須知:請檢查您的上游資料提供者是否預設啟用了快取。您可能需要停用它(例如設定
useCdn: false
),否則重新驗證將無法取得新資料來更新 ISR 快取。當端點返回Cache-Control
標頭時,快取可能會發生在 CDN 層級。
按需重新驗證 (On-Demand Revalidation)
如果您將 revalidate
時間設為 60
,則所有訪客在一分鐘內都會看到相同的生成版本。唯一使快取失效的方式是在一分鐘過後有人訪問該頁面。
從 v12.2.0
開始,Next.js 支援按需增量靜態再生,可手動清除特定頁面的 Next.js 快取。這讓您在以下情況更容易更新網站:
- 來自無頭 CMS 的內容被建立或更新
- 電子商務元資料變更(價格、描述、類別、評論等)
在 getStaticProps
中,您不需要指定 revalidate
即可使用按需重新驗證。如果省略 revalidate
,Next.js 會使用預設值 false
(不重新驗證),僅在呼叫 revalidate()
時按需重新驗證頁面。
須知:中介軟體 不會針對按需 ISR 請求執行。相反地,您需要在想要重新驗證的 確切 路徑上呼叫
revalidate()
。例如,如果您有pages/blog/[slug].js
和從/post-1
重寫到/blog/post-1
的規則,您需要呼叫res.revalidate('/blog/post-1')
。
使用按需重新驗證
首先,建立一個只有您的 Next.js 應用程式知道的秘密令牌。此秘密將用於防止未經授權存取重新驗證 API 路由。您可以透過以下 URL 結構存取該路由(手動或透過 webhook):
接著,將此秘密新增為應用程式的環境變數。最後,建立重新驗證 API 路由:
查看我們的示範以了解按需重新驗證的實際運作並提供反饋。
在開發期間測試按需 ISR
當使用 next dev
在本機運行時,getStaticProps
會在每次請求時被呼叫。要驗證您的按需 ISR 設定是否正確,您需要建立生產版本並啟動生產伺服器:
然後,您可以確認靜態頁面是否已成功重新驗證。
錯誤處理與重新驗證
如果在處理背景重新生成時 getStaticProps
內部發生錯誤,或您手動拋出錯誤,則會繼續顯示最後一次成功生成的頁面。在後續請求中,Next.js 會重試呼叫 getStaticProps
。
自託管 ISR
增量靜態再生 (ISR) 在自託管 Next.js 網站上開箱即用,只需使用 next start
。
當部署到容器編排系統如 Kubernetes 或 HashiCorp Nomad 時,可以使用此方法。預設情況下,生成的資源會儲存在每個 pod 的記憶體中。這意味著每個 pod 都會有自己的靜態檔案副本。在該特定 pod 收到請求之前,可能會顯示過期資料。
為確保所有 pod 之間的一致性,您可以停用記憶體快取。這會通知 Next.js 伺服器僅使用檔案系統中由 ISR 生成的資源。
您可以在 Kubernetes pod(或類似設定)中使用共享網路掛載,在不同容器之間重複使用相同的檔案系統快取。透過共享相同的掛載,包含 next/image
快取的 .next
資料夾也會被共享和重複使用。
要停用記憶體快取,請在 next.config.js
檔案中將 isrMemoryCacheSize
設為 0
:
須知:根據共享掛載的配置方式,您可能需要考慮多個 pod 同時嘗試更新快取時的競爭條件問題。
版本歷史
版本 | 變更 |
---|---|
v12.2.0 | 按需 ISR 穩定版 |
v12.1.0 | 新增按需 ISR(測試版)。 |
v12.0.0 | 新增機器人感知 ISR 後備。 |
v9.5.0 | 新增基礎路徑。 |