淘汰卸載事件

我們會逐步變更預設值,逐漸淘汰 unload 事件,讓 unload 處理常式停止在網頁上觸發,除非網頁明確選擇重新啟用。

淘汰時間表

我們在 2019 年 1 月宣布實作往返快取的意圖時,先前開始載入卸載行為可能有所變動。在實作工作的同時,我們進行了大規模外聯,導致卸載使用量大幅下降。為了加強宣傳效果,我們也開始提供方法,測試淘汰 Chrome 115 版中卸載的影響:

在接下來的推廣和試用階段,以下是我們預計階段性淘汰的方式:

  • 限定範圍的階段,前 50 大熱門網站的卸載作業將逐漸停止運作 (在本文撰寫期間即參閱參考資料)。
    • 自 Chrome 120 起的 1% 使用者 (2023 年 11 月底) 起。
    • 在 2024 年第 3 季結束前,於 100% 的使用者結束遷移作業
  • 此外,自 2024 年第 3 季起,我們將進入一般階段,也就是在 2025 年第 1 季結束前,從 1% 的使用者開始,並逐漸停止在所有網站上執行卸載。

請注意,我們也提供停用選項選單,以防這個預告時程無法提供足夠的時間停用卸載。我們的目標是透過軟性淘汰,通知最後階段 (強制淘汰卸載) 的時間表,屆時這些停用停用選項將遭到移除或減少。

卸載淘汰時間表。

背景

unload」是專為在卸載文件時啟動。理論上,每次使用者離開網頁時,或結束時的工作階段回呼,都可以執行程式碼。

此事件最常使用的情況包括:

  • 儲存使用者資料:先儲存資料再離開網頁。
  • 執行清除工作:先關閉已開啟的資源,再捨棄頁面。
  • 傳送數據分析:在工作階段結束時傳送與使用者互動的相關資料。

不過,unload 事件非常不可靠

在 Chrome 和 Firefox 電腦版中,unload 相當可靠,但會禁止使用 bfcache (往返快取),進而對網站效能造成負面影響。

在行動瀏覽器上,unload 通常無法執行,因為分頁經常在背景執行,之後隨即終止。因此,瀏覽器選擇優先處理行動版網站的 Bfcache,速度超過 unload。Safari 也會在電腦上使用這項行為。

Chrome 團隊認為,在電腦上透過 unload 優先採用 bfcache 優先要優先採用的做法會帶來負面影響。這在 Chrome (和 Firefox) 的運作上並不穩定,因此會變得不太穩定。Chrome 的目標是徹底移除 unload 事件。在此之前,明確選擇不採用這項淘汰作業的使用者仍可在電腦上使用該服務。

為什麼要淘汰 unload 事件?

要更全面地瞭解目前的網路環境,淘汰 unload 是相當重要的一步。unload 事件提供的了一個對應用程式生命週期的誤解,這對於我們越來越難以在現代運算環境中瀏覽網路的情況感到陌生。

行動作業系統經常凍結或卸載網頁,以節省記憶體,而電腦版瀏覽器現在執行此作業也越來越多。即使沒有作業系統介入,使用者仍經常切換分頁並終止舊分頁,且不會正式「離開頁面」。

移除 unload 事件是瞭解到,網頁程式開發人員必須確保典型的模式與實際世界相符,而非仰賴不再真實的過時概念。

unload 事件的替代方案

與其使用 unload,建議您改用:

  • visibilitychange:用於判斷頁面瀏覽權限變更的時間。當使用者切換分頁、將瀏覽器視窗最小化或開啟新網頁時,就會發生這類事件。考慮最後的 hidden 狀態儲存應用程式和使用者資料。
  • pagehide:判斷使用者是否已離開頁面。當使用者離開網頁、重新載入網頁或關閉瀏覽器視窗時,就會發生這個事件。如果頁面只是最小化或切換至其他分頁,則不會觸發 pagehide 事件。請注意,由於 pagehide 不會讓網頁不符合往返快取的資格,因此網頁可能會在這類事件發生後還原網頁。如要清除這個事件中的任何資源,還原頁面可能需要還原這些資源。

beforeunload 事件的用途與 unload 稍有不同,因為這是可取消的事件。使用者離開網頁時,常用於警告使用者尚未儲存的變更。此外,如果終止背景分頁,系統不會觸發這個事件,因此無法執行。建議您限制使用 beforeunload,且只在有條件的情況下新增。請改用上述事件來取代大部分的 unload

詳情請參閱不使用 unload 處理常式的建議

偵測 unload 的使用情形

有許多工具可協助您在網頁上找出 unload 活動的外觀。這可讓網站判斷是否使用此事件 (不論是用自己的程式碼或透過程式庫),這些事件都可能受到即將淘汰的影響。

燈塔

Lighthouseno-unload-listeners 稽核,會在網頁中的任何 JavaScript (包括第三方程式庫) 新增 unload 事件監聽器時警告開發人員。

Lighthouse 稽核功能顯示使用中的卸載處理常式

Chrome 開發人員工具

Chrome 開發人員工具提供 back-foward-cache 稽核功能,可協助您找出可能導致網頁無法使用往返快取的問題 (包括使用 unload 處理常式)。

如要測試往返快取,請按照下列步驟操作:

  1. 在網頁上開啟開發人員工具,依序前往「應用程式」 >「背景服務」 >「往返快取」

  2. 按一下「測試往返快取」Chrome 會自動將你前往 chrome://terms/ 並返回網頁。或者,您也可以按一下瀏覽器的「上一頁」和「下一頁」按鈕。

如果您的網頁不適用往返快取,「往返快取」分頁會顯示問題清單。在「可操作」下方,您可以查看是否使用 unload

Chrome 開發人員工具往返快取測試工具,顯示使用了卸載處理常式

Reporting API

Reporting API 可用於在唯讀權限政策中運作,偵測網站使用者的 unload 使用情形。

詳情請參閱使用 Reporting API 尋找卸載

Bfcache notRestoredReasons API

PerformanceNavigationTiming 類別中新增 notRestoredReasons 屬性後,系統會回報文件是否禁止使用 bfcache 進行瀏覽,以及原因。如需使用操作說明,請前往這裡。以下是現有 unload 事件監聽器的回應物件警告範例:

{
   blocked: true,
   children: [],
   id: "",
   name: "",
   reasons: [ "Internal Error", "Unload handler" ],
   src: "",
   url: "a.com"
}

控管「unload」的存取權

Chrome 將逐步淘汰 unload 事件。在此期間,您可以使用不同工具控管這種行為,為即將到來的淘汰作業做好準備。請切記,您不應長期仰賴這些技術,您應該盡快規劃改用替代方案。

下列選項可讓您啟用或停用 unload 處理常式來測試網站在沒有這類處理常式的情況下的運作方式,為即將到來的淘汰作業做好準備。以下為不同類型的政策:

  • 權限政策:這個平台 API 可讓網站擁有者使用 HTTP 標頭,控管網站或個別網頁層級的功能存取權。
  • 企業政策:適用於 IT 管理員為機構或企業設定 Chrome 的工具。您可透過管理面板進行設定,例如 Google 管理控制台
  • Chrome 旗標:可讓個別開發人員變更 unload 淘汰設定,測試對各種網站的影響。

權限政策

Chrome 115 版新增了權限政策,可讓網站選擇不使用 unload 處理常式,並立即享有 bfcache 改善網站效能。請參閱這些範例,瞭解如何為網站設定此屬性。這可讓網站在 unload 淘汰前提前做好準備。

這項機制將在 Chrome 117 版中擴充,讓網站可以反向觸發,也能選擇繼續嘗試觸發 unload 處理常式,因為 Chrome 會變更這些處理常式的預設設定,日後不會觸發。請參閱這些範例,瞭解如何繼續允許您的網站觸發卸載處理常式。這項啟用設定不會永遠保持不變,並應留出時間讓網站從 unload 處理常式中遷出。

企業政策

如果企業使用的軟體仰賴 unload 事件才能正常運作,則可以使用 ForcePermissionPolicyUnloadDefaultEnabled 政策,避免將受控制的裝置逐步淘汰。啟用這項政策後,所有來源的 unload 仍會預設為啟用。即使網頁有需要,可能還是會設定更嚴格的政策。如同「選擇不採用權限政策」,這項工具可減少潛在的破壞性變更,但不應無限期使用。

Chrome 旗標和指令列切換按鈕

除了企業政策外,您也可以透過 Chrome 旗標和指令列命令停止針對個別使用者執行淘汰作業:

如果將 chrome://flags/#deprecate-unload 設為 enabled,系統將繼續進行淘汰的預設值,並阻止 unload 處理常式觸發。您還是可以透過權限政策逐一覆寫個別網站的設定,但預設會繼續預設啟用。

這些設定也可以透過指令列切換鈕控管。

選項比較

下表歸納了上述選項的不同用途:

逐步淘汰 逐步淘汰淘汰項目 (例外情況除外) 防止淘汰作業達到安全遷移時間
權限政策
(適用於頁面/網站)
企業政策
(適用於裝置)
Chrome 旗標
(適用於個別使用者)
不可
Chrome 指令列切換選項
(適用於個別使用者)

結論

unload 處理常式已遭淘汰。長期以來,這個 API 並不可靠,也不保證會在文件遭到刪除時觸發。此外,unload 處理常式與 bfcache 不相容。

目前使用 unload 處理常式的網站應為即將到來的淘汰作業做好準備,例如測試任何現有的 unload 處理常式、移除或遷移處理常式,或者,如果可行,也可以延後淘汰作業。

特別銘謝

感謝 Kenji Baheux、Fergal Daly、Adriana Jara 和 Jeremy Wagner 協助審查這篇文章。

主頁橫幅由 Anja BauermannUnsplash 網站上提供