在同網站環境之間共用 WebAssembly 模組,將僅限於相同來源。
在同網站但跨來源環境之間共用 WebAssembly (Wasm) 模組的功能將淘汰,以便長期將代理程式叢集範圍限定在來源。如果開發人員以這種方式使用 Wasm 模組,請務必在同源例項化這些模組,才能在 Chrome 95 後繼續使用。
什麼是 Wasm 模組?運作方式為何?
WebAssembly 程式會組織成模組,也就是部署、載入和編譯的單位。
在以下程式碼範例中,從 https://iframe.site.example 匯入的 Wasm 模組會透過 postMessage() 與 https://main.site.example 共用。請注意,這些網域屬於同一個網站,但來源不同。
https://iframe.site.example 上的 Wasm 模組:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
從 Chrome 95 開始,傳送端和接收端必須是相同來源。在上述情況下,https://iframe.site.example 必須是 https://main.site.example,反之亦然。
為什麼需要這麼做
Chrome 會在內部處理網站索引代理程式叢集上的不同文件、分頁和框架。這表示相同網站的文件會在同一個程序中處理 (具體運作方式因瀏覽器而異)。最近,Chrome 開始以更精細的單位 (來源) 處理這些資料。我們稱之為 origin-keyed 代理程式叢集。不過,由於這樣做會耗用大量資源,因此系統只會根據經驗法則,將來源鍵控代理程式叢集套用至部分網站。
我們預計將所有代理程式叢集預設為 origin-keyed。為此,我們必須限制需要網站鍵控來源叢集的功能:
- (僅限 Chrome) 您無法再將
SharedArrayBuffer或WebAssembly.Memory物件傳送至其他同網站跨來源頁面。這項功能自 Chrome 92 起已推出。 - 您無法再透過
postMessage()將WebAssembly.Module物件傳送至其他同站跨源網頁。以下將詳細說明這項異動。 - 您無法再設定
document.domain。這項舊版功能通常允許同網站跨源網頁同步存取彼此的 DOM,但在 origin-keyed 代理程式叢集中,這項功能會停用。
解決上述所有變更後,Chrome 預設會改用來源鍵控代理程式叢集。
如要進一步瞭解 origin-keyed 代理程式叢集,請參閱「使用 Origin-Agent-Cluster 標頭要求效能隔離」。
後續步驟與相關資源
為了讓 Chrome 預設使用來源鍵控代理程式叢集,我們會將 document.domain 設為唯讀。Chrome 團隊預計在 2022 年實施這項異動。
相片來源:Markus Winkler,發布於 Unsplash