FetchEvent: preloadResponse 屬性

Baseline 已廣泛支援

此功能已經非常成熟,可在多種裝置和瀏覽器版本上使用。自 2022 年 4 月以來,它已在各大瀏覽器中得到支援。

注意:此功能僅在 Service Workers 中可用。

preloadResponseFetchEvent 介面的一個只讀屬性,它返回一個 Promise。如果觸發了導航預載入,則此 Promise 會解析為導航預載入的 Response;否則,它會解析為 undefined

如果啟用了導航預載入,請求是 GET 請求,並且該請求是導航請求(由瀏覽器在載入頁面和 iframe 時生成),則會觸發導航預載入。

服務工作執行緒可以在其 fetch 事件處理程式中等待此 Promise,以便跟蹤在服務工作執行緒啟動期間發出的 fetch 請求的完成情況。

一個 Promise,它解析為 Responseundefined

示例

此程式碼片段來自 使用導航預載入加速服務工作執行緒

onfetch 事件處理程式監聽 fetch 事件。當事件觸發時,處理程式呼叫 FetchEvent.respondWith(),將一個 Promise 返回給受控制的頁面。此 Promise 將使用請求的資源進行解析。

如果在 Cache 物件中存在匹配的 URL 請求,則程式碼返回從快取中獲取響應的 Promise。如果快取中未找到匹配項,則程式碼返回 preloadResponse 中的 Promise。如果不存在匹配的快取或預載入的響應,則程式碼從網路獲取響應並返回關聯的 Promise。

js
addEventListener("fetch", (event) => {
  event.respondWith(
    (async () => {
      // Respond from the cache if we can
      const cachedResponse = await caches.match(event.request);
      if (cachedResponse) return cachedResponse;

      // Else, use the preloaded response, if it's there
      const response = await event.preloadResponse;
      if (response) return response;

      // Else try the network.
      return fetch(event.request);
    })(),
  );
});

規範

規範
Service Workers
# fetch-event-preloadresponse

瀏覽器相容性

另見