定期重新驗證,確保內容新鮮有趣

另一項工具,可協助您在提供網頁應用程式時,在立即性和即時性之間取得平衡。

哪些商品已出貨?

stale-while-revalidate 可協助開發人員在立即性 (立即載入快取內容) 和更新頻率之間取得平衡,確保快取內容更新日後會使用。如果您維護的第三方網路服務或程式庫會定期更新,或是第一方素材資源的生命週期通常較短,那麼除了您現有的快取政策之外,stale-while-revalidate 也可以派上用場。

您可以前往 Chrome 75Firefox 68,在 Cache-Control 回應標頭中設定 stale-while-revalidatemax-age

不支援 stale-while-revalidate 的瀏覽器會在不通知使用者的情況下忽略該設定值,並使用 max-age,正如我稍後會說明。

這是什麼意思?

讓我們將 stale-while-revalidate 分為兩個部分:快取回應可能已過時的概念,以及重新驗證的程序。

首先,瀏覽器如何判斷快取回應是否「過時」?包含 stale-while-revalidateCache-Control 回應標頭也應包含 max-age,而透過 max-age 指定的秒數會決定過時程度。任何比 max-age 以上的快取回應都會視為最新回應,而較舊的快取回應會過時。

如果本機快取的回應仍是最新的,就能直接使用該回應來完成瀏覽器的要求。從 stale-while-revalidate 的角度來看,在這種情況下不必採取任何行動。

但如果快取回應過時,系統會再執行另一次以年齡為基礎的檢查:快取回應在 stale-while-revalidate 設定提供的額外時間範圍內是否存在?

如果過時回應的存在時間落在這個視窗中,就會用來執行瀏覽器的要求。同時,系統會對網路發出「重新驗證」要求,且要求不會延遲快取回應的使用。傳回的回應可能包含與先前快取回應相同的資訊,或是可能不同。不論是哪一種方式,網路回應都會儲存在本機,取代先前快取的內容,並重設在日後任何 max-age 比較時使用的「頻率」計時器。

不過,如果過時的快取回應時間到超過 stale-while-revalidate 時長,就無法執行瀏覽器的要求。瀏覽器會改為從網路擷取回應,並將這個回應用於執行初始要求,並以新的回應填入本機快取。

即時範例

以下是傳回目前時間的簡單 HTTP API 範例,更具體地說明每小時的目前分鐘數。

在此情況下,網路伺服器會在其 HTTP 回應中使用這個 Cache-Control 標頭:

Cache-Control: max-age=1, stale-while-revalidate=59

這項設定表示,如果該時間的要求在 1 秒內重複,則先前快取的值仍會保持最新狀態並依原樣使用,不會重新驗證。

如果要求在 1 到 60 秒後重複,則快取的值會過時,但將用於執行 API 要求。同時「在背景」會發出重新驗證要求,以新的值填入快取,以供日後使用。

如果要求在 60 秒後重複,則完全不會使用過時的回應,而無論是要執行瀏覽器的要求,還是快取重新驗證,都取決於從網路傳回回應。

以下是這三種不同狀態的細目,以及各狀態適用的時間範圍。範例如下:

這張圖表說明前一節的資訊。

常見用途有哪些?

上例是「一小時後」API 服務範例,但此範例說明瞭預期的用途,也就是提供需要重新整理,但可提供某種過時程度的資訊的服務。

出現頻率較低的範例可能是針對目前天氣狀況的 API,或是過去 1 小時內撰寫的頭條新聞頭條。

一般而言,任何以已知時間間隔更新、可能會多次要求更新的回應,以及這個時間間隔內的靜態回應,都非常適合透過 max-age 進行短期快取。將 stale-while-revalidatemax-age 搭配使用,在不封鎖網路回應的情況下,也能透過快取處理日後要求的可能性提高。

如何與 Service Worker 互動?

如果您聽說 stale-while-revalidate 可能就是位於服務工作站中使用的方案結構定義。

透過 Cache-Control 標頭使用過時時重新驗證,與在 Service Worker 中的使用行為相似,並且同樣適用於更新間隔和生命週期上限的許多考量。不過,在決定要實作以服務工作站為基礎的方法,還是僅仰賴 Cache-Control 標頭設定時,請考量以下幾點。

如果發生下列情況,請使用 Service Worker 方法...

  • 您已在網頁應用程式中使用 Service Worker。
  • 您需要精細控管快取內容,並實作像是最近最少使用的到期時間政策。Workbox 的快取到期模組可協助您解決這個問題。
  • 您希望在重新驗證步驟中,如果過時的回應因變更而變更,您會收到通知。Workbox 的廣播快取更新模組可協助您解決這個問題。
  • 所有新版瀏覽器都需使用這個 stale-while-revalidate 行為。

如果符合下列情況,請使用 Cache-Control 方法:

  • 您不需要為網頁應用程式部署及維護 Service Worker,
  • 不過,您可以設定瀏覽器的自動快取管理功能,避免本機快取過大。
  • 您可以採用並非所有新版瀏覽器都支援的方法 (自 2019 年 7 月起;日後可能會擴大支援範圍)。

如果您使用 Service Worker,也已透過 Cache-Control 標頭針對部分回應啟用 stale-while-revalidate,則 Service Worker 通常會在回應要求時「初次破解」。如果 Service Worker 決定不回應,或是在產生回應的過程中使用 fetch() 發出網路要求,則透過 Cache-Control 標頭設定的行為最終可能會生效。

瞭解詳情

Samuel Zeller 撰寫的主頁橫幅