WebView2 与 Electron
在过去的几周里,我们收到了几个关于新的 WebView2 和 Electron 之间区别的问题。
两个团队都有一个明确的目标,那就是让 Web 技术在桌面上发挥出最佳水平,并且正在讨论进行一次全面的共享比较。
Electron 和 WebView2 都是快速发展和不断演进的项目。我们整理了 Electron 和 WebView2 截至目前的异同点的简要快照。
架构概述
Electron 和 WebView2 都基于 Chromium 源代码构建,用于渲染网页内容。严格来说,WebView2 基于 Edge 源代码构建,而 Edge 是基于 Chromium 源代码的一个分支构建的。Electron 不与 Chrome 共享任何 DLL。WebView2 二进制文件会硬链接到 Edge(截至 Edge 90 为稳定版),因此它们会共享磁盘空间和部分工作集。有关更多信息,请参阅 Evergreen distribution mode。
Electron 应用始终会捆绑和分发开发时使用的确切 Electron 版本。WebView2 在分发方面有两种选择。您可以捆绑应用程序开发时使用的确切 WebView2 库,也可以使用可能已安装在系统上的共享运行时版本。WebView2 为每种方法都提供了工具,包括在共享运行时缺失时使用的引导安装程序。WebView2 自 Windows 11 起已作为“内置”组件提供。
捆绑框架的应用程序负责更新这些框架,包括次要安全更新。对于使用共享 WebView2 运行时的应用程序,WebView2 有自己的更新程序,类似于 Chrome 或 Edge,它独立于您的应用程序运行。与 Electron 一样,更新应用程序代码或任何其他依赖项仍然是开发者的责任。Windows Update 不管理 Electron 或 WebView2。
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、模块或原生 Node 插件。WebView2 应用程序不假定您的应用程序的其他部分是用何种语言或框架编写的。您的 JavaScript 代码必须通过应用程序主机进程代理任何操作系统访问。
Electron 致力于保持与 Web API 的兼容性,包括从 Fugu Project 开发的 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 构建的应用程序创建了 脚手架,有兴趣的人可以研究潜在的性能差异。
在渲染网页内容之外,存在一些差异,来自 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 使用 结构化克隆算法。利用此 API 的应用程序可以避免在进程之间发送对象时支付 JSON 序列化的费用。
总结
Electron 和 WebView2 之间存在许多差异,但在渲染 Web 内容的性能方面,您不必期望有太大区别。归根结底,应用程序的架构和 JavaScript 库/框架对内存和性能的影响比其他任何因素都大,因为“Chromium 就是 Chromium”,无论它在哪里运行。
特别感谢 WebView2 团队审阅了这篇博文,并确保我们对 WebView2 架构有最新的认识。他们欢迎就该项目提出任何 反馈。