在过去的几周里,我们收到了关于新的 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 为每种方法提供工具,包括在共享运行时丢失时的引导安装程序。WebView2 从 Windows 11 开始内置发货。
捆绑其框架的应用程序负责更新这些框架,包括次要安全版本。对于使用共享 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、模块或 node-native-addon。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 架构有一个最新的了解。他们欢迎任何 关于该项目的反馈。