WebView2 和 Electron
過去幾週,我們收到了一些關於新的 WebView2 和 Electron 之間差異的問題。
兩個團隊都表達了讓網路技術在桌面上達到最佳狀態的目標,並且正在討論共享的全面比較。
Electron 和 WebView2 都是快速發展且不斷演進的專案。我們整理了 Electron 和 WebView2 之間目前存在的相似之處和差異的簡要快照。
架構概述
Electron 和 WebView2 都是從 Chromium 原始碼建置,用於呈現網頁內容。嚴格來說,WebView2 是從 Edge 原始碼建置,但 Edge 是使用 Chromium 原始碼的分支建置的。Electron 不與 Chrome 共用任何 DLL。WebView2 二進位檔與 Edge (截至 Edge 90 的穩定通道) 硬連結,因此它們共用磁碟和部分工作集。請參閱 Evergreen 發佈模式 以取得更多資訊。
Electron 應用程式始終捆綁並發佈它們開發時所使用的確切 Electron 版本。WebView2 在發佈時有兩個選項。您可以捆綁您的應用程式開發時所使用的確切 WebView2 程式庫,也可以使用系統中可能已存在的共用執行階段版本。WebView2 為每種方法提供工具,包括在遺失共用執行階段時使用的引導安裝程式。WebView2 從 Windows 11 開始隨附在收件匣中。
捆綁其架構的應用程式負責更新這些架構,包括次要安全性發佈。對於使用共用 WebView2 執行階段的應用程式,WebView2 有其自己的更新程式,類似於 Chrome 或 Edge,該更新程式獨立於您的應用程式執行。更新應用程式的程式碼或其任何其他相依性仍然是開發人員的責任,與 Electron 相同。Electron 和 WebView2 都不是由 Windows Update 管理。
Electron 和 WebView2 都繼承了 Chromium 的多程序架構,即單一主程序與一個或多個渲染程序通訊。這些程序完全獨立於系統上執行的其他應用程式。每個 Electron 應用程式都是一個獨立的程序樹狀結構,包含一個根瀏覽器程序、一些公用程式程序和零個或多個渲染程序。使用相同使用者資料夾的 WebView2 應用程式 (例如一組應用程式),會共用非渲染程序。使用不同資料夾的 WebView2 應用程式不共用程序。
-
ElectronJS 程序模型
-
基於 WebView2 的應用程式程序模型
在此處閱讀更多關於 WebView2 的程序模型 和 Electron 的程序模型。
Electron 提供用於常見桌面應用程式需求的 API,例如選單、檔案系統存取、通知等等。WebView2 是一個元件,旨在整合到 WinForms、WPF、WinUI 或 Win32 等應用程式架構中。WebView2 不提供透過 JavaScript 的網路標準以外的作業系統 API。
Node.js 已整合到 Electron 中。Electron 應用程式可以使用渲染程序和主程序中的任何 Node.js API、模組或 Node 原生附加元件。WebView2 應用程式不假設您應用程式的其餘部分是用哪種語言或架構編寫的。您的 JavaScript 程式碼必須透過應用程式主機程序代理任何作業系統存取。
Electron 致力於維護與網路 API 的相容性,包括從 Fugu 專案開發的 API。我們有 Electron Fugu API 相容性的快照。WebView2 維護類似的 與 Edge 的 API 差異清單。
Electron 為網頁內容提供可設定的安全性模型,從完整存取到完整沙盒。WebView2 內容始終在沙盒中。Electron 有關於選擇安全性模型的全面安全性文件。WebView2 也有安全性最佳實務。
Electron 原始碼在 GitHub 上維護和提供。應用程式可以修改並建構它們自己的 Electron 品牌。WebView2 原始碼在 GitHub 上不可用。
快速摘要
Electron | WebView2 | |
---|---|---|
建置相依性 | Chromium | Edge |
原始碼在 GitHub 上可用 | 是 | 否 |
共用 Edge/Chrome DLL | 否 | 是 (截至 Edge 90) |
應用程式之間的共用執行階段 | 否 | 選用 |
應用程式 API | 是 | 否 |
Node.js | 是 | 否 |
沙盒 | 選用 | 永遠 |
需要應用程式架構 | 否 | 是 |
支援的平台 | Mac、Win、Linux | Win (計劃支援 Mac/Linux) |
應用程式之間的程序共用 | 絕不 | 選用 |
架構更新由以下管理 | 應用程式 | WebView2 |
效能討論
在呈現您的網頁內容時,我們預期 Electron、WebView2 和任何其他基於 Chromium 的渲染器之間的效能差異很小。我們為有興趣研究潛在效能差異的人員建立了 使用 Electron、C++ + WebView2 和 C# + WebView2 建置的應用程式的支架。
在呈現網頁內容之外還有一些差異會發揮作用,而來自 Electron、WebView2、Edge 和其他方面的相關人員已表示有興趣合作進行詳細比較,包括 PWA。
程序間通訊 (IPC)
我們想要立即強調一個差異,因為我們認為這通常是 Electron 應用程式的效能考量。
在 Chromium 中,瀏覽器程序充當沙盒化渲染器和系統其餘部分之間的 IPC 代理。雖然 Electron 允許未沙盒化的渲染程序,但許多應用程式選擇啟用沙盒以提高安全性。WebView2 始終啟用沙盒,因此對於大多數 Electron 和 WebView2 應用程式而言,IPC 可能會影響整體效能。
儘管 Electron 和 WebView2 有相似的進程模型,但底層的 IPC (進程間通訊) 機制不同。在 JavaScript 和 C++ 或 C# 之間進行通訊需要進行封送處理 (marshalling),最常見的是轉換成 JSON 字串。JSON 的序列化/解析是一個耗費資源的操作,而 IPC 瓶頸可能會對效能產生負面影響。從 Edge 93 開始,WV2 將針對網路事件使用 CBOR。
Electron 透過 MessagePorts API,在任意兩個進程之間支援直接 IPC,該 API 利用結構化複製演算法 (structured clone algorithm)。應用程式若能善用此機制,在進程之間傳送物件時,便可避免 JSON 序列化的開銷。
總結
Electron 和 WebView2 有許多差異,但在渲染網頁內容的效能方面,不應期望有太大的差異。最終,應用程式的架構和 JavaScript 函式庫/框架對於記憶體和效能的影響比其他任何因素都大,因為無論在何處執行,Chromium 就是 Chromium。
特別感謝 WebView2 團隊審閱本文,並確保我們對 WebView2 架構有最新的了解。他們歡迎針對該專案提供任何意見回饋。