使用擴充訊息通訊埠的 BFCache 行為變更

往返快取 (或 BFCache) 是一種瀏覽器最佳化功能,可以提供即時往返瀏覽。我們即將變更 Chrome BFCache,使用訊息通訊埠可能會影響擴充功能。如果你擁有的 Chrome 擴充功能會使用訊息功能,在內容指令碼和擴充功能之間進行通訊,請繼續閱讀下文,瞭解如何測試及調整擴充功能。

擴充功能訊息通訊埠

擴充功能會透過訊息傳遞,與內容指令碼或其他擴充功能進行通訊。您可以使用一次性要求來傳送訊息,方法是呼叫 runtime.sendMessage()tabs.sendMessage(),或是使用可重複使用的訊息通訊埠。只要連接埠處於啟用狀態,內容指令碼及擴充功能背景指令碼即可重複使用連接埠來互相發布訊息。

詳情請參閱「訊息傳遞」。

往返快取

離開符合 BFCache 資格的網頁時,瀏覽器會將網頁所有狀態保留在記憶體中,但處於非「完全啟用」狀態。如果使用者對快取網頁執行記錄瀏覽 (返回或前進),瀏覽器會嘗試從 BFCache 還原網頁。這樣不但能加快瀏覽速度,還能改善使用者的瀏覽體驗。

當網頁位於 BFCache 時,尚處於凍結狀態,不允許任何 JavaScript 執行。因此無法處理收到的訊息。

詳情請參閱「往返快取」。

擴充功能訊息通訊埠對 BFCache 的影響

簡而言之,將訊息傳送至 BFCache 網頁的擴充功能可能會撤銷快取,並影響效能。

當含有開放式擴充功能訊息通訊埠的網頁儲存在 BFCache 中時,通訊埠會保持開啟。從 BFCache 網頁還原網頁後,擴充功能服務工作處理程序仍可使用之前的訊息通訊埠參照,將訊息張貼到內容指令碼中。

不過,如果擴充功能嘗試在網頁仍位於 BFCache 的網頁時,透過該訊息通訊埠傳送郵件,雖然處理常式已凍結,但是仍會傳送訊息,但不會完全傳送。擴充功能難以推斷及解決這種情況,因為將訊息排入佇列和捨棄訊息本身都有問題。

為避免遇到與郵件遺失相關的問題,在 Chrome 目前的導入方式中,Chrome 會從 BFCache 中清除代管網頁並捨棄訊息。如果使用者返回該頁面,網頁會重新載入,讓擴充功能設定新連線。

另一方面,此實作會限制可套用 BFCache 的情境,限制效能提升,特別是具有廣播或活動訊號機制會定期向所有連線傳送訊息的擴充功能。此外,由於擴充功能會在擴充功能傳送訊息至內容指令碼時觸發移除程序,網頁程式開發人員沒有任何方法可以防止自己的網頁遭到除名。

為提升整體效能,我們計劃推出全新的郵件通訊埠行為。

新行為:當網頁儲存在 BFCache 時,關閉訊息管道

從 Chrome 123 版開始,當具有開放擴充的訊息通訊埠的網頁儲存在 BFCache 中時,系統會從內容指令碼端主動關閉基礎訊息管道。因此,所有訊息通訊埠都會關閉,擴充功能也會收到 onDisconnect 事件。

頻道已關閉,因此進入 BFCache 的網頁不會傳送任何訊息。因此,系統不會因為有擴充功能而移除網頁。

即使網頁從 BFCache 還原網頁,已關閉的訊息管道也不會重新開啟。建議擴充功能作者採取的建議做法是監聽頁面生命週期事件,並在從 BFCache 還原網頁時設定新連線,如以下範例所示。

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

請前往第 474 問題,進一步瞭解不同瀏覽器代表人員的 WECG 討論內容

我是否受到影響?

在 Chrome 123 版中,您可以在旗標後方提供新行為,讓您可以測試程式碼。詳情請參閱時間表。請按照下列步驟測試擴充功能。請注意,此功能只是單純的測試,建議您啟用 Chrome 功能後執行一段時間,因為我們難以預測擴充功能中有哪些功能可能會造成問題。

  1. 確認 Chrome 版本至少為 123。在理想情況下,請使用 Chrome Canary 會有額外的警告,讓測試更加輕鬆。
  2. 使用以下標記啟動 Chrome:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. 前往沒有執行擴充功能可用 BFCache 的網頁 (例如某個簡單網站,例如 https://example.com/)。請按照 BFCache 教學課程操作,確認從 BFCache 已經還原這項作業。

  4. 安裝並啟用擴充功能,然後再次測試 BFCache 資格。您可以手動離開,等候一段時間,讓擴充功能在 BFCached 頁面張貼訊息後,再返回瀏覽頁面。

  5. 如果系統因清除作業而必須載入網頁 (而不是從 BFCache 網頁),而防止還原的問題為「ExtensionSentMessageToCachedFrame」,表示該擴充功能可能影響了擴充功能。

    在 Chrome Canary 124.0.6315.0 以上版本中,您也會在頁面上看到以下警告:

    系統無法從 BFCache 還原網頁時顯示警告。
    在網頁未從 BFCache 還原網頁時顯示警告。

確認擴充功能正在將訊息發布至 BFCache 頁面後,您就可以按照下列步驟強制啟用實驗,並觀察是否有任何邏輯故障。

  1. 使用以下標記啟動 Chrome:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. 前往因「ExtensionSentMessageToCachedFrame」而無法從 BFCache 還原的網頁。

  3. 離開並返回。網頁現在應可還原,但內容指令碼和 Service Worker 之間的訊息管道應會中斷。

  4. 測試擴充功能是否仍可正常運作,如果不行,您應按照上一節所述的方式手動重新連線。

發布時間表

我們計劃從 Chrome 123 開始逐步提高這項新行為。詳細計畫內容如下:

日期 預定里程碑
2 月 15 日 開始在 Chrome Canary 和開發人員版中進行實驗新行為。
3 月 1 日 在 Chrome Beta 版中對新行為進行實驗。
3 月 18 日 向 4% 的 Chrome 穩定版使用者發布新行為。
3 月 25 日 向 50% 的 Chrome 穩定版使用者發布新行為。
4 月 2 日 實驗結束,新行為將成為預設行為。