跳到主要内容

Electron 和 V8 内存笼

·7 分钟阅读

Electron 21 及更高版本将启用 V8 内存笼,这对某些原生模块有影响。


更新 (2022/11/01)

要跟踪关于 Electron 21+ 中原生模块使用的持续讨论,请参阅 electron/electron#35801

在 Electron 21 中,我们将启用 Electron 中的 V8 沙盒指针,继 Chrome 在 Chrome 103 中做出同样的决定之后。这对原生模块有一些影响。此外,我们之前在 Electron 14 中启用了一项相关技术,指针压缩。我们当时没有过多谈论它,但指针压缩对最大 V8 堆大小有影响。

当启用这两项技术时,对安全性、性能和内存使用都有显著的好处。然而,启用它们也有一些缺点。

启用沙盒指针的主要缺点是不再允许指向外部 (“堆外”) 内存的 ArrayBuffer。这意味着依赖 V8 中此功能的原生模块需要重构才能继续在 Electron 20 及更高版本中工作。

启用指针压缩的主要缺点是V8 堆的最大大小限制为 4GB。这方面的确切细节有点复杂,例如,ArrayBuffer 与 V8 堆的其余部分分开计数,但有其自己的限制

Electron 升级工作组认为,指针压缩和 V8 内存笼的好处大于缺点。这样做的主要原因有三个

  1. 它使 Electron 更接近 Chromium。Electron 在诸如 V8 配置之类的复杂内部细节中与 Chromium 的差异越小,我们意外引入错误或安全漏洞的可能性就越小。Chromium 的安全团队非常强大,我们希望确保我们正在利用他们的工作。此外,如果某个错误仅影响 Chromium 中未使用的配置,那么修复该错误不太可能是 Chromium 团队的优先事项。
  2. 它的性能更好。指针压缩将 V8 堆大小减少高达 40%,并将 CPU 和 GC 性能提高 5%–10%。对于绝大多数不会遇到 4GB 堆大小限制且不使用需要外部缓冲区的原生模块的 Electron 应用程序来说,这些是显著的性能提升。
  3. 它更安全。某些 Electron 应用程序运行不受信任的 JavaScript(希望遵循我们的安全建议!),对于这些应用程序,启用 V8 内存笼可以保护它们免受大量有害的 V8 漏洞的侵害。

最后,对于确实需要更大堆大小的应用程序,有一些解决方法。例如,可以在应用程序中包含一个禁用了指针压缩的 Node.js 副本,并将内存密集型工作移动到子进程。虽然有点复杂,但如果您决定希望为您的特定用例做出不同的权衡,也可以构建一个禁用指针压缩的 Electron 自定义版本。最后,在不久的将来,wasm64 将允许在 Web 和 Electron 上使用 WebAssembly 构建的应用程序使用远大于 4GB 的内存。


常见问题解答

我如何知道我的应用程序是否受此更改的影响?

在 Electron 20+ 中,尝试使用 ArrayBuffer 包装外部内存会在运行时崩溃。

如果您的应用程序中未使用任何原生 Node 模块,则您是安全的——无法从纯 JS 中触发此崩溃。此更改仅影响在 V8 堆外部分配内存(例如,使用 mallocnew),然后使用 ArrayBuffer 包装外部内存的原生 Node 模块。这是一个相当罕见的用例,但某些模块确实使用了这种技术,并且此类模块需要重构才能与 Electron 20+ 兼容。

我如何测量我的应用正在使用的 V8 堆内存量,以了解是否接近 4GB 的限制?

在渲染器进程中,您可以使用 performance.memory.usedJSHeapSize,它将返回以字节为单位的 V8 堆使用量。在主进程中,您可以使用 process.memoryUsage().heapUsed,它们是可比较的。

什么是 V8 内存笼?

有些文档将其称为 “V8 沙箱”,但该术语很容易与 Chromium 中发生的其他类型的沙箱混淆,因此我将坚持使用“内存笼”这个术语。

有一种相当常见的 V8 漏洞利用方式,大致如下:

  1. 在 V8 的 JIT 引擎中找到一个错误。JIT 引擎分析代码,以便能够省略缓慢的运行时类型检查并生成快速的机器代码。有时,逻辑错误意味着它的分析是错误的,并且省略了实际需要的类型检查——例如,它认为 x 是一个字符串,但实际上它是一个对象。
  2. 滥用这种混淆来覆盖 V8 堆中的某些内存位,例如,指向 ArrayBuffer 开头的指针。
  3. 现在您有了一个指向您喜欢的任何位置的 ArrayBuffer,因此您可以读取和写入进程中的任何内存,甚至是 V8 通常无法访问的内存。

V8 内存笼是一种旨在明确防止此类攻击的技术。实现这一目标的方式是不在 V8 堆中存储任何指针。相反,所有对 V8 堆内部其他内存的引用都存储为相对于某个保留区域开头的偏移量。然后,即使攻击者设法破坏了 ArrayBuffer 的基地址,例如通过利用 V8 中的类型混淆错误,他们最坏的情况也只能读取和写入笼子内的内存,而他们可能已经可以做到这一点。关于 V8 内存笼如何工作还有很多资料可以阅读,因此我不会在此处进一步详细介绍——最好的阅读起点可能是 Chromium 团队的高级设计文档

我想重构一个 Node 原生模块以支持 Electron 21+。我该怎么做?

有两种方法可以重构原生模块以使其与 V8 内存笼兼容。第一种方法是,在将外部创建的缓冲区传递给 JavaScript 之前,将其复制到 V8 内存笼中。这通常是一个简单的重构,但当缓冲区很大时,它可能会很慢。另一种方法是使用 V8 的内存分配器来分配您打算最终传递给 JavaScript 的内存。这稍微复杂一些,但可以让您避免复制,这意味着对于大型缓冲区具有更好的性能。

为了使这一点更具体,这是一个使用外部数组缓冲区的 N-API 模块示例:

// Create some externally-allocated buffer.
// |create_external_resource| allocates memory via malloc().
size_t length = 0;
void* data = create_external_resource(&length);
// Wrap it in a Buffer--will fail if the memory cage is enabled!
napi_value result;
napi_create_external_buffer(
env, length, data,
finalize_external_resource, NULL, &result);

当启用内存笼时,这将崩溃,因为数据是在笼子外部分配的。重构为将数据复制到笼子内部,我们得到:

size_t length = 0;
void* data = create_external_resource(&length);
// Create a new Buffer by copying the data into V8-allocated memory
napi_value result;
void* copied_data = NULL;
napi_create_buffer_copy(env, length, data, &copied_data, &result);
// If you need to access the new copy, |copied_data| is a pointer
// to it!

这会将数据复制到 V8 内存笼内部新分配的内存区域。可选地,N-API 还可以提供一个指向新复制数据的指针,以防您需要在事后修改或引用它。

重构为使用 V8 的内存分配器有点复杂,因为它需要修改 create_external_resource 函数以使用 V8 分配的内存,而不是使用 malloc。这可能或多或少是可行的,具体取决于您是否控制 create_external_resource 的定义。其思想是首先使用 V8 创建缓冲区,例如使用 napi_create_buffer,然后将资源初始化到 V8 分配的内存中。重要的是要保留对 Buffer 对象的 napi_ref,以确保资源的生命周期,否则 V8 可能会垃圾回收 Buffer,并可能导致使用后释放错误。

Electron 19.0.0

·3 分钟阅读

Electron 19.0.0 已发布!它包括对 Chromium 102、V8 10.2 和 Node.js 16.14.2 的升级。请阅读以下详细信息!


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

值得注意的变化

Electron 发布节奏变更

该项目正在恢复其早期支持最新三个主要版本的政策。请参阅我们的版本控制文档以获取有关 Electron 版本控制和支持的更多详细信息。这暂时是四个主要版本,以帮助用户适应在 Electron 15 中开始的新发布节奏。您可以在此处阅读完整详细信息。

堆栈更改

重大更改和 API 更改

以下是 Electron 19 中引入的重大更改。有关这些更改和未来更改的更多信息,可以在计划重大更改页面上找到。

在 Linux 上不受支持:.skipTaskbar

不再支持 Linux 上的 BrowserWindow 构造函数选项 skipTaskbar。在 #33226 中更改

已删除 WebPreferences.preloadURL

已从 WebPreferences 中删除半文档化的 preloadURL 属性。#33228。应改为使用 WebPreferences.preload

15.x.y 和 16.x.y 的支持结束

Electron 14.x.y 和 15.x.y 都已达到支持结束。这 Electron 恢复到支持最新三个主要版本的现有政策。鼓励开发人员和应用程序升级到更高版本的 Electron。

E15 (2021年9月)E16 (2021年11月)E17 (2022年2月)E18 (2022年3月)E19 (2022年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 的公开时间表。

有关未来更改的更多信息,可以在计划重大更改页面上找到。

S3 存储桶迁移

·2 分钟阅读

Electron 正在更改其主要的 S3 存储桶,您可能需要更新您的构建脚本


正在发生什么?

大量 Electron 的构建工件被上传到一个名为 gh-contractor-zcbenz 的 S3 存储桶。作为 2020 年开始的持续基础设施/所有权迁移的一部分,我们将更改所有使用 gh-contractor-zcbenz 的内容,从其在 S3 中的旧位置更改为托管在 https://artifacts.electronjs.org 的新存储系统。我们大多数资产使用的路径前缀也略有变化。下面包含一些示例

之前: https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist/v17.0.0/node.lib 之后: https://artifacts.electronjs.org/headers/dist/v17.0.0/node.lib

这里重要的是主机名已更改,并且 /atom-shell 前缀已更改。另一个示例,这次是针对调试符号:

之前: https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/symbols/path/to/symbol.pdb 之后: https://artifacts.electronjs.org/symbols/path/to/symbol.pdb

同样,主机名已更改,并且 /atom-shell 前缀已更改。

这会如何影响您?

任何使用标准构建工具(例如 electron-rebuildelectron-packager@electron/get)的人都不必做任何事情。这应该是大多数人。

对于任何直接引用 S3 存储桶的人,您必须更新您的引用以指向主机名并更新路径。

现有数据怎么样?

gh-contractor-zcbenz 存储桶中存在的大多数数据已克隆到新的存储系统中。这意味着所有调试符号和所有标头都已被复制。如果您依赖该存储桶中未被复制的某些数据,请在electron/electron中提出问题并告知我们。

当前的 gh-contractor-zcbenz S3 存储桶不会被主动删除。但是,我们无法保证该存储桶将保留多久。我们强烈建议您尽快更新以定位新的存储桶。

Electron 18.0.0

·3 分钟阅读

Electron 18.0.0 已发布!它包括 Chromium 100、V8 10.0 和 Node.js 16.13.2 的升级。请阅读以下内容了解更多详情!


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

值得注意的变化

Electron 发布节奏变更

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

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

堆栈更改

重点功能

  • 添加了 ses.setCodeCachePath() API 用于设置代码缓存目录。#33286
  • 删除了旧的基于 BrowserWindowProxywindow.open 实现。这也从 webPreferences 中删除了 nativeWindowOpen 选项。#29405
  • WebContents 添加了 “focus” 和 “blur” 事件。#25873
  • 在 macOS 上添加了“替换”菜单角色:showSubstitutionstoggleSmartQuotestoggleSmartDashestoggleTextReplacement#32024
  • app.requestSingleInstanceLock() 流添加了 first-instance-ack 事件,允许用户无缝地将数据从第一个实例传输到第二个实例。#31460
  • 添加了对 setBackgroundColor 中更多颜色格式的支持。#33364

有关新功能和更改的完整列表,请参阅18.0.0 发行说明

重大更改和 API 更改

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

已删除:nativeWindowOpen

在 Electron 15 之前,默认情况下 window.open 被 shimmed 以使用 BrowserWindowProxy。这意味着 window.open('about:blank') 不能用于打开同步可脚本化的子窗口,以及其他不兼容的情况。自 Electron 15 以来,默认情况下已启用 nativeWindowOpen

有关更多详细信息,请参阅 Electron 中window.open 的文档。在 #29405 中已删除

结束对 14.x.y 的支持

根据该项目的支持策略,Electron 14.x.y 已达到支持终止。我们鼓励开发人员和应用程序升级到较新版本的 Electron。

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

E15 (2021年9月)E16 (2021年11月)E17 (2022年2月)E18 (2022年3月)E19 (2022年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 的公开时间表。

有关未来更改的更多信息,可以在计划重大更改页面上找到。

2022 年 Google 编程之夏

·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

·3 分钟阅读

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 周发布一个新的主要稳定版本。您可以在此处阅读完整详细信息。

此外,Electron 已将支持的版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月。有关 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 开始,我们将支持的版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月,届时将发布 Electron 19。在 Electron 19 之后,我们将恢复支持最新的三个版本。此版本支持更改是我们新的节奏更改的一部分。有关完整详细信息,请参阅我们的博客文章

E15 (2021年9月)E16 (2021年11月)E17 (2022年2月)E18 (2022年3月)E19 (2022年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 持续发布新版本,但该项目一年多来几乎没有维护和改进,目前没有全职维护人员。随着远程模块从 Electron 核心移出并移入 Electron 14 中的外部模块,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 使用 npm install electron@latest 安装它,或者从我们的发布网站下载它。继续阅读有关此版本的详细信息,并请分享您的任何反馈!

值得注意的变化

Electron 发布节奏变更

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

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

堆栈更改

重点功能

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

有关新功能和更改的完整列表,请参阅 16.0.0 发行说明

重大更改

以下是 Electron 16 中引入的重大更改。有关这些更改和未来更改的更多信息,可以在计划的重大更改页面上找到。

构建原生模块

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

行为变更:crashReporter 实现在 Linux 上切换到 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 开始,我们将支持的版本从最新的三个版本更改为最新的四个版本,直到 2022 年 5 月,届时将发布 Electron 19。在 Electron 19 之后,我们将恢复支持最新的三个版本。此版本支持更改是我们新的节奏更改的一部分。有关完整详细信息,请参阅我们的博客文章

E15 (2021年9月)E16 (2021年11月)E17 (2022年2月)E18 (2022年3月)E19 (2022年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 的公开时间表。

有关未来更改的更多信息,可以在计划重大更改页面上找到。

寂静之地 (2021 年 12 月)

·2 分钟阅读

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

通过 GIPHY


12 月份将保持不变的内容

  1. 零日和其他主要安全相关版本将根据需要发布。安全事件应通过 SECURITY.md 报告。
  2. 行为准则报告和审核将继续进行。

12 月份将有所不同的内容

  1. 12 月份没有新的 Beta 或稳定版本发布。12 月的最后两周没有每日构建版本。
  2. 除少数例外,不进行拉取请求审查或合并。
  3. 任何存储库上都没有问题跟踪器更新。
  4. 维护人员不会在 Discord 上提供调试帮助。
  5. 没有社交媒体内容更新。

为什么会发生这种情况?

简而言之,虽然维护人员对该项目感到高兴并积极参与,但 * 世界已经疲惫不堪 *。12 月是大多数公司比较安静的月份,因此我们希望让我们的维护人员有机会充电。我们鼓励其他项目考虑类似的措施。

我应该担心 Electron 的未来吗?

不会。我们能够采取这一步骤是因为该项目运行良好。每个人都期待 2022 年,我们期待美好的事物发生!

Electron 15.0.0

·4 分钟阅读

Electron 15.0.0 已发布!它包括对 Chromium 94、V8 9.4 和 Node.js 16.5.0 的升级。我们为 window.open 添加了 API 更新、bug 修复和一般改进。请阅读以下内容了解更多详细信息!


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

值得注意的变化

Electron 发布节奏变更

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

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

堆栈更改

重点功能

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

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

重大更改

以下是 Electron 15 中引入的重大更改。有关这些更改和未来更改的更多信息,可以在计划的重大更改页面上找到。

默认更改:nativeWindowOpen 默认为 true

在 Electron 15 之前,默认情况下会使用 BrowserWindowProxy 来 shim window.open。这意味着 window.open('about:blank') 不能用于打开同步可脚本化的子窗口,以及其他不兼容问题。nativeWindowOpen: true 不再是实验性的,现在是默认值。

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

API 更改

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

已删除/已弃用的更改

没有删除或弃用 API。

支持的版本

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

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

E15 (2021年9月)E16 (2021年11月)E17 (2022年2月)E18 (2022年3月)E19 (2022年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 的公开时间表。

有关未来更改的更多信息,可以在计划重大更改页面上找到。