淘汰卸載事件

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

淘汰時間表

我們曾在 2019 年 1 月宣布意圖實作返回/前進快取,當時就指出卸載行為可能會有所變更。除了實施相關措施,我們也進行了廣泛的宣導活動,導致卸載用量大幅下降。為了補足這項說明,我們也開始提供測試方法,讓開發人員測試淘汰 Chrome 115 後的效果:

在完成這些接觸和試用階段後,我們預計會推出軟性淘汰功能:

  • 在這個階段,系統會逐步停止為前 50 個熱門網站執行卸載作業 (參考資料,截至本文撰寫時為止)。
    • 從 Chrome 120 開始,先對 1% 的使用者測試 (2023 年 11 月底)。
    • 2024 年第 3 季結束時,所有使用者都會停用第三方 Cookie
  • 此外,我們預計從 2024 年第 3 季開始,在任何網站上逐步停用 unload 功能,並從 1% 的使用者開始,在 2025 年第 1 季結束前擴大到 100% 的使用者。

請注意,如果這項軟性淘汰的時間表無法提供足夠的時間,讓您從卸載作業中移除,我們也提供停用選項選單。我們的目標是利用這項軟淘汰功能,讓您瞭解最後階段 (卸載功能的硬淘汰) 的時間表,屆時我們將移除或減少這些選擇退出項目。

卸載淘汰時間表。

背景

unload 的設計目的是在文件卸載時觸發。理論上,您可以在使用者離開網頁時執行程式碼,或將其用於工作階段結束的回呼。

這個事件最常見的使用情境包括:

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

不過,unload 事件非常不可靠

在 Chrome 和 Firefox 桌面版上,unload 的穩定性相當高,但會禁止使用 bfcache (往返快取),對網站效能造成負面影響。

在行動瀏覽器上,由於分頁經常會進入背景並遭到終止,因此 unload 通常不會執行。因此,瀏覽器會將 bfcache 優先於 unload,讓 unload 變得更加不可靠。Safari 在電腦上也會採用這項行為。

Chrome 團隊認為,在電腦上使用行動版模式 (將 bfcache 優先於 unload)會造成干擾,因為這會使 bfcache 的穩定性降低,而這項功能在 Chrome (和 Firefox) 中先前是相當穩定的。相反地,Chrome 的目標是完全移除 unload 事件。在此之前,如果使用者明確選擇不採用淘汰計畫,則在電腦上仍可正常使用這項功能。

為什麼要淘汰 unload 事件?

淘汰 unload 是我們在當今網路環境中,更廣泛實現這項功能的重要一步。unload 事件會讓您誤以為可以控制應用程式生命週期,但這與我們在現代電腦世界中瀏覽網頁的方式越來越不相符。

行動作業系統經常會凍結或卸載網頁,以節省記憶體空間,而電腦版瀏覽器也因同樣原因,越來越常這樣做。即使沒有作業系統介入,使用者也會經常切換分頁並關閉舊分頁,而不會正式「離開」網頁。

移除已淘汰的 unload 事件,是為了讓我們這些網頁開發人員確保我們的架構與現實世界一致,並避免依賴已淘汰的概念 (如果有)。

unload 事件的替代方案

建議您改用以下方法,而非 unload

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

beforeunload 事件的用途與 unload 略有不同,因為它是可取消的事件。這項功能通常會在使用者離開頁面時,提醒他們未儲存的變更。這項事件也不可靠,因為如果背景分頁遭到終止,這項事件就不會觸發。建議您限制 beforeunload 的使用,並只在特定條件下新增。請改為使用上述事件取代大部分 unload

詳情請參閱這篇文章,瞭解為何不應使用 unload 處理常式。

偵測 unload 的使用情形

您可以使用各種工具,找出網頁上出現的 unload 事件。這可讓網站瞭解是否使用這個事件 (無論是在自己的程式碼中或透過程式庫),因此可能會受到即將淘汰的事件影響。

Chrome 開發人員工具

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

如要測試回溯/前進快取,請按照下列步驟操作:

  1. 在頁面上開啟「DevTools」,然後依序前往「Application」 >「Background services」 >「Back/forward cache」

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

如果網頁不符合往返快取的使用資格,系統會在「往返快取」分頁中列出問題。在「可採取行動」下方,您可以查看是否使用 unload

Chrome 開發人員工具的「Back/forward cache」測試工具顯示已使用卸載處理常式

Reporting API

Reporting API 可與唯讀權限政策搭配使用,用於偵測網站使用者是否使用 unload

詳情請參閱「使用 Reporting API 找出卸載作業

Bfcache notRestoredReasons API

notRestoredReasons 屬性已新增至 PerformanceNavigationTiming 類別,可回報文件是否在導覽時遭到 bfcache 封鎖,以及原因。如需使用說明,請參閱這篇文章。以下是現有 unload 事件監聽器的回應物件警告範例:

{
   children: [],
   id: null,
   name: null,
   reasons: [
     {"reason", "unload-handler"}
   ],
   src: null,
   url: "https://www.example.com/page/"
}

控管 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 處理常式即將淘汰。這些事件已長時間不穩定,且無法保證在所有文件遭到銷毀的情況下都會觸發。此外,unload 處理程序與 bfcache 不相容。

目前使用 unload 處理常式的網站,應為即將淘汰的處理常式做好準備,例如測試現有的 unload 處理常式、移除或遷移這些處理常式,或是在需要更多時間時,延後淘汰作業。

特別銘謝

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

主頁橫幅圖片由 Anja Bauermann 提供,取自 Unsplash