在过去几周里,我们收到了许多关于新的WebView2 和 Electron 之间差异的问题。
这两个团队都明确表示,目标是使桌面上的 Web 技术达到最佳状态,并且正在讨论一个共享的全面比较。
Electron 和 WebView2 都是快速发展且不断演进的项目。我们汇集了 Electron 和 WebView2 在今天存在的相似之处和差异的简要快照。
架构概述
Electron 和 WebView2 都从 Chromium 源代码构建以渲染 Web 内容。严格来说,WebView2 从 Edge 源代码构建,但 Edge 是使用 Chromium 源代码的分支构建的。Electron 不与 Chrome 共享任何 DLL。WebView2 二进制文件与 Edge(截至 Edge 90 的稳定通道)进行硬链接,因此它们共享磁盘和一些工作集。有关更多信息,请参阅常青分发模式。
Electron 应用程序始终捆绑并分发其开发所使用的 Electron 的确切版本。WebView2 在分发方面有两个选项。您可以捆绑应用程序开发所使用的确切 WebView2 库,或者您可以使用系统上可能已存在的共享运行时版本。WebView2 为每种方法提供工具,包括在缺少共享运行时的情况下提供引导安装程序。从 Windows 11 开始,WebView2 将随系统提供。
捆绑其框架的应用程序负责更新这些框架,包括次要的安全版本。对于使用共享 WebView2 运行时的应用程序,WebView2 具有自己的更新程序(类似于 Chrome 或 Edge),该更新程序独立于您的应用程序运行。更新应用程序的代码或其任何其他依赖项仍然是开发者的责任,与 Electron 相同。Electron 和 WebView2 都不由 Windows 更新管理。
Electron 和 WebView2 都继承了 Chromium 的多进程架构,即一个主进程与一个或多个渲染器进程通信。这些进程与系统上运行的其他应用程序完全隔离。每个 Electron 应用程序都是一个单独的进程树,包含一个根浏览器进程、一些实用程序进程和零个或多个渲染进程。使用相同用户数据文件夹 的 WebView2 应用程序(如应用程序套件将执行的操作)共享非渲染器进程。使用不同数据文件夹的 WebView2 应用程序不共享进程。
-
ElectronJS 进程模型
-
基于 WebView2 的应用程序进程模型
在此处阅读有关WebView2 的进程模型 和Electron 的进程模型 的更多信息。
Electron 提供了用于常见桌面应用程序需求的 API,例如菜单、文件系统访问、通知等。WebView2 是一个组件,旨在集成到应用程序框架中,例如 WinForms、WPF、WinUI 或 Win32。WebView2 不会通过 JavaScript 提供 Web 标准之外的操作系统 API。
Node.js 集成到 Electron 中。Electron 应用程序可以使用渲染器和主进程中的任何 Node.js API、模块或节点原生插件。WebView2 应用程序不假设应用程序的其余部分是用哪种语言或框架编写的。您的 JavaScript 代码必须通过应用程序主机进程代理任何操作系统访问。
Electron 努力保持与 Web API 的兼容性,包括从Fugu 项目 开发的 API。我们有Electron 的 Fugu API 兼容性快照。WebView2 维护着类似的Edge API 差异列表。
Electron 具有用于 Web 内容的可配置安全模型,从完全访问到完全沙箱。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 |
在渲染 Web 内容方面,我们预计 Electron、WebView2 和任何其他基于 Chromium 的渲染器之间几乎没有性能差异。我们为那些有兴趣调查潜在性能差异的人创建了使用 Electron、C++ + WebView2 和 C# + WebView2 构建的应用程序的脚手架。
在Web 内容渲染之外,还有一些差异会发挥作用,来自 Electron、WebView2、Edge 和其他团队的人员都表达了对进行详细比较(包括 PWA)的兴趣。
进程间通信 (IPC)
有一点差异我们希望立即强调,因为我们认为它通常是 Electron 应用程序中的性能考虑因素。
在 Chromium 中,浏览器进程充当沙箱化渲染器与系统其余部分之间的 IPC 代理。虽然 Electron 允许使用非沙箱化渲染进程,但许多应用程序选择启用沙箱以增强安全性。WebView2 始终启用沙箱,因此对于大多数 Electron 和 WebView2 应用程序,IPC 都会影响整体性能。
即使 Electron 和 WebView2 具有相似的进程模型,底层的 IPC 也不同。在 JavaScript 和 C++ 或 C# 之间进行通信需要编组,最常见的是编组为 JSON 字符串。JSON 序列化/解析是一项昂贵的操作,IPC 瓶颈会对性能产生负面影响。从 Edge 93 开始,WV2 将使用CBOR 用于网络事件。
Electron 通过MessagePorts API 支持任意两个进程之间的直接 IPC,该 API 利用结构化克隆算法。利用此功能的应用程序可以在进程之间发送对象时避免支付 JSON 序列化税。
Electron 和 WebView2 有许多差异,但不要期望它们在渲染 Web 内容方面的性能有很大差异。最终,应用程序的架构和 JavaScript 库/框架对内存和性能的影响大于其他任何因素,因为无论 Chromium 在哪里运行,它都是Chromium。
特别感谢 WebView2 团队审查这篇文章,并确保我们对 WebView2 架构有最新的了解。他们欢迎任何关于该项目的反馈。