延長生命週期的共用工作人員來源試用

發布日期:2025 年 7 月 31 日

從 Chrome 139 開始,參與延長生命週期的共用工作者全新原始碼試用活動。試用版新增 extendedLifetime: true 選項,讓共用工作站在最後一個文件卸載後繼續運作。

延長使用期限功能適用情境

許多網站都希望在使用者離開頁面時執行某些工作。例如寫入儲存空間,或將資料傳回伺服器,以儲存狀態或記錄數據分析。

網路平台提供幾項 API 來處理部分較簡單的用途,但各有其限制:

  • 系統會先執行同步 JavaScript API (例如 localStorage 寫入),再卸載目前網頁。
  • fetch API 提供多種選項,例如 keepalive,以及最近推出的 fetchLater,可讓傳送要求在文件卸載後的一小段時間內繼續存在。

不過,這些只涵蓋同步工作,最後的 fetch 要求除外。不允許使用非同步 API (例如 IndexedDBCompression StreamsWeb Crypto) 進行雜湊或加密。許多 API (尤其是較新的 API) 都是非同步,可避免封鎖主執行緒,因此無法在卸載時使用這些 API 是一項限制。

替代做法是使用服務工作人員,這類工作人員位於個別網頁生命週期之外。不過,這項解決方案相當耗用資源,開發人員需要滿足更複雜的生命週期和管理需求,使用者也需要額外的程序和記憶體。這也不符合服務工作站的主要用途 (做為網路要求的 Proxy)。如果只是為了在網頁卸載時完成某些工作,使用完整的 Service Worker 似乎有點過度。

建議採行的解決方案

SharedWorker API 是一種較輕量的 API,可用於卸載主執行緒的工作。不過,目前這些工作階段不會超過來源的生命週期 (也就是卸載該來源的最後一個頁面時)。Chrome 建議在 SharedWorker API 中新增選項,讓共用工作者在文件毀損後的一小段時間內繼續運作。

HTML 標準已鼓勵實作項目在卸載文件後,讓共用工作站維持運作一小段時間,這樣在相同來源的網頁之間導覽時,就不會終止並重新建立共用工作站。延長生命週期提案只是建議,即使使用者未前往同源目的地,使用者代理程式也應將共用工作站保留一段時間,以便完成非同步工作。

這項提案的目的是允許共用工作站在最後一個文件卸載後繼續運作,時間長度與伺服器工作站的閒置時間相同,也就是 Chrome 的 30 秒。請注意,如果是共用工作站,這是卸載後的生命週期上限,而非閒置時間。也就是說,30 秒的限制是從卸載開始計算,而不是從閒置時間開始計算。如果工作已開始,但未在該時間範圍內完成,系統就會取消工作。

啟用延長使用期限

如要為使用者在網站上啟用這項功能,請註冊原始碼試用計畫,取得延長生命週期的共用工作站。或者,開發人員也可以使用 chrome://flags/#enable-experimental-web-platform-features 旗標,在自己的瀏覽器中啟用這項功能。

範例程式碼

選擇加入試用或啟用功能旗標後,請按照下列步驟啟用延長生命週期:

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

由於共用工作站也支援 Blob,因此無需使用其他指令碼即可啟用這項功能。舉例來說,如要將資料寫入 IndexedDb:

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

我們也提供範例應用程式:https://sharedworker-extendedlifetime.netlify.app/。重新載入網頁 (或在 30 秒內關閉並重新開啟) 時,系統仍會提供先前的計算結果。

您可以在 chrome://inspect/#workers 查看網站的共用工作人員,我們很快就會強化這項功能,顯示是否使用了 extendedLifetime 選項。網頁卸載後,這個頁面也會繼續顯示延長生命週期的共用 Worker 30 秒。

提供意見

我們期待收到您對延長生命週期共用工作人員來源試用的意見。

我們正在 GitHub 上討論 API 形式,並提供更詳細的技術說明

如要對 Chrome 的實作方式提供意見,請回報 Chromium 錯誤