WebView2 和 Electron
在过去几周中,我们收到了几个关于新 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、模块或节点原生插件。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 有许多不同之处,但不要期望它们在渲染网页内容方面有太大差异。最终,应用程序的架构和 JavaScript 库/框架对内存和性能的影响比其他任何因素都大,因为Chromium 始终是 Chromium,无论它运行在哪里。
特别感谢 WebView2 团队审阅本文,并确保我们对 WebView2 架构有最新的了解。他们欢迎任何关于该项目的反馈。