fetch
Next.js 擴展了 Web fetch()
API,允許伺服器上的每個請求設定自己的持久快取與重新驗證語意。
在瀏覽器中,cache
選項表示 fetch 請求如何與 瀏覽器 的 HTTP 快取互動。透過此擴展,cache
表示 伺服器端 fetch 請求如何與框架的持久 資料快取 (Data Cache) 互動。
您可以直接在伺服器元件 (Server Components) 中使用 async
和 await
呼叫 fetch
。
fetch(url, options)
由於 Next.js 擴展了 Web fetch()
API,您可以使用任何 原生可用選項。
options.cache
設定請求如何與 Next.js 資料快取 (Data Cache) 互動。
auto no cache
(預設):在開發環境中,Next.js 會在每次請求時從遠端伺服器取得資源,但在執行next build
時只會取得一次,因為路由會被靜態預渲染。如果在路由上偵測到 動態 API (Dynamic APIs),Next.js 會在每次請求時取得資源。no-store
:Next.js 會在每次請求時從遠端伺服器取得資源,即使路由上未偵測到動態 API。force-cache
:Next.js 會在資料快取中尋找匹配的請求。- 如果有匹配且為最新,則從快取中返回。
- 如果沒有匹配或匹配已過期,Next.js 會從遠端伺服器取得資源並更新快取。
options.next.revalidate
設定資源的快取生命週期(以秒為單位)。
false
- 無限期快取資源。語意上等同於revalidate: Infinity
。HTTP 快取可能會隨著時間淘汰舊資源。0
- 防止資源被快取。number
- (以秒為單位)指定資源的快取生命週期最多為n
秒。
須知事項:
- 如果個別
fetch()
請求設定的revalidate
數值低於路由的 預設revalidate
,整個路由的重新驗證間隔將會縮短。- 如果同一路由中相同 URL 的兩個 fetch 請求有不同的
revalidate
值,將使用較低的值。- 為方便起見,如果
revalidate
設定為數字,則無需設定cache
選項。- 衝突的選項如
{ revalidate: 3600, cache: 'no-store' }
會導致錯誤。
options.next.tags
設定資源的快取標籤 (cache tags)。之後可以使用 revalidateTag
按需重新驗證資料。自訂標籤的最大長度為 256 個字元,最多可設定 128 個標籤項目。
疑難排解
開發環境中預設 auto no store
和 cache: 'no-store'
未顯示最新資料
Next.js 在本地開發環境中會跨熱模組替換 (HMR) 快取伺服器元件 (Server Components) 中的 fetch
回應,以加快回應速度並減少計費 API 呼叫的成本。
預設情況下,HMR 快取 適用於所有 fetch 請求,包括使用預設 auto no cache
和 cache: 'no-store'
選項的請求。這表示未快取的請求在 HMR 重新整理之間不會顯示最新資料。但快取會在導航或整頁重新載入時清除。
更多資訊請參閱 serverComponentsHmrCache
文件。
版本歷史
版本 | 變更內容 |
---|---|
v13.0.0 | 引入 fetch 功能。 |