fetch
Next.js 擴展了 網頁端的 fetch()
API,允許伺服器上的每個請求設定其自身的持久化快取和重新驗證語義。
在瀏覽器中,cache
選項指示 fetch 請求將如何與「*瀏覽器*」的 HTTP 快取互動。透過此擴展功能,cache
指示「*伺服器端*」的 fetch 請求將如何與框架的持久化 資料快取 互動。
您可以在伺服器元件中直接使用 async
和 await
呼叫 fetch
。
app/page.tsx
export default async function Page() {
let data = await fetch('https://api.vercel.app/blog')
let posts = await data.json()
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}
fetch(url, options)
由於 Next.js 擴展了 網頁端的 fetch()
API,您可以使用任何 原生可用的選項。
options.cache
設定請求應如何與 Next.js 資料快取 互動。
fetch(`https://...`, { cache: 'force-cache' | 'no-store' })
force-cache
(預設):Next.js 會在其資料快取中尋找相符的請求。- 如果有相符且是新鮮的資料,它將會從快取中返回。
- 如果沒有相符或資料已過期,Next.js 將會從遠端伺服器擷取資源,並使用下載的資源更新快取。
no-store
:Next.js 會在每次請求時從遠端伺服器擷取資源,而不會查找快取,也不會使用下載的資源更新快取。
options.next.revalidate
fetch(`https://...`, { next: { revalidate: false | 0 | number } })
設定資源的快取存留期(以秒為單位)。
false
- 無限期快取資源。語義上等同於revalidate: Infinity
。HTTP 快取可能會隨著時間推移淘汰較舊的資源。0
- 阻止資源被快取。number
- (以秒為單位)指定資源的快取生命週期最多為n
秒。
注意事項:
- 如果個別的
fetch()
請求設定的revalidate
數值低於路徑的預設revalidate
值,則整個路徑的重新驗證間隔將會縮短。- 如果同一路徑中兩個具有相同 URL 的 fetch 請求具有不同的
revalidate
值,則將使用較低的值。- 為了方便起見,如果已將
revalidate
設定為數字,則不需要設定cache
選項。- 衝突的選項,例如
{ revalidate: 3600, cache: 'no-store' }
將會導致錯誤。
options.next.tags
fetch(`https://...`, { next: { tags: ['collection'] } })
設定資源的快取標籤。然後可以使用 revalidateTag
按需重新驗證資料。自訂標籤的最大長度為 256 個字元,最大標籤項目數為 64 個。
疑難排解
Fetch cache: 'no-store'
在開發過程中未顯示最新資料
Next.js 會在本地開發過程中,針對伺服器元件的熱模組替換 (HMR) 快取 fetch
回應,以加快回應速度並降低計費 API 呼叫的成本。
預設情況下,HMR 快取適用於所有 fetch 請求,包括帶有 cache: 'no-store'
選項的請求。這表示未快取的請求在 HMR 重新整理之間不會顯示最新資料。但是,快取將在導覽或整頁重新載入時清除。
請參閱 serverComponentsHmrCache
文件以了解更多資訊。
版本歷史記錄
版本 | 變更 |
---|---|
v13.0.0 | 引入 fetch 。 |
這有幫助嗎?