跳至主要内容

Electron 31.0.0

·阅读时长3分钟

Electron 31.0.0 已发布!它包含了对 Chromium 126.0.6478.36、V8 12.6 和 Node 20.14.0 的升级。


Electron 团队很高兴地宣布发布 Electron 31.0.0!您可以通过 npm 安装它,命令是 npm install electron@latest,或者从我们的发布网站下载。继续阅读以了解此版本的详细信息。

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区 Discord!错误和功能请求可以在 Electron 的问题跟踪器中报告。

显著变更

亮点

  • 扩展了 WebContentsView 以接受预先存在的 webContents 对象。#42319
  • 添加了对 NODE_EXTRA_CA_CERTS 的支持。#41689
  • 更新了 window.flashFrame(bool) 以在 macOS 上持续闪烁。#41391
  • 移除了 WebSQL 支持 #41868
  • nativeImage.toDataURL 将保留 PNG 色彩空间 #41610
  • 扩展了 webContents.setWindowOpenHandler 以支持手动创建 BrowserWindow。#41432

堆栈变更

Electron 31 将 Chromium 从 124.0.6367.49 升级到 126.0.6478.36,将 Node 从 20.11.1 升级到 20.14.0,并将 V8 从 12.4 升级到 12.6

新特性

  • Session 添加了 clearData 方法。#40983
    • Session.clearData API 添加了 options 参数。#41355
  • 添加了对 navigator.serial 中按服务类 ID 请求蓝牙端口的支持。#41638
  • 添加了对 Node 的 NODE_EXTRA_CA_CERTS 环境变量的支持。#41689
  • 扩展了 webContents.setWindowOpenHandler 以支持手动创建 BrowserWindow。#41432
  • 实现了对 Web 标准 File System API 的支持。#41419
  • 扩展了 WebContentsView 以接受预先存在的 WebContents 实例。#42319
  • 在 webContents API 上添加了一个新的实例属性 navigationHistory,带有一个 navigationHistory.getEntryAtIndex 方法,使应用程序能够检索浏览历史中任何导航条目的 URL 和标题。#41577 (也在 29, 30 中)

破坏性变更

已移除:WebSQL 支持

Chromium 已在上游移除了对 WebSQL 的支持,并将其仅限于 Android。更多信息请参阅 Chromium 的移除意向讨论

行为变更:nativeImage.toDataURL 将保留 PNG 色彩空间

PNG 解码器实现已更改为保留色彩空间数据。此函数返回的编码数据现在与其匹配。

更多信息请参阅 crbug.com/332584706

行为变更:win.flashFrame(bool) 将在 macOS 上持续闪烁 Dock 图标

这使得其行为与 Windows 和 Linux 一致。之前的行为:第一次调用 flashFrame(true) 只会使 Dock 图标跳动一次(使用 NSInformationalRequest 级别),而 flashFrame(false) 不执行任何操作。新行为:持续闪烁直到调用 flashFrame(false)。这改为使用 NSCriticalRequest 级别。要显式地使用 NSInformationalRequest 来实现 Dock 图标单次跳动,仍然可以使用 dock.bounce('informational')

结束对 28.x.y 的支持

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

E31 (24年6月)E32 (24年8月)E33 (24年10月)
31.x.y32.x.y33.x.y
30.x.y31.x.y32.x.y
28.x.y29.x.y31.x.y

下一步是什么

短期内,您可以预期团队将继续专注于跟进构成 Electron 的主要组件的发展,包括 Chromium、Node 和 V8。

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

关于未来变更的更多信息可以在Planned Breaking Changes 页面找到。

Electron 30.0.0

·阅读时长4分钟

Electron 30.0.0 已发布!它包含了对 Chromium 124.0.6367.49、V8 12.4 和 Node.js 20.11.1 的升级。


Electron 团队很高兴地宣布发布 Electron 30.0.0!您可以通过 npm 安装它,命令是 npm install electron@latest,或者从我们的发布网站下载。继续阅读以了解此版本的详细信息。

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区 Discord!错误和功能请求可以在 Electron 的问题跟踪器中报告。

显著变更

亮点

  • ASAR Integrity fuse 现在在 Windows 上受支持 (#40504)
    • 已启用 ASAR Integrity 的现有应用如果配置不正确,可能无法在 Windows 上工作。使用 Electron 打包工具的应用应升级到 @electron/packager@18.3.1@electron/forge@7.4.0
    • 请查看我们的 ASAR Integrity 教程了解更多信息。
  • 添加了 WebContentsViewBaseWindow 主进程模块,废弃并替换了 BrowserView (#35658)。在此博客文章中了解如何从 BrowserView 迁移到 WebContentsView
    • BrowserView 现在是 WebContentsView 的垫片 (shim),旧的实现已被移除。
    • 请参阅我们的 Web Embeds 文档,了解新的 WebContentsView API 与其他类似 API 的比较。
  • 实现了对 File System API 的支持 (#41827)

堆栈变更

Electron 30 将 Chromium 从 122.0.6261.39 升级到 124.0.6367.49,将 Node 从 20.9.0 升级到 20.11.1,并将 V8 从 12.2 升级到 12.4

新特性

  • 为 webviews 添加了 `transparent` webpreference。(#40301)
  • 在 webContents API 上添加了一个新的实例属性 `navigationHistory`,带有一个 `navigationHistory.getEntryAtIndex` 方法,使应用程序能够检索浏览历史中任何导航条目的 URL 和标题。(#41662)
  • 添加了新的 `BrowserWindow.isOccluded()` 方法,允许应用检查遮挡状态。(#38982)
  • 添加了对从 utility process 中使用 `net` 模块发出的请求进行代理配置的支持。(#41417)
  • 添加了对 `navigator.serial` 中按服务类 ID 请求蓝牙端口的支持。(#41734)
  • 添加了对 Node.js NODE_EXTRA_CA_CERTS CLI flag 的支持。(#41822)

破坏性变更

行为变更:跨域 iframe 现在使用 Permission Policy 来访问特性

跨域 iframe 现在必须通过 `allow` 属性指定可用于给定 `iframe` 的特性,才能访问它们。

更多信息请参阅文档

已移除:`--disable-color-correct-rendering` 命令行开关

这个开关从未正式文档化,但无论如何在此注明其移除。Chromium 本身现在对色彩空间有更好的支持,因此不再需要此标志。

行为变更:`BrowserView.setAutoResize` 在 macOS 上的行为

在 Electron 30 中,BrowserView 现在是新的 WebContentsView API 的封装。

之前,`BrowserView` API 的 `setAutoResize` 函数在 macOS 上由 autoresizing 支持,而在 Windows 和 Linux 上由自定义算法支持。对于简单用例,例如使 BrowserView 填充整个窗口,这两种方法的行为是相同的。然而,在更高级的情况下,BrowserViews 在 macOS 上的 autoresizing 行为会与其他平台不同,因为 Windows 和 Linux 的自定义调整算法与 macOS 的 autoresizing API 的行为并非完全匹配。autoresizing 行为现在已在所有平台标准化。

如果您的应用使用 `BrowserView.setAutoResize` 来执行比使 BrowserView 填充整个窗口更复杂的操作,您很可能已经有自定义逻辑来处理 macOS 上的这种行为差异。如果是这样,在 Electron 30 中不再需要该逻辑,因为 autoresizing 行为是一致的。

已移除:`WebContents` 上 `context-menu` 事件的 `params.inputFormType` 属性

WebContents 发出的 context-menu 事件中 params 对象的 inputFormType 属性已被移除。请改用新的 formControlType 属性。

已移除:`process.getIOCounters()`

Chromium 已移除对该信息的访问。

结束对 27.x.y 的支持

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

E30 (24年4月)E31 (24年6月)E32 (24年8月)
30.x.y31.x.y32.x.y
29.x.y30.x.y31.x.y
28.x.y29.x.y30.x.y

下一步是什么

短期内,您可以预期团队将继续专注于跟进构成 Electron 的主要组件的发展,包括 Chromium、Node 和 V8。

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

关于未来变更的更多信息可以在Planned Breaking Changes 页面找到。

Google 代码之夏 2024

·阅读时长4分钟

我们很高兴地宣布 Electron 已被接受成为第20届 Google 代码之夏 (GSoC) 2024 的指导组织!Google 代码之夏 是一个全球性项目,致力于将新的贡献者引入开源软件开发。

有关更多项目详情,请查看 Google 的代码之夏主页

关于我们

Electron 是一个使用 Web 技术构建跨平台桌面应用的 JavaScript 框架。核心 Electron 框架是一个使用 ChromiumNode.js 构建的编译二进制可执行文件,主要用 C++ 编写。

除了 Electron 核心之外,我们还致力于各种项目,以帮助维持 Electron 组织,例如

作为一名代码之夏贡献者,您将与 Electron 的一些核心贡献者一起在 github.com/electron 旗下的众多项目之一上进行协作。

申请前

如果您对 Electron 不太熟悉,我们建议您从阅读文档和在 Electron Fiddle 中尝试示例开始。

要了解更多关于 Electron 应用分发的信息,您还可以通过创建一个示例应用来试用 Electron Forge

npm init electron-app@latest my-app

稍微熟悉代码后,欢迎加入 Electron Discord 服务器上的讨论。

提示

如果这是您第一次参与 Google 代码之夏,或者您总体上是开源新手,我们建议您在参与社区之前,先阅读 Google 的贡献者指南作为第一步。

起草您的提案

有兴趣与 Electron 协作吗?首先,请查看我们准备的 七个项目想法草案。所有列出的想法目前都开放接受提案。

有其他想法想让我们考虑吗?我们也愿意接受未列在提案项目列表中的新想法,但请确保您的方案经过详尽的概述和详细描述。如有疑问,我们建议选择我们列出的想法。

您的申请应包含

  • 您的提案:一份详细描述您计划在夏季期间实现目标的书面文档。
  • 您的开发者背景。如果您有简历,请附上一份。否则,请告诉我们您过去的技术经验。
    • 在某些领域缺乏经验不会使您失去资格,但这将帮助我们的指导者制定最佳支持您的计划,并确保您的夏季项目成功。

此处是关于您的 Electron 申请应提交内容的详细指南。直接将提案提交至 Google 代码之夏门户网站。请注意,通过电子邮件发送给 Electron 团队而不是通过申请门户网站提交的提案,将不被视为最终提交。

如果您想了解更多关于提案的指导,或者不确定应包含哪些内容,我们也建议您在此处查阅官方的 Google 代码之夏提案撰写建议

申请将于 2024年3月18日 开放,并于 2024年4月2日 关闭。

提示

我们的 2022 Google 代码之夏实习生,@aryanshridhar 做得非常出色!如果您想了解 Aryan 在 Electron 的夏季项目中做了什么,可以在 2022 GSoC 项目档案中阅读他的报告。

有问题吗?

如果您有此博客文章中未提及的问题或关于提案草案的疑问,请发送电子邮件至 summer-of-code@electronjs.org 或查看 GSoC FAQ

资源

Electron 29.0.0

·阅读时长4分钟

Electron 29.0.0 已发布!它包含了对 Chromium 122.0.6261.39、V8 12.2 和 Node.js 20.9.0 的升级。


Electron 团队很高兴地宣布发布 Electron 29.0.0!您可以通过 npm 安装它,命令是 npm install electron@latest,或者从我们的发布网站下载。继续阅读以了解此版本的详细信息。

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区 Discord!错误和功能请求可以在 Electron 的问题跟踪器中报告。

显著变更

亮点

  • 添加了一个新的顶级 `webUtils` 模块,这是一个渲染器进程模块,提供了一个实用层来与 Web API 对象交互。该模块中第一个可用的 API 是 `webUtils.getPathForFile`。Electron 之前对 `File.path` 的增强偏离了 Web 标准;新的 API 更符合当前的 Web 标准行为。

堆栈变更

Electron 29 将 Chromium 从 120.0.6099.56 升级到 122.0.6261.39,将 Node 从 18.18.2 升级到 20.9.0,并将 V8 从 12.0 升级到 12.2

新特性

  • 添加了新的 `webUtils` 模块,一个用于与 Web API 对象交互的实用层,以替换 `File.path` 增强。#38776
  • 添加了 net 模块到 utility process#40890
  • 添加了一个新的 Electron Fuse,`grantFileProtocolExtraPrivileges`,使 `file://` 协议采用更安全和更严格的、与 Chromium 匹配的行为。#40372
  • 在 `protocol.registerSchemesAsPrivileged` 中添加了一个选项,以允许在自定义 scheme 中使用 V8 代码缓存。#40544
  • 将 `app.{set|get}LoginItemSettings(settings)` 迁移到在 macOS 13.0+ 上使用 Apple 新推荐的底层框架。#37244

破坏性变更

行为变更:`ipcRenderer` 不再能通过 `contextBridge` 发送

尝试通过 `contextBridge` 将整个 `ipcRenderer` 模块作为对象发送,现在会在桥的接收端得到一个空对象。此更改是为了移除/减轻一个安全隐患 (security footgun)。您不应直接通过桥暴露 ipcRenderer 或其方法。相反,应提供一个安全的包装,如下所示:

contextBridge.exposeInMainWorld('app', {
onEvent: (cb) => ipcRenderer.on('foo', (e, ...args) => cb(args)),
});

已移除:`app` 上的 `renderer-process-crashed` 事件

`app` 上的 `renderer-process-crashed` 事件已被移除。请改用新的 `render-process-gone` 事件。

// Removed
app.on('renderer-process-crashed', (event, webContents, killed) => {
/* ... */
});

// Replace with
app.on('render-process-gone', (event, webContents, details) => {
/* ... */
});

已移除:`WebContents` 和 `` 上的 `crashed` 事件

`WebContents` 和 `` 上的 `crashed` 事件已被移除。请改用新的 `render-process-gone` 事件。

// Removed
win.webContents.on('crashed', (event, killed) => {
/* ... */
});
webview.addEventListener('crashed', (event) => {
/* ... */
});

// Replace with
win.webContents.on('render-process-gone', (event, details) => {
/* ... */
});
webview.addEventListener('render-process-gone', (event) => {
/* ... */
});

已移除:`app` 上的 `gpu-process-crashed` 事件

`app` 上的 `gpu-process-crashed` 事件已被移除。请改用新的 `child-process-gone` 事件。

// Removed
app.on('gpu-process-crashed', (event, killed) => {
/* ... */
});

// Replace with
app.on('child-process-gone', (event, details) => {
/* ... */
});

结束对 26.x.y 的支持

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

E29 (24年2月)E30 (24年4月)E31 (24年6月)
29.x.y30.x.y31.x.y
28.x.y29.x.y30.x.y
27.x.y28.x.y29.x.y

下一步是什么

您是否知道 Electron 最近新增了一个社区征求意见稿 (RFC) 流程?如果您想为框架添加功能,RFC 可以作为与维护者就其设计展开对话的有用工具。您还可以在拉取请求中看到正在讨论的即将进行的更改。要了解更多信息,请查看我们的《Introducing electron/rfcs》博客文章,或直接查看electron/rfcs仓库的 README。

短期内,您可以预期团队将继续专注于跟进构成 Electron 的主要组件的发展,包括 Chromium、Node 和 V8。

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

关于未来变更的更多信息可以在Planned Breaking Changes 页面找到。

引入 electron/rfcs

·阅读时长3分钟

Electron 的API 工作组正在采用开放的征求意见稿 (RFC) 流程,以帮助推进 Electron 核心的较大更改。

为什么选择 RFC?

简而言之,我们希望理顺在 Electron 核心中落地重大更改的流程。

目前,新的代码更改主要通过 GitHub 上的 issue 和 pull request 进行讨论。对于 Electron 的大多数更改来说,这是一个很好的系统。许多 bug 修复、文档更改,甚至新功能都足够直接,可以通过标准的 GitHub 流程进行异步审查和合并。

对于更重要的更改——例如,大型 API 表面或会影响大多数 Electron 应用的破坏性更改——在大多数代码编写之前,在构思阶段进行审查是有意义的。

此流程设计为对公众开放,这也将使广大开源社区更容易在潜在更改落地 Electron 之前提供反馈。

它是如何工作的?

整个 RFC 流程位于 GitHub 上的electron/rfcs仓库中。详细步骤已在该仓库的README中描述。

简而言之,一旦向 electron/rfcs 仓库提交了 PR,一个 RFC 就被提议 (Proposed)。提议的 RFC 会变成

  • 当 PR 被合并到仓库的 main 分支时,该 RFC 会变成活跃 (Active),这意味着 Electron 维护者同意在 electron/electron 中进行实现,或者
  • 如果 PR 最终被拒绝,则该 RFC 会变成已拒绝 (Declined)
提示

为了使 RFC 变为活跃 (Active),PR 必须获得至少 2 名 API 工作组成员的批准。合并之前,RFC 应进行同步展示,并获得至少三分之二的工作组成员法定人数的一致同意。如果达成共识,将触发一个月的最终评论期,之后 PR 将被合并。

如果实现已合并到 electron/electron 中,则活跃的 RFC 状态变为已完成 (Completed)

谁可以参与?

Electron 社区的任何人都可以提交 RFC 或在 electron/rfcs 仓库中留下反馈!

我们希望使这个流程成为双向对话,并鼓励社区参与,以从未来可能使用这些 API 的 Electron 应用中获得多样化的意见。如果您有兴趣对当前提议的 RFC 留下反馈,Electron 维护者已经创建了几个

致谢

Electron 的 RFC 流程借鉴了许多成熟的开源 RFC 流程。许多想法和大部分文案的灵感来自

关于 "runAsNode" CVE 的声明

·阅读时长4分钟

今天早些时候,Electron 团队接到通知,有几个公共的 CVE 最近针对一些知名的 Electron 应用被提交。这些 CVE 与 Electron 的两个熔断器 (fuses) 相关 - runAsNodeenableNodeCliInspectArguments - 并且错误地声称如果这些组件没有被主动禁用,远程攻击者可以通过它们执行任意代码。

我们认为这些 CVE 并非出于善意提交。首先,声明是不正确的 - 该配置并允许远程代码执行。其次,尽管这些 CVE 中提到的公司拥有漏洞悬赏计划,但它们并未被通知。最后,虽然我们认为禁用这些组件确实能增强应用安全性,但我们认为 CVE 的严重性等级不正确。“严重 (Critical)”等级专用于最高危险的问题,而这里显然不是这种情况。

任何人都可以申请 CVE。虽然这有利于软件行业的整体健康,但“刷 CVE”以提升某位安全研究人员的声誉是毫无帮助的。

尽管如此,我们理解仅仅存在一个带有“严重 (critical)”危险等级的可怕 CVE 可能会导致最终用户混淆,因此作为一个项目,我们愿意提供指导和协助来处理这个问题。

这会如何影响我?

审查 CVE 后,Electron 团队认为这些 CVE 并不严重。

攻击者需要已经能够在机器上执行任意命令,要么通过物理访问硬件,要么已经实现完全的远程代码执行。这一点需要重复强调:描述的漏洞要求攻击者已经拥有被攻击系统的访问权限

例如,Chrome 不认为物理本地攻击在其威胁模型内

我们认为这些攻击超出了 Chrome 的威胁模型,因为 Chrome(或任何应用程序)无法防御已经设法以您的身份登录设备,或能够以您的操作系统用户帐户权限运行软件的恶意用户。此类攻击者可以修改可执行文件和 DLL,更改像 PATH 这样的环境变量,更改配置文件,读取您的用户帐户拥有的任何数据,将其通过电子邮件发送给自己等等。此类攻击者对您的设备拥有完全控制权,Chrome 无能为力提供严肃的防御保证。这个问题并非 Chrome 所特有 — 所有应用程序都必须信任物理本地用户。

CVE 中描述的漏洞允许攻击者将受影响的应用用作具有继承 TCC 权限的通用 Node.js 进程。因此,如果该应用例如已被授予访问地址簿的权限,攻击者就可以将该应用作为 Node.js 运行并执行任意代码,这些代码将继承该地址簿访问权限。这通常被称为“利用现有资源 (living off the land)”攻击。攻击者通常使用 PowerShell、Bash 或类似工具来运行任意代码。

我是否受到影响?

默认情况下,所有已发布的 Electron 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您未按照Electron 熔断器文档中的说明将其关闭,您的应用同样容易受到被用作“利用现有资源”攻击的影响。再次强调,我们需要强调攻击者需要已经能够在受害者机器上执行代码和程序。

缓解措施

缓解此问题的最简单方法是在您的 Electron 应用中禁用 runAsNode 熔断器。runAsNode 熔断器会切换是否尊重 ELECTRON_RUN_AS_NODE 环境变量。有关如何切换这些熔断器的信息,请参阅Electron 熔断器文档

请注意,如果禁用此熔断器,主进程中的 process.fork 将无法按预期工作,因为它依赖此环境变量才能正常运行。作为替代,我们建议您使用实用进程 (Utility Processes),它适用于许多需要独立 Node.js 进程的使用场景(例如 Sqlite 服务器进程或类似情况)。

有关 Electron 应用的安全最佳实践,您可以在我们的安全检查清单中找到更多信息。

Electron 28.0.0

·阅读时长3分钟

Electron 28.0.0 已发布!它包括对 Chromium 120.0.6099.56、V8 12.0 和 Node.js 18.18.2 的升级。


Electron 团队很高兴宣布 Electron 28.0.0 发布!您可以使用 npm 安装它,命令为 npm install electron@latest;或者从我们的发布网站下载。请继续阅读以了解有关此版本的详细信息。

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区 Discord!错误和功能请求可以在 Electron 的问题跟踪器中报告。

显著变更

亮点

  • 实现了对 ECMAScript 模块或 ESM 的支持(什么是 ECMAScript 模块?在此了解更多)。这包括在 Electron 本身以及 UtilityProcess API 入口点等区域中对 ESM 的支持。请参阅我们的 ESM 文档了解更多详细信息。
  • 除了在 Electron 本身中启用 ESM 支持外,Electron Forge 也支持使用 ESM 打包、构建和开发 Electron 应用。您可以在Forge v7.0.0 或更高版本中找到此支持。

堆栈变更

新特性

  • 启用 ESM 支持。#37535
  • UtilityProcess API 添加了 ESM 入口点。#40047
  • display 对象添加了多个属性,包括 detectedmaximumCursorSizenativeOrigin#40554
  • 在 Linux 上添加了对 ELECTRON_OZONE_PLATFORM_HINT 环境变量的支持。#39792

破坏性变更

行为变更:WebContents.backgroundThrottling 设置为 false 会影响宿主 BrowserWindow 中的所有 WebContents

WebContents.backgroundThrottling 设置为 false 将禁用 BrowserWindow 中显示的所有 WebContents 的帧限制。

已移除:BrowserWindow.setTrafficLightPosition(position)

BrowserWindow.setTrafficLightPosition(position) 已被移除,应使用 BrowserWindow.setWindowButtonPosition(position) API 代替,该 API 接受 null 而不是 { x: 0, y: 0 } 来将位置重置为系统默认。

// Removed in Electron 28
win.setTrafficLightPosition({ x: 10, y: 10 });
win.setTrafficLightPosition({ x: 0, y: 0 });

// Replace with
win.setWindowButtonPosition({ x: 10, y: 10 });
win.setWindowButtonPosition(null);

已移除:BrowserWindow.getTrafficLightPosition()

BrowserWindow.getTrafficLightPosition() 已被移除,应使用 BrowserWindow.getWindowButtonPosition() API 代替,该 API 在没有自定义位置时返回 null 而不是 { x: 0, y: 0 }

// Removed in Electron 28
const pos = win.getTrafficLightPosition();
if (pos.x === 0 && pos.y === 0) {
// No custom position.
}

// Replace with
const ret = win.getWindowButtonPosition();
if (ret === null) {
// No custom position.
}

已移除:ipcRenderer.sendTo()

ipcRenderer.sendTo() API 已被移除。应通过在渲染器之间设置一个MessageChannel 来替代。

IpcRendererEventsenderIdsenderIsMainFrame 属性也已被移除。

已移除:app.runningUnderRosettaTranslation

app.runningUnderRosettaTranslation 属性已被移除。请改用 app.runningUnderARM64Translation

// Removed
console.log(app.runningUnderRosettaTranslation);
// Replace with
console.log(app.runningUnderARM64Translation);

结束对 25.x.y 的支持

根据项目的支持策略,Electron 25.x.y 已达到支持结束日期。建议开发者和应用升级到更高版本的 Electron。

E28 (23 年 12 月)E29 (24年2月)E30 (24年4月)
28.x.y29.x.y30.x.y
27.x.y28.x.y29.x.y
26.x.y27.x.y28.x.y

下一步是什么

短期内,您可以预期团队将继续专注于跟进构成 Electron 的主要组件的发展,包括 Chromium、Node 和 V8。

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

关于未来变更的更多信息可以在Planned Breaking Changes 页面找到。

2023 生态系统回顾

·阅读时长 5 分钟

回顾 Electron 开发者生态系统在 2023 年的改进和变化。


在过去几个月里,我们在 Electron 生态系统进行了大量改动,以大幅提升 Electron 应用的开发者体验!以下是来自 Electron 总部的最新新增功能速览。

Electron Forge 7 及更高版本

Electron Forge 7——我们用于打包和分发 Electron 应用的一体化工具的最新主要版本——现已发布。

Forge 6 是对 v5 的完全重写,而 v7 范围较小,但仍包含一些破坏性更改。未来,如果需要进行破坏性更改,我们将继续发布 Forge 的主要版本。

更多详情,请参阅 GitHub 上的完整Forge v7.0.0 变更日志

破坏性更改

  • 切换到 notarytool 进行 macOS 公证:自 2023 年 11 月 1 日起,Apple 淘汰了用于 macOS 公证的旧版 altool,此版本将其从 Electron Forge 中完全移除。
  • 最低 Node.js 版本提升至 v16.4.0:此版本将所需的最低 Node.js 版本设置为 16.4.0。
  • 放弃支持 electron-prebuiltelectron-prebuilt-compileelectron-prebuilt 是 Electron npm 模块的原始名称,但在 v1.3.1 中被 electron 替换。electron-prebuilt-compile 是该二进制文件的替代品,提供了增强的开发者体验功能,但最终被放弃。

亮点

  • Google Cloud Storage 发布器作为我们更好支持静态自动更新的推动的一部分,Electron Forge 现在支持直接发布到 Google Cloud Storage!
  • 支持 ESM forge.config.jsElectron Forge 现在支持 ESM 格式的 forge.config.js 文件。(附注:敬请期待 Electron 28 中对 ESM 入口点的支持。)
  • Makers 现在并行运行在 Electron Forge 6 中,出于 ✨ 传统 ✨ 原因,Makers 是顺序运行的。自那以后,我们测试了 Make 步骤的并行化,没有发现不良副作用,因此当为同一平台构建多个目标时,您应该会看到速度提升!
谢谢!

🙇 感谢mahnunchik 对 Forge 配置中 GCS 发布器和 ESM 支持的贡献!

更好的静态存储自动更新

Squirrel.Windows 和 Squirrel.Mac 是平台特定的更新技术,支持 Electron 内置的 autoUpdater 模块。这两个项目都通过两种方法支持自动更新

  • 兼容 Squirrel 的更新服务器
  • 托管在静态存储提供商(例如 AWS、Google Cloud Platform、Microsoft Azure 等)上的清单 URL

更新服务器方法传统上是 Electron 应用的推荐方法(并提供更新逻辑的额外自定义),但它有一个主要缺点——如果应用是闭源的,它需要维护自己的服务器实例。

另一方面,静态存储方法一直都是可能的,但在 Electron 内部没有文档记录,并且在 Electron 工具包中支持不佳。

通过 @MarshallOfSound 的出色工作,无服务器自动应用更新的更新故事得到了大幅简化

  • Electron Forge 的 Zip 和 Squirrel.Windows makers 现在可以配置为输出兼容 autoUpdater 的更新清单。
  • 新的主要版本 update-electron-app (v2.0.0) 现在可以读取这些生成的清单,作为 update.electronjs.org 服务器的替代方案。

一旦您的 Makers 和 Publishers 配置为将更新清单上传到云文件存储,只需几行配置即可启用自动更新

const { updateElectronApp, UpdateSourceType } = require('update-electron-app');

updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-manifest.url/${process.platform}/${process.arch}`,
},
});
延伸阅读

📦 想了解更多?有关详细指南,请参阅Forge 的自动更新文档

@electron/ 扩展宇宙

Electron 刚开始时,社区发布了许多包来增强 Electron 应用的开发、打包和分发体验。随着时间的推移,其中许多包被纳入 Electron 的 GitHub 组织,由核心团队承担维护负担。

2022 年,我们开始在 npm 上将所有这些第一方工具统一到 @electron/ 命名空间下。这意味着以前名为 electron-foo 的包现在在 npm 上是 @electron/foo,以前名为 electron/electron-foo 的仓库现在在 GitHub 上是 electron/foo。这些更改有助于明确区分第一方项目和用户项目。这包括许多常用的包,例如

  • @electron/asar
  • @electron/fuses
  • @electron/get
  • @electron/notarize
  • @electron/osx-sign
  • @electron/packager
  • @electron/rebuild
  • @electron/remote
  • @electron/symbolicate-mac
  • @electron/universal

今后,我们发布的所有第一方包也将位于 @electron/ 命名空间下。此规则有两个例外

  • Electron 核心将继续在 electron 包下发布。
  • Electron Forge 将继续在 @electron-forge/ 命名空间下发布其所有 monorepo 包。
求星

⭐ 在此过程中,我们还意外地将 electron/packager 仓库设为私有,这带来了不幸的副作用——擦除了我们的 GitHub star 计数(在擦除前超过 9000 个)。如果您是 Packager 的活跃用户,我们将非常感谢您点亮一颗 ⭐  ⭐!

介绍 @electron/windows-sign

自 2023 年 6 月 1 日起,行业标准开始要求 Windows 代码签名证书的密钥存储在符合 FIPS 标准的硬件上。

实际上,这意味着对于在 CI 环境中构建和签名的应用来说,代码签名变得困难得多,因为许多 Electron 工具将证书文件和密码作为配置参数,并尝试使用硬编码的逻辑从那里进行签名。

这种情况一直是 Electron 开发者的一个常见痛点,这就是为什么我们一直在努力寻找更好的解决方案,将 Windows 代码签名隔离成一个独立的步骤,类似于 @electron/osx-sign 在 macOS 上所做的工作。

未来,我们计划将此包完全集成到 Electron Forge 工具链中,但它目前独立存在。该包现已可用,可通过 npm install --save-dev @electron/windows-sign 安装,并且可以通过编程方式或 CLI 使用。

请试用一下,并在仓库的 issue 跟踪器中向我们提供您的反馈!

接下来是什么?

下个月我们将进入年度的十二月静默期。在此期间,我们将思考如何在 2024 年让 Electron 的开发体验变得更好。

您希望我们接下来做些什么?请告诉我们!

12月安静月 (23年12月)

·阅读时长 2 分钟

Electron 项目将在 2023 年 12 月暂停活动,然后于 2024 年 1 月恢复全速运行。

via GIPHY


十二月会照常进行的事务

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

十二月会不同的事务

  1. Electron 28.0.0 将于 12 月 5 日发布。Electron 28 之后,十二月将不再有新的稳定版本发布。
  2. 十二月的最后两周没有 Nightly 和 Alpha 版本发布。
  3. 除少数例外,没有拉取请求的评审或合并。
  4. 任何仓库上的 issue 跟踪器都没有更新。
  5. 维护者不再在 Discord 上提供调试帮助。
  6. 没有社交媒体内容更新。

展望未来

这是我们运行静默期实验的第三年,到目前为止,我们在平衡休息一个月与之后维持正常发布节奏方面取得了很大成功。因此,我们决定将此作为我们发布日历的固定部分。我们仍然会在每年的最后一个稳定版本中添加提醒。

2024 年见!

Electron 27.0.0

·阅读时长3分钟

Electron 27.0.0 已发布!它包括对 Chromium 118.0.5993.32、V8 11.8 和 Node.js 18.17.1 的升级。


Electron 团队很高兴宣布 Electron 27.0.0 发布!您可以使用 npm 安装它,命令为 npm install electron@latest;或者从我们的发布网站下载。请继续阅读以了解有关此版本的详细信息。

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区 Discord!错误和功能请求可以在 Electron 的问题跟踪器中报告。

显著变更

堆栈变更

破坏性变更

已移除:支持 macOS 10.13 / 10.14

macOS 10.13 (High Sierra) 和 macOS 10.14 (Mojave) 不再受 Chromium 支持。

旧版 Electron 将继续在这些操作系统上运行,但运行 Electron v27.0.0 及更高版本将需要 macOS 10.15 (Catalina) 或更高版本。

已弃用:ipcRenderer.sendTo()

ipcRenderer.sendTo() API 已被弃用。应通过在渲染器之间设置一个MessageChannel 来替代。

IpcRendererEventsenderIdsenderIsMainFrame 属性也已被弃用。

已移除:systemPreferences 中的配色方案事件

以下 systemPreferences 事件已移除

  • inverted-color-scheme-changed
  • high-contrast-color-scheme-changed

请改用 nativeTheme 模块上的新 updated 事件。

// Removed
systemPreferences.on('inverted-color-scheme-changed', () => {
/* ... */
});
systemPreferences.on('high-contrast-color-scheme-changed', () => {
/* ... */
});

// Replace with
nativeTheme.on('updated', () => {
/* ... */
});

已移除:webContents.getPrinters

webContents.getPrinters 方法已移除。请改用 webContents.getPrintersAsync

const w = new BrowserWindow({ show: false });

// Removed
console.log(w.webContents.getPrinters());
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers);
});

已移除:systemPreferences.{get,set}AppLevelAppearancesystemPreferences.appLevelAppearance

systemPreferences.getAppLevelAppearancesystemPreferences.setAppLevelAppearance 方法以及 systemPreferences.appLevelAppearance 属性已移除。请改用 nativeTheme 模块。

// Removed
systemPreferences.getAppLevelAppearance();
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.appLevelAppearance;
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.setAppLevelAppearance('dark');
// Replace with
nativeTheme.themeSource = 'dark';

已移除:systemPreferences.getColoralternate-selected-control-text

systemPreferences.getColoralternate-selected-control-text 值已移除。请改用 selected-content-background

// Removed
systemPreferences.getColor('alternate-selected-control-text');
// Replace with
systemPreferences.getColor('selected-content-background');

新特性

  • 添加了应用辅助功能透明度设置 API #39631
  • 添加了对 chrome.scripting 扩展 API 的支持 #39675
  • 默认启用 WaylandWindowDecorations #39644

结束对 24.x.y 的支持

根据项目的支持策略,Electron 24.x.y 已达到支持结束日期。建议开发者和应用升级到更高版本的 Electron。

E27 (23 年 10 月)E28 (23 年 12 月)E29 (24年2月)
27.x.y28.x.y29.x.y
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y

结束对 22.x.y 的扩展支持

今年早些时候,Electron 团队将 Electron 22 计划的生命周期结束日期从 2023 年 5 月 30 日延长到 2023 年 10 月 10 日,以匹配 Chrome 对 Windows 7/8/8.1 的扩展支持(详情请参阅告别 Windows 7/8/8.1)。

根据项目的支持策略和此支持扩展,Electron 22.x.y 已达到支持结束日期。这将使支持版本回退到最新的三个稳定主要版本,并结束对 Windows 7/8/8.1 的官方支持。

下一步是什么

短期内,您可以预期团队将继续专注于跟进构成 Electron 的主要组件的发展,包括 Chromium、Node 和 V8。

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

关于未来变更的更多信息可以在Planned Breaking Changes 页面找到。