我們會逐步變更預設值,逐漸淘汰 unload
事件,讓 unload
處理常式停止在網頁上觸發,除非網頁明確選擇重新啟用。
淘汰時間表
我們在 2019 年 1 月宣布實作往返快取的意圖時,先前開始載入卸載行為可能有所變動。在實作工作的同時,我們進行了大規模外聯,導致卸載使用量大幅下降。為了加強宣傳效果,我們也開始提供方法,測試淘汰 Chrome 115 版中卸載的影響:
- 在 Chrome 115 版中 (2023 年 7 月) 透過 Permission-Policy API 卸載權限政策執行異常測試
- 在 Chrome 117 (2023 年 9 月) 中啟用旗標,即可進行本機測試
在接下來的推廣和試用階段,以下是我們預計階段性淘汰的方式:
- 限定範圍的階段,前 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
活動的外觀。這可讓網站判斷是否使用此事件 (不論是用自己的程式碼或透過程式庫),這些事件都可能受到即將淘汰的影響。
Chrome 開發人員工具
Chrome 開發人員工具提供 back-forward-cache
稽核功能,可協助您找出可能導致網頁無法使用往返快取的問題 (包括使用 unload
處理常式)。
如要測試往返快取,請按照下列步驟操作:
在網頁上開啟開發人員工具,依序前往「應用程式」 >「背景服務」 >「往返快取」。
按一下「測試往返快取」Chrome 會自動將你前往
chrome://terms/
並返回網頁。或者,您也可以按一下瀏覽器的「上一頁」和「下一頁」按鈕。
如果您的網頁不適用往返快取,「往返快取」分頁會顯示問題清單。在「可操作」下方,您可以查看是否使用 unload
:
Reporting API
Reporting API 可與唯讀權限政策搭配使用,偵測網站使用者的 unload
使用情形。
Bfcache notRestoredReasons
API
在 PerformanceNavigationTiming
類別中新增 notRestoredReasons
屬性後,系統會回報文件是否禁止使用 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
處理常式已遭淘汰。長期以來,這個 API 並不可靠,也不保證會在文件遭到刪除時觸發。此外,unload
處理常式與 bfcache 不相容。
目前使用 unload
處理常式的網站應為即將到來的淘汰作業做好準備,例如測試任何現有的 unload
處理常式、移除或遷移處理常式,或者,如果可行,也可以延後淘汰作業。
特別銘謝
感謝 Kenji Baheux、Fergal Daly、Adriana Jara 和 Jeremy Wagner 協助審查這篇文章。
主頁橫幅由 Anja Bauermann 於 Unsplash 網站上提供