WebView2 和 Electron
在过去的几周里,我们收到了几个关于新 WebView2 和 Electron 之间区别的问题。
两个团队都表达了让网络技术在桌面上发挥最佳作用的目标,并且正在讨论共享的全面比较。
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 Update 管理的。
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 |
性能讨论
在渲染您的网页内容时,我们预计 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 利用结构化克隆算法。在进程之间发送对象时,利用此技术的应用程序可以避免支付 JSON 序列化税。
总结
Electron 和 WebView2 有许多差异,但不要期望它们在渲染网页内容方面的性能有太大差异。最终,应用程序的架构和 JavaScript 库/框架对内存和性能的影响比其他任何因素都大,因为无论它在哪里运行,Chromium 就是 Chromium。
特别感谢 WebView2 团队审阅这篇文章,并确保我们对 WebView2 架构有最新的了解。他们欢迎任何关于该项目的反馈。