跳转到主要内容

2022 年谷歌编程之夏

·阅读时间 2 分钟

Electron 团队很高兴地宣布,我们今年将首次参加 Google Summer of Code!


什么是 Google Summer of Code?

Google Summer of Code (GSoC) 是一项年度指导计划,旨在将开源软件项目与潜在贡献者联系起来。以前该计划只对学生开放,但现在任何年满 18 岁的人都可以注册 GSoC。

更多信息,请查看 Summer of Code 主页

我该如何报名?

您有兴趣与 Electron 合作吗?如果您是开源新手或初级贡献者,我们欢迎您申请!

要被选为 Google Summer of Code 的 Electron 贡献者,您需要提交申请。申请将于 2022 年 4 月 4 日开始,并于 2022 年 4 月 19 日截止。您可以在 此处 关注 Google: Summer of Code 申请指南的更新。

想申请吗?首先,请查看我们准备的 五个项目构想草案。所有列出的构想目前都开放提案。我们也乐于接受不在提案项目列表中的新构想。

您的申请应包括:

  • 您的提案是一份书面文件,详细描述了您计划在夏季实现的目标。
  • 您的开发者背景。如果您有简历,请附上一份副本,否则请告诉我们您过去的经历,并重点说明相关的技术经验。

此处提供了关于提交 Electron 申请内容的详细指南。

您还可以阅读官方 GSoC 学生/贡献者指南,以获取准备提案的重要提示。

如果您想讨论项目提案或有任何问题,欢迎来我们的 #gsoc-general Discord 频道

参考资料

Electron 17.0.0

·阅读时长 4 分钟

Electron 17.0.0 已发布!它包含了 Chromium 98、V8 9.8 和 Node.js 16.13.0 的升级。请阅读下文以了解更多详情!


Electron 团队很高兴地宣布 Electron 17.0.0 正式发布!您可以通过 npm 安装它:npm install electron@latest,或者从我们的发布网站下载。请继续阅读以了解此版本的详细信息,并分享您的任何反馈!

重要变更

Electron 发布节奏变更

从 Electron 15 开始,Electron 将每 8 周发布一个新的主要稳定版本。您可以在此处阅读完整详情

此外,在 2022 年 5 月之前,Electron 的支持版本已从最新的三个版本更改为最新的四个版本。请参阅我们的版本控制文档,了解有关 Electron 中版本控制的更详细信息。2022 年 5 月之后,我们将恢复支持最新的三个版本。

技术栈变更

亮点功能

  • 添加了 webContents.getMediaSourceId(),可与 getUserMedia 一起使用,为 WebContents 获取流。 #31204
  • 弃用 webContents.getPrinters() 并引入 webContents.getPrintersAsync()#31023
  • desktopCapturer.getSources 现在仅在主进程中可用。 #30720

请参阅 17.0.0 发布说明 以获取新功能和更改的完整列表。

破坏性变更

以下是 Electron 17 中引入的重大更改。有关这些更改和未来更改的更多信息,请访问计划中的重大更改页面。

渲染器中的 desktopCapturer.getSources

desktopCapturer.getSources API 现在仅在主进程中可用。此更改是为了提高 Electron 应用程序的默认安全性。

API 更改

Electron 17 中没有 API 更改。

移除/弃用的变更

  • 渲染器中对 desktopCapturer.getSources API 的使用已被移除。有关如何在您的应用程序中替换此 API 的详细信息,请参阅此处

13.x.y 版本支持结束

根据项目的支持策略,Electron 13.x.y 已达到支持终止日期。建议开发人员和应用程序升级到较新的 Electron 版本。

自 Electron 15 起,在 Electron 19 之前,我们已将支持版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月。在 Electron 19 之后,我们将恢复支持最新的三个版本。此次版本支持的更改是我们新的发布周期更改的一部分。请在此处查看我们的博客文章以获取完整详细信息

E15 (21年9月)E16 (21年11月)E17 (22年2月)E18 (22年3月)E19 (22年5月)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

下一步计划

短期内,您可以期待团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们谨慎地不承诺发布日期,但我们的计划是大约每 2 个月发布包含这些组件新版本的新 Electron 主要版本。

您可以在此处找到 Electron 的公开时间线

有关未来变更的更多信息,请参阅计划中的破坏性变更页面。

Spectron 弃用通知

·阅读时间 2 分钟

Spectron 将于2022年2月1日被弃用。


从2022年2月开始,Spectron 将被 Electron 团队正式弃用

为什么要弃用 Spectron?

Spectron 尽管一直为每个新版本的 Electron 发布新版本,但该项目已有一年多未得到任何维护和改进,目前也没有全职维护者。随着 remote 模块在 Electron 14 中从 Electron 核心移至外部模块,Spectron 将需要进行大规模重写才能继续可靠运行。

在审查了 Spectron 持续维护的几个可用选项后,Electron 团队决定在 2022 年弃用 Spectron。

弃用时间线

以下是我们计划的弃用时间表

  • 2021年11月 - 2022年1月:Electron 团队将继续接受来自社区的拉取请求。
  • 2022年1月:将发布最终版本的公告,警告 Spectron 的弃用。
  • 2022年2月1日:Spectron 的仓库将被标记为“存档”。 不再接受拉取请求。

2022 年 2 月 1 日之后,Electron 将无限期保留 Spectron 仓库,欢迎其他人为他们的项目 Fork 或使用现有代码。我们希望这将有助于为可能仍依赖 Spectron 的任何项目提供更长的过渡期。

Spectron 的替代方案

如果您当前在项目中使用 Spectron 并希望迁移到替代测试解决方案,您可以在此处阅读我们的自动化测试指南

我们目前有几个其他推荐的 Spectron 替代品,包括 Playwright 和 WebDriverIO。 每个选项的官方教程都可以在我们的自动化测试文档中找到。

下一步计划

Electron 团队感谢您使用 Spectron 和 Electron。我们理解你们中的许多人依赖 Spectron 来测试您的应用程序,我们希望使这一过渡对您来说尽可能轻松。 感谢您选择 Electron!

Electron 16.0.0

·阅读时长 4 分钟

Electron 16.0.0 已发布!它包含了 Chromium 96、V8 9.6 和 Node.js 16.9.1 的升级。请继续阅读以了解更多详情!


Electron 团队很高兴宣布发布 Electron 16.0.0!您可以通过 npm install electron@latest 使用 npm 进行安装,或从我们的 发布网站 下载。请继续阅读以了解此版本的详细信息,并请分享您的任何反馈!

重要变更

Electron 发布节奏变更

从 Electron 15 开始,Electron 将每 8 周发布一个新的主要稳定版本。您可以在此处阅读完整详情

此外,在 2022 年 5 月之前,Electron 的支持版本已从最新的三个版本更改为最新的四个版本。请参阅我们的版本控制文档,了解有关 Electron 中版本控制的更详细信息。2022 年 5 月之后,我们将恢复支持最新的三个版本。

技术栈变更

亮点功能

  • 现在支持 WebHID API。#30213
  • app.requestSingleInstanceLock 添加 data 参数,以便在实例之间共享数据。#30891
  • 将 securityOrigin 传递给媒体权限请求处理程序。#31357
  • 添加 commandLine.removeSwitch#30933

请参阅 16.0.0 版本说明,了解新功能和更改的完整列表。

破坏性变更

以下是 Electron 16 中引入的重大更改。有关这些更改以及未来更改的更多信息,请参阅 计划中的重大更改 页面。

构建原生模块

如果您的项目使用 node-gyp 来构建原生模块,您可能需要根据您的项目设置和 Electron 版本,使用 --force-process-config 来调用它。有关此更改的更多信息,请参阅 #2497

行为已更改:Linux 上 crashReporter 实现已切换到 Crashpad

Linux 上 crashReporter API 的底层实现已从 Breakpad 切换到 Crashpad,使其与 Windows 和 Mac 一致。因此,子进程现在会自动被监视,并且不再需要在 Node 子进程中调用 process.crashReporter.start(也不建议这样做,因为它会启动第二个 Crashpad 报告器实例)。

在 Linux 上,注释的报告方式也发生了一些细微变化,包括长值将不再被拆分到以 __1__2 等结尾的注释之间,而是会被截断到(新的、更长的)注释值限制。

API 更改

Electron 16 中没有 API 更改。

移除/弃用的变更

  • 在渲染器中使用 desktopCapturer.getSources API 已弃用,并将被移除。此更改提高了 Electron 应用的默认安全性。有关如何在您的应用中替换此 API 的详细信息,请参阅 此处

停止支持 12.x.y

根据项目的 支持策略,Electron 12.x.y 已结束支持。我们鼓励开发者和应用程序升级到更新版本的 Electron。

自 Electron 15 起,在 Electron 19 之前,我们已将支持版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月。在 Electron 19 之后,我们将恢复支持最新的三个版本。此次版本支持的更改是我们新的发布周期更改的一部分。请在此处查看我们的博客文章以获取完整详细信息

E15 (21年9月)E16 (21年11月)E17 (22年2月)E18 (22年3月)E19 (22年5月)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

下一步计划

短期内,您可以期待团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们谨慎地不承诺发布日期,但我们的计划是大约每 2 个月发布包含这些组件新版本的新 Electron 主要版本。

您可以在此处找到 Electron 的公开时间线

有关未来变更的更多信息,请参阅计划中的破坏性变更页面。

寂静之地 (21 年 12 月)

·阅读时间 2 分钟

Electron 项目将在 2021 年 12 月暂停一个月,然后在 2022 年 1 月恢复全速运行。

来自 GIPHY


12 月份保持不变的事项

  1. 零日漏洞和其他与重大安全相关的版本将根据需要发布。安全事件应通过 SECURITY.md 报告。
  2. 行为准则的报告和管理工作将继续进行。

12 月份会有所不同的事项

  1. 12 月份不会发布新的 Beta 或 Stable 版本。12 月的最后两周不会发布 Nightly 版本。
  2. 除少数例外情况外,不会进行 Pull Request 的审查或合并。
  3. 任何代码仓库的 Issue Tracker 都不会有更新。
  4. 维护者不会在 Discord 上提供调试帮助。
  5. 社交媒体内容将暂停更新。

为什么要这样做?

简而言之,虽然维护者对项目感到满意并积极参与,但世界已经厌倦了。十二月是大多数公司的一个平静的月份,所以我们希望给我们的维护者一个休息的机会。我们鼓励其他项目考虑类似的措施。

我应该担心 Electron 的未来吗?

不用担心。我们之所以能采取这一步,是因为项目正处于良好状态。大家都对 2022 年充满期待,我们预计会有美好的事情发生!

Electron 15.0.0

·阅读时长 5 分钟

Electron 15.0.0 已发布!它包含了 Chromium 94、V8 9.4 和 Node.js 16.5.0 的升级。我们还添加了对 window.open 的 API 更新、错误修复和一般性改进。请继续阅读以了解更多详情!


Electron 团队很高兴宣布发布 Electron 15.0.0!您可以使用 npm 通过 npm install electron@latest 进行安装,或者从我们的 发布网站 下载。请继续阅读以了解此版本的详细信息,并分享您的任何反馈!

重要变更

Electron 发布节奏变更

从 Electron 15 开始,Electron 将每 8 周发布一个新的主要稳定版本。您可以在 此处 阅读完整的详细信息。

此外,Electron 将在 2022 年 5 月之前将支持版本从最新的三个版本更改为最新的四个版本。有关 Electron 版本管理的更详细信息,请参阅我们的 版本管理文档

技术栈变更

重点特性

  • nativeWindowOpen: true 不再是实验性的,现在是默认值。
  • 添加了 safeStorage 字符串加密 API。 #30430
  • WebContents 添加了 'frame-created' 事件,该事件在页面中创建 frame 时触发。 #30801
  • BrowserWindowwill-resize 事件添加了 resize edge 信息。 #29199

有关新功能和更改的完整列表,请参阅 15.0.0 版本说明

破坏性变更

以下是 Electron 15 中引入的重大更改。有关这些更改以及未来更改的更多信息,请参阅 计划中的重大更改 页面。

默认值更改:nativeWindowOpen 默认为 true

在 Electron 15 之前,window.open 默认被包装以使用 BrowserWindowProxy。这意味着 window.open('about:blank') 无法同步脚本化子窗口,以及其他不兼容的情况。nativeWindowOpen: true 不再是实验性的,现在是默认值。

有关更多详细信息,请参阅 Electron 中 window.open 的文档。

API 更改

  • WebContents 添加了 'frame-created' 事件,该事件在页面中创建 frame 时触发。 #30801
  • 添加了 safeStorage 字符串加密 API。 #30430
  • dialog.showMessageBox 添加了 signal 选项。 #26102
  • 添加了 Electron Fuse,用于强制执行应用程序加载的 app.asar 文件的代码签名。需要最新的 asar 模块 (v3.1.0 或更高版本)。#30900
  • 添加了禁用已打包应用程序中 NODE_OPTIONS--inspect 调试参数的 fuses。 #30420
  • 添加了新的 MenuItem.userAccelerator 属性,用于读取用户分配的 macOS 加速器覆盖。 #26682
  • 添加了新的 app.runningUnderARM64Translation 属性,用于检测在 Apple Silicon 上的 Rosetta 下或在 ARM 上的 Windows 上的 WOW 下运行。 #29168
  • 添加了新的 imageAnimationPolicy Web首选项,用于控制图像的动画方式。 #29095
  • 添加了对通过 context bridge 发送 Blobs 的支持。 #29247

移除/弃用的变更

没有 API 被移除或弃用。

支持的版本

从 Electron 15 开始,我们将支持版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月的 Electron 19。Electron 19 之后,我们将恢复支持最新的三个版本。此版本支持更改是我们新的发布周期更改的一部分。请参阅 我们的博客文章了解完整细节

鼓励开发者和应用程序升级到更新版本的 Electron。

E15 (21年9月)E16 (21年11月)E17 (22年2月)E18 (22年3月)E19 (22年5月)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

下一步计划

在短期内,您可以期望团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们谨慎地不承诺发布日期,但我们的计划是大约每季度发布带有这些组件新版本的 Electron 主要新版本。

您可以在此处找到 Electron 的公开时间线

有关未来变更的更多信息,请参阅计划中的破坏性变更页面。

Electron 14.0.0

·7分钟阅读

Electron 14.0.0 已发布!它包含了 Chromium 93 和 V8 9.3 的升级。我们添加了几项 API 更新、bug 修复和通用改进。请继续阅读以获取更多详情!


Electron 团队很高兴宣布 Electron 14.0.0 发布! 您可以通过 npm 使用 npm install electron@latest 进行安装,或从我们的发布网站下载。 请继续阅读此版本的详细信息,并分享您的任何反馈!

重要变更

Electron 发布节奏变更

从2021年9月的 Electron 15 开始,Electron 将每 8 周发布一个新的主要稳定版本。 您可以在此处阅读完整详情。 Electron 15 将于2021年9月1日开始测试版,稳定版将于2021年9月21日发布。 您可以在此处找到 Electron 的公开时间表。 此外,Electron 将支持的版本从最新的三个版本更改为最新的四个版本,直到2022年5月。 有关 Electron 中版本控制的详细信息,请参阅我们的版本控制文档

技术栈变更

重点特性

  • 默认更改:nativeWindowOpen 现在默认为 true(查看文档)
  • 子窗口不再继承其父窗口的 BrowserWindow 构造选项。 #28550
  • 添加了新的 session.storagePath API,用于获取会话特定数据在磁盘上的路径。 #28665
  • 添加了 process.contextId,用于 @electron/remote#28007
  • Electron Fuse 之后,添加了实验性的 cookie 加密支持。#29492

请参阅 14.0.0 版本说明 以获取新功能和更改的完整列表。

破坏性变更

以下是 Electron 14 中引入的破坏性更改。 有关这些以及未来更改的更多信息,请参阅计划的破坏性更改页面。

已移除:app.allowRendererProcessReuse

app.allowRendererProcessReuse 属性已被移除,这是我们为了更紧密地与 Chromium 的进程模型保持一致,以提高安全性、性能和可维护性而采取的计划的一部分。

有关更多详细信息,请参阅 #18397

已移除:BrowserWindow 亲和性

在创建新的 BrowserWindow 时使用的 affinity 选项已被移除,这是我们为了更紧密地与 Chromium 的进程模型保持一致,以提高安全性、性能和可维护性而采取的计划的一部分。

有关更多详细信息,请参阅 #18397

API 已更改:window.open()

可选参数 frameName 不再设置窗口的标题。 此行为现在遵循本地文档中描述的 windowName 参数规范。

如果您曾使用此参数设置窗口标题,现在可以使用 win.setTitle(title) 方法。

已移除:worldSafeExecuteJavaScript

worldSafeExecuteJavaScript 已移除,没有替代方案。请确保您的代码在启用此属性的情况下可以正常工作。自 Electron 12 起,此属性已默认启用。

如果您使用 webFrame.executeJavaScriptwebFrame.executeJavaScriptInIsolatedWorld,您将受到此更改的影响。 您需要确保这些方法返回的值受上下文桥接 API 支持,因为这些方法使用相同的值传递语义。

默认更改:nativeWindowOpen 默认为 true

在 Electron 14 之前,window.open 默认被垫片以使用 BrowserWindowProxy。 这意味着 window.open('about:blank') 在打开同步可脚本化的子窗口时不起作用,以及其他不兼容性。 nativeWindowOpen 不再是实验性的,现在是默认值。

有关更多详细信息,请参阅 Electron 中 window.open 的文档。

已移除:BrowserWindowConstructorOptions 从父窗口继承

在 Electron 14 之前,使用 window.open 打开的窗口将从其父窗口继承 BrowserWindow 构造函数选项,例如 transparentresizable。 从 Electron 14 开始,此行为已移除,窗口将不再从其父窗口继承任何 BrowserWindow 构造函数选项。

取而代之的是,使用 setWindowOpenHandler 为新窗口显式设置选项。

webContents.setWindowOpenHandler((details) => {
return {
action: 'allow',
overrideBrowserWindowOptions: {
// ...
},
};
});

已移除:additionalFeatures

WebContents 的 new-windowdid-create-window 事件中已弃用的 additionalFeatures 属性已被移除。 由于 new-window 使用位置参数,该参数仍然存在,但将始终为空数组 []。(注意:new-window 事件本身已弃用,并已被 setWindowOpenHandler 取代。)窗口功能中的裸键现在将作为选项对象中值为 true 的键出现。

// Removed in Electron 14
// Triggered by window.open('...', '', 'my-key')
webContents.on('did-create-window', (window, details) => {
if (details.additionalFeatures.includes('my-key')) {
// ...
}
});

// Replace with
webContents.on('did-create-window', (window, details) => {
if (details.options['my-key']) {
// ...
}
});

已移除:remote 模块

在 Electron 12 中已弃用,remote 模块现在已从 Electron 本身移除,并提取到单独的包 @electron/remote 中。 @electron/remote 模块将主进程中的 JavaScript 对象桥接到渲染器进程。 这允许您像在渲染器进程中可用一样访问仅主进程的对象。 这是 remote 模块的直接替代品。 有关迁移说明和参考,请参阅模块的自述文件

API 更改

  • 添加了 BrowserWindow.isFocusable() 方法,用于确定窗口是否可聚焦。 #28642
  • 添加了 WebFrameMain.visibilityState 实例属性。 #28706
  • dispositionreferrerpostBody 添加到传递给使用 setWindowOpenHandler 注册的窗口打开处理程序的 details 对象中。#28518
  • 添加了 process.contextId,用于 @electron/remote#28007
  • Electron Fuse 之后,添加了实验性的 cookie 加密支持。#29492
  • webRequest 监听器详细信息添加了缺失的 resourceType 转换:fontpingcspReportmediawebSocket#30050
  • 添加了新的 session.storagePath API,用于获取会话特定数据在磁盘上的路径。 #28665
  • 在 macOS 上添加了对 Windows Control Overlay 的支持。 #29986
  • 添加了支持将 Chromium 日志记录到文件,使用 --log-file=.../path/to/file.log。 此外,现在可以通过在第一个 JS 计时周期内附加命令行开关来从 JavaScript 启用日志记录。#29963
  • 在 node crypto 中添加了对 des-ede3 密码的支持。 #27897
  • 添加了一个 ContextBridgeMutability 功能,允许上下文桥对象进行变异。 #27348

移除/弃用的变更

以下 API 已被移除或现已弃用

  • remote 模块在 Electron 12 中被弃用后已被移除。 #25734
  • 子窗口不再继承其父窗口的 BrowserWindow 构造选项。 #28550
  • new-windowdid-create-window WebContents 事件中移除了已弃用的 additionalFeatures 属性。 #28548
  • 移除了已弃用的 app.allowRendererProcessReuse 和 BrowserWindow affinity 选项。 #26874
  • uploadToServer 为 false 时,crashReporter.startsubmitURL 选项不再是必需参数。#28105

11.x.y 版本支持结束

Electron 11.x.y 已根据项目的支持策略达到支持结束。 建议开发人员和应用程序升级到较新版本的 Electron。

下一步计划

在短期内,您可以期望团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们谨慎地不承诺发布日期,但我们的计划是大约每季度发布带有这些组件新版本的 Electron 主要新版本。

有关 Electron 未来版本中计划的重大更改的信息,请参阅我们的 计划的重大更改

WebView2 与 Electron

·6 分钟阅读

在过去的几周里,我们收到了几个关于新的 WebView2 和 Electron 之间区别的问题。

两个团队都有一个明确的目标,那就是让 Web 技术在桌面上发挥出最佳水平,并且正在讨论进行一次全面的共享比较。

Electron 和 WebView2 都是快速发展和不断演进的项目。我们整理了 Electron 和 WebView2 截至目前的异同点的简要快照。


架构概述

Electron 和 WebView2 都基于 Chromium 源代码构建,用于渲染网页内容。严格来说,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 Update 管理。

Electron 和 WebView2 都继承了 Chromium 的多进程架构——即一个主进程与一个或多个渲染器进程通信。这些进程与系统上运行的其他应用程序完全分离。每个 Electron 应用程序都是一个独立的进程树,包含一个根浏览器进程、一些实用程序进程和零个或多个渲染进程。使用相同用户数据文件夹的 WebView2 应用程序(例如一组应用程序会这样做)共享非渲染器进程。使用不同数据文件夹的 WebView2 应用程序不共享进程。

  • ElectronJS 进程模型

    ElectronJS Process Model Diagram

  • 基于 WebView2 的应用程序进程模型

    WebView2 Process Model Diagram

在此阅读更多关于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 项目开发的 API。我们有一个Electron 的 Fugu API 兼容性快照。WebView2 维护了一个类似的与 Edge 的 API 差异列表

Electron 具有可配置的网页内容安全模型,从完全访问到完全沙盒。WebView2 内容始终是沙盒化的。Electron 具有关于选择安全模型的全面安全文档。WebView2 也有安全最佳实践

Electron 的源代码在 GitHub 上维护并可用。应用程序可以修改并构建自己的 Electron 品牌。WebView2 的源代码在 GitHub 上不可用。

快速总结

ElectronWebView2
构建依赖ChromiumEdge
GitHub 上源码是否可用
是否共享 Edge/Chrome DLL是(自 Edge 90 起)
应用程序间共享运行时可选
应用程序 API
Node.js
沙盒可选总是
需要应用程序框架
支持的平台Mac, Win, LinuxWin (计划支持 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 架构有最新的看法。他们欢迎对该项目提出任何反馈

新的 Electron 发布节奏

·6 分钟阅读

从2021年9月开始,Electron 将每8周发布一个主要稳定版本。


2019 年,Electron 调整为 12 周发布周期,以匹配 Chromium 的 6 周发布周期。最近,Chrome 和 Microsoft 都宣布了让我们重新考虑 Electron 当前发布周期的变更。

  1. Chromium 计划从 2021 年 9 月 21 日的 Chrome 94 开始,4 周发布一个新里程碑。此发布周期还每 8 周增加一个新的 Extended Stable 选项,其中包含所有更新的安全修复程序。

  2. Microsoft Store 将要求基于 Chromium 的应用版本不得早于最新的两个主版本。例如,如果 Chromium 的最新发布主版本是 85,则任何基于 Chromium 的浏览器必须至少为 Chromium 版本 83 或更高版本。此规则包括 Electron 应用。

从2021年9月开始,Electron将每8周发布一个新的主要稳定版本,以匹配Chromium的8周长期支持(Extended Stable)版本。

我们第一个使用Chromium长期支持版本(Extended Stable)的发布将是2021年9月21日的Electron 15

我们知道发布周期调整将影响其他下游应用程序,因此我们希望尽快告知我们的开发者社区。请继续阅读以了解有关我们2021年发布计划的更多详细信息。

Electron 15:临时 Alpha 版本

鉴于我们最初的 Electron 15 发布目标是非 Extended Stable 版本(Chromium 的 Extended Stable 版本基于其偶数版本),我们需要更改原始目标发布日期。然而,Electron 应用必须使用最新的两个 Chromium 主版本才能被 Microsoft Store 接受,这使得等待两个 Chromium 版本变得不可行。

考虑到这两个要求,我们的团队面临着一个时间上的困境。将 Electron 15 迁移到包含 Chromium M94 将允许应用开发者使用 Chromium 的第一个 Extended Stable 版本;然而,这也会将 beta 到 stable 的周期缩短到只有 3 周。

为了帮助实现这一过渡,Electron 将为 Electron 15 发布提供一个临时的 alpha 构建版。此 alpha 构建版将为开发者提供更多时间来测试和规划 Electron 15 的发布,其稳定性将高于我们当前的 nightly 构建版。

alpha 通道构建版将于 2021 年 7 月 20 日发布 Electron 15。它将于 2021 年 9 月 1 日过渡到 beta 版本,稳定发布目标为 2021 年 9 月 21 日。此后的 Electron 发布将不再提供 alpha 版本。

2021年发布计划

以下是我们的2021年当前发布计划:

ElectronChromeAlpha 版本Beta 版本稳定版本稳定周期(周)
E13M91-2021-03-052021-05-2512
E14M93-2021-05-262021-08-3114
E15M942021-07-202021-09-012021-09-219 (包含 alpha)
E16M96-2021-09-222021-11-168
E17M98-2021-11-172022-02-0111

添加 alpha 通道将 Electron 15 发布前的开发时间从3周延长到9周——更接近我们新的8周周期,同时仍满足Windows商店的提交要求。

为了进一步帮助应用开发者,在 2021 年剩余时间直至 2022 年 5 月,我们将把支持版本策略从最新的 3 个版本扩展到最新的 4 个 Electron 版本。这意味着即使您无法立即更改升级计划,旧版本的 Electron 仍将获得安全更新和修复。

解决疑虑

我们之所以在这个发布周期变化预定之前发布这篇文章,是有原因的。我们知道更快的发布周期将对Electron应用程序产生实际影响——其中一些应用程序可能已经觉得我们的大版本发布周期很激进了。

我们已尝试在下方解决常见疑虑:

❓ 为什么要进行此更改?为什么不维持 12 周的发布周期?

为了在 Electron 中提供最新的 Chromium 版本,我们的计划需要与他们的计划保持一致。有关 Chromium 发布周期的更多信息,请参阅此处

此外,当前的 12 周发布周期将无法满足 Microsoft Store 的新提交要求。即使是最新稳定版 Electron 的应用,在新的安全要求下,也可能会经历大约两周的应用被拒绝期。

每个新的 Chromium 版本都包含新功能、错误修复/安全修复和 V8 改进。我们希望您(作为应用开发者)能够及时获得这些更改,因此我们的稳定发布日期将继续与每隔一个 Chromium 稳定版本保持一致。作为应用开发者,您将比以前更快地获得新的 Chromium 和 V8 功能及修复。

❓ 现有的 12 周发布计划已经更新很快了。团队正在采取哪些措施使升级更容易?

更频繁发布的优势之一是发布版本更小。我们理解升级 Electron 的主版本可能很困难。我们希望较小的发布版本在每次发布时引入的 Chromium 和 Node 主要更改以及破坏性更改会更少。

❓ 未来 Electron 版本是否会有 alpha 版本发布?

目前没有计划支持永久性的alpha版本。这个alpha版本仅针对Electron 15,作为一种帮助开发者在缩短的发布周期内更轻松地升级的方式。

❓ Electron 是否会延长支持版本数量?

我们将把支持版本策略从最新的三个版本延长到最新的四个 Electron 版本,直至 2022 年 5 月 Electron 19 发布。在 Electron 19 发布后,我们将恢复支持最新的三个主版本,以及 beta 和 nightly 版本。

E13 (2021年5月)E14 (2021年8月)E15 (21年9月)E16 (21年11月)E17 (22年2月)E18 (22年3月)E19 (22年5月)
13.x.y14.x.y15.x.y16.x.y17.x.y18.x.y19.x.y
12.x.y13.x.y14.x.y15.x.y16.x.y17.x.y18.x.y
11.x.y12.x.y13.x.y14.x.y15.x.y16.x.y17.x.y
----12.x.y13.x.y14.x.y15.x.y--

有疑问?

📨 如果您有任何问题或疑虑,请通过 info@electronjs.org 发送邮件给我们,或加入我们的 Discord。我们知道这对许多应用和开发者都会产生影响,您的反馈对我们非常重要。我们希望能听到您的声音!

Electron 13.0.0

·阅读时长 4 分钟

Electron 13.0.0 已发布! 此版本中包含了对 Chromium 91 和 V8 9.1 的升级。 我们还增加了几个 API 的更新、错误修复和常规改进。 阅读下文了解更多详情!


Electron 团队很高兴地宣布 Electron 13.0.0 的发布!您可以通过 npm install electron@latest 使用 npm 进行安装,或者从我们的 发布网站 下载。请继续阅读以了解此版本的详细信息,并分享您的反馈!

重要变更

技术栈变更

重点特性

  • 添加了 process.contextIsolated 属性,用于指示当前渲染器上下文是否启用了 contextIsolation#28252
  • 添加了新的 session.storagePath API,用于获取会话特定数据在磁盘上的路径。 #28866
  • WebContentsnew-window 事件已被弃用。 它被 webContents.setWindowOpenHandler() 替代。
  • 添加了供 @electron/remote 使用的 process.contextId#28251

有关新功能和变化的完整列表,请参阅 13.0.0 版本说明

破坏性变更

  • window.open() 参数 frameName 不再被设置为窗口标题。 #27481
  • 更改了 session.setPermissionCheckHandler(handler),允许 handler 的第一个参数 webContentsnull#19903

有关这些及未来更改的更多信息,请参阅计划中的重大更改页面。

API 更改

  • BrowserWindow 添加了 roundedCorners 选项。 #27572
  • 添加了新的 session.storagePath API,用于获取会话特定数据在磁盘上的路径。28866
  • 增加了通过上下文桥传递 DOM 元素的支持。 #26776
  • 为沙盒化的渲染器添加了 process.uptime()#26684
  • 在作为 context-menu 事件一部分发出的参数中,添加了缺失的字段。#26788
  • 增加了对注册 Manifest V3 扩展 Service Worker 的支持。
  • 为 ServiceWorkers 添加了 ‘registration-completed’ 事件。 #27562

移除/弃用的变更

以下 API 已被移除或现已弃用

  • WebContentsnew-window 事件已被弃用。 它被 webContents.setWindowOpenHandler() 替代。

  • 移除了已弃用的 shell.moveItemToTrash()#26723

  • 移除了以下已弃用的 BrowserWindow 扩展 API

    • BrowserWindow.addExtension(path)
    • BrowserWindow.addDevToolsExtension(path)
    • BrowserWindow.removeExtension(name)
    • BrowserWindow.removeDevToolsExtension(name)
    • BrowserWindow.getExtensions()
    • BrowserWindow.getDevToolsExtensions()

    请改用 session API

    • ses.loadExtension(path)
    • ses.removeExtension(extension_id)
    • ses.getAllExtensions()
  • 以下 systemPreferences 方法已被弃用

    • systemPreferences.isDarkMode()
    • systemPreferences.isInvertedColorScheme()
    • systemPreferences.isHighContrastColorScheme()

    请改用以下 nativeTheme 属性

    • nativeTheme.shouldUseDarkColors
    • nativeTheme.shouldUseInvertedColorScheme
    • nativeTheme.shouldUseHighContrastColors

停止对 10.x.y 的支持

根据项目的 支持策略,Electron 10.x.y 已达到支持结束。我们鼓励开发者和应用程序升级到更新版本的 Electron。

下一步计划

短期内,您可以期望团队继续专注于跟上 Electron 主要组件(包括 Chromium、Node 和 V8)的开发。尽管我们小心地不承诺发布日期,但我们的计划是大约每季度发布一次包含这些组件新版本的新主要版本 Electron。 暂定的 14.0.0 时间表 概述了 Electron 14.0 开发生命周期中的关键日期。此外,请参阅我们的 版本文档,了解有关 Electron 版本管理的更详细信息。

有关 Electron 未来版本中计划的重大更改的信息,请参阅我们的计划中的重大更改文档