跳至主要内容

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 模块添加到 实用程序进程#40890
  • 添加了一个新的 Electron FusegrantFileProtocolExtraPrivileges,它使 file:// 协议采用更安全和限制性的行为,该行为与 Chromium 匹配。#40372
  • protocol.registerSchemesAsPrivileged 中添加了一个选项,以允许在自定义方案中使用 V8 代码缓存。#40544
  • app.{set|get}LoginItemSettings(settings) 迁移到在 macOS 13.0+ 上使用 Apple 新推荐的底层框架。#37244

重大更改

行为已更改:ipcRenderer 不能再通过 contextBridge 发送

尝试通过 contextBridge 将整个 ipcRenderer 模块作为对象发送,现在会导致桥的接收端出现一个空对象。此更改是为了删除/缓解安全隐患。您不应该通过桥直接暴露 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<webview> 上的 crashed 事件

已删除 WebContents<webview> 上的 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 可以成为与维护人员就其设计展开对话的有用工具。您还可以在拉取请求中查看正在讨论的即将发生的变化。要了解更多信息,请查看我们的介绍 electron/rfcs博客文章,或直接查看 electron/rfcs 存储库的 README 文件。

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

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

有关未来变更的更多信息,请访问 计划的重大更改 页面。

介绍 electron/rfcs

·3 分钟阅读

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

为什么要使用 RFC?

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

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

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

此流程旨在向公众开放,这也将使更广泛的开源社区更容易在潜在更改进入 Electron 之前提供反馈。

它是如何工作的?

整个 RFC 流程位于 GitHub 上的 electron/rfcs 存储库中。存储库 README 中详细描述了这些步骤。

简而言之,一旦向 electron/rfcs 存储库发出 PR,RFC 即为已提议。提议的 RFC 将变为

  • 当 PR 合并到存储库的 main 分支时,即为活动,这意味着 Electron 维护人员同意在 electron/electron 中实施,或者
  • 如果 PR 最终被拒绝,则为已拒绝
信息

为了使 RFC 变为活动,PR 必须至少获得 2 名 API 工作组成员的批准。在合并之前,应同步呈现 RFC 并由至少三分之二的 WG 成员的法定人数一致接受。如果达成共识,将触发一个月的最终评论期,之后将合并 PR。

如果实现已合并到 electron/electron 中,则表示活动 RFC 已完成

谁可以参与?

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

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

致谢

Electron 的 RFC 流程是根据许多已建立的开源 RFC 流程建模的。许多想法和大部分文案的灵感来自

关于 "runAsNode" CVE 的声明

·4 分钟阅读

今天早些时候,Electron 团队收到警报,称最近针对多个著名的 Electron 应用程序提交了多个公共 CVE。这些 CVE 与 Electron 的两个熔断器 - runAsNodeenableNodeCliInspectArguments - 相关,并且错误地声称,如果未主动禁用这些组件,远程攻击者可以通过这些组件执行任意代码。

我们不认为这些 CVE 是出于善意提交的。首先,声明不正确 - 配置启用远程代码执行。其次,尽管拥有漏洞赏金计划,但这些 CVE 中提到的公司尚未收到通知。最后,虽然我们认为禁用有问题的组件可以增强应用程序安全性,但我们不认为 CVE 已以正确的严重性提交。“严重”仅保留给最高危的问题,而这里的情况显然不是这样。

任何人都可以请求 CVE。虽然这对软件行业的整体健康状况有益,“收集 CVE”以提高单个安全研究人员的声誉是无济于事的。

也就是说,我们理解仅存在具有可怕的 critical 严重性的 CVE 可能会导致最终用户感到困惑,因此作为一个项目,我们希望在处理此问题时提供指导和帮助。

这会对我产生什么影响?

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

攻击者需要已经能够在计算机上执行任意命令,或者通过物理访问硬件,或者通过实现完全的远程代码执行。这值得重复:所描述的漏洞要求攻击者已经能够访问被攻击的系统

例如,Chrome 不考虑其威胁模型中的物理本地攻击

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

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

我是否受到影响?

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

缓解

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

请注意,如果禁用此熔断器,则主进程中的 process.fork 将无法按预期运行,因为它依赖于此环境变量才能运行。相反,我们建议您使用 实用程序进程,它适用于许多需要独立 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
    • 有关更多详细信息,请参阅 ESM 文档
  • 将 ESM 入口点添加到 UtilityProcess API。#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(2023 年 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 的公共时间表

有关未来变更的更多信息,请访问 计划的重大更改 页面。

2023 年生态系统回顾

·5 分钟阅读

回顾 2023 年 Electron 开发人员生态系统中的改进和变化。


在过去的几个月中,我们一直在 Electron 生态系统中进行一些更改,以增强 Electron 应用程序的开发人员体验!以下是来自 Electron 总部的最新添加的快速概述。

Electron Forge 7 及更高版本

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

虽然 Forge 6 是从 v5 完全重写的,但 v7 的范围较小,但仍然包含一些重大更改。展望未来,当需要进行重大更改时,我们将继续发布 Forge 的主要版本。

有关更多详细信息,请参阅 GitHub 上的完整 Forge v7.0.0 更改日志

重大更改

  • 切换到 notarytool 进行 macOS 公证:截至 2023-11-01,Apple 淘汰了用于 macOS 公证的旧版 altool,此版本将其从 Electron Forge 中完全删除。
  • 最低 Node.js 版本增加到 v16.4.0:在此版本中,我们将最低要求的 Node.js 版本设置为 16.4.0。
  • 放弃对 electron-prebuiltelectron-prebuilt-compile 的支持electron-prebuilt 是 Electron 的 npm 模块的原始名称,但在 v1.3.1 中被 electron 取代。electron-prebuilt-compile 是该二进制文件的替代方案,它具有增强的 DX 功能,但最终作为一个项目被放弃。

亮点

  • Google Cloud Storage 发布器作为我们更好地支持静态自动更新的一部分,Electron Forge 现在支持直接发布到 Google Cloud Storage!
  • ESM forge.config.js 支持Electron 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 将继续在其 monorepo 软件包下发布所有 @electron-forge/ 命名空间。
寻求星星

⭐ 在此过程中,我们还意外地将 electron/packager 存储库设置为私有,这会产生不幸的副作用,即擦除了我们的 GitHub 星星数(擦除前超过 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 使用。

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

接下来是什么?

下个月我们将进入一年一度的 12 月静默期。在此期间,我们将思考如何在 2024 年使 Electron 开发体验更加出色。

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

十二月安静月(2023 年 12 月)

·2 分钟阅读

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

via GIPHY


12 月哪些将保持不变

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

12 月有哪些不同

  1. Electron 28.0.0 将于 12 月 5 日发布。在 Electron 28 之后,12 月将不会有新的稳定版本发布。
  2. 12 月最后两周不会有 Nightly 和 Alpha 版本发布。
  3. 除少数例外,不会进行拉取请求审查或合并。
  4. 任何仓库都不会更新问题跟踪器。
  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(2023 年 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 的公共时间表

有关未来变更的更多信息,请访问 计划的重大更改 页面。

突破障碍:使用沙盒增强应用

·4 分钟阅读

自从CVE-2023-4863:WebP 中的堆缓冲区溢出公开以来,已经过去了一周多,这导致了大量渲染 webp 图像的软件的新版本发布:macOS、iOS、Chrome、Firefox 和各种 Linux 发行版都收到了更新。此前,Citizen Lab 进行了调查,发现一家“位于华盛顿特区的民间社会组织”使用的 iPhone 正遭受 iMessage 中的零点击漏洞攻击。

Electron 也立即采取行动,并在同一天发布了新版本:如果您的应用程序渲染任何用户提供的内容,您应该更新您的 Electron 版本 - v27.0.0-beta.2、v26.2.1、v25.8.1、v24.8.3 和 v22.3.24 都包含修复后的 libwebp 版本,该库负责渲染 webp 图像。

现在我们都清楚地意识到,像“渲染图像”这样无辜的交互也可能存在危险,我们想借此机会提醒大家,Electron 带有进程沙箱,这将限制下一次重大攻击的影响范围——无论它是什么。

沙箱自 Electron v1 起就可用,并在 v20 中默认启用,但我们知道许多应用程序(尤其是那些已经存在一段时间的应用程序)可能在其代码中的某个地方有 sandbox: false,或者有 nodeIntegration: true,当没有显式的 sandbox 设置时,它同样会禁用沙箱。这是可以理解的:如果您陪伴我们很长时间了,您可能很喜欢将 require("child_process")require("fs") 放入运行您的 HTML/CSS 的同一代码中的能力。

在我们讨论如何迁移到沙箱之前,我们先讨论一下为什么您需要它。

沙箱在所有渲染器进程周围设置了一个硬性围栏,确保无论内部发生什么,代码都在受限制的环境中执行。作为一个概念,它比 Chromium 早得多,并且是所有主要操作系统提供的一项功能。Electron 和 Chromium 的沙箱建立在这些系统功能之上。即使您从不显示用户生成的内容,您也应该考虑您的渲染器可能被破坏的可能性:诸如供应链攻击等复杂场景以及诸如小错误等简单场景都可能导致您的渲染器执行您不完全打算让它执行的事情。

沙箱使得这种情况不再那么可怕:沙箱内的进程可以自由使用 CPU 周期和内存 — 仅此而已。进程无法写入磁盘或显示自己的窗口。对于我们的 libwep 漏洞,沙箱确保攻击者无法安装或运行恶意软件。事实上,在最初针对员工 iPhone 的 Pegasus 攻击中,该攻击专门针对未沙箱化的图像进程来获取手机访问权限,首先突破了通常沙箱化的 iMessage 的边界。当像本例中的 CVE 被公布时,您仍然需要将您的 Electron 应用程序升级到安全版本,但与此同时,攻击者可能造成的损害会大大减少。

将一个普通的 Electron 应用程序从 sandbox: false 迁移到 sandbox: true 是一项艰巨的任务。我知道,因为即使我亲自撰写了 Electron 安全指南 的初稿,我也未能将我自己的应用程序迁移到使用它。这个周末情况发生了变化,我建议您也做出改变。

Don’t be scared by the number of line changes, most of it is in package-lock.json

您需要解决两件事

  1. 如果您在 preload 脚本或实际的 WebContents 中使用 Node.js 代码,则需要将所有 Node.js 交互移动到主进程(或者,如果您喜欢,可以移动到实用程序进程)。考虑到渲染器现在的功能非常强大,您的绝大多数代码可能并不需要进行重构。

    请参阅我们关于进程间通信的文档。在我的例子中,我移动了很多代码,并将其包装在 ipcRenderer.invoke()ipcMain.handle() 中,但这个过程非常简单,而且很快就完成了。请稍微注意一下这里的 API - 如果您构建了一个名为 executeCodeAsRoot(code) 的 API,沙箱将无法很好地保护您的用户。

  2. 由于启用沙箱会禁用预加载脚本中的 Node.js 集成,因此您不再能够使用 require("../my-script")。换句话说,您的预加载脚本需要是单个文件。

    有多种方法可以做到这一点:Webpack、esbuild、parcel 和 rollup 都可以完成这项工作。我使用了 Electron Forge 出色的 Webpack 插件,同样受欢迎的 electron-builder 用户可以使用 electron-webpack

总而言之,整个过程花了我大约四天的时间,这其中还包括很多绞尽脑汁思考如何驾驭 Webpack 的强大功能,因为我决定借此机会从其他方面重构我的代码。

Electron 26.0.0

·2 分钟阅读

Electron 26.0.0 已发布!它包括对 Chromium 116.0.5845.62、V8 11.2 和 Node.js 18.16.1 的升级。请阅读以下内容了解更多详情!


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

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

值得注意的更改

堆栈更改

重大更改

已弃用:webContents.getPrinters

webContents.getPrinters 方法已被弃用。请改用 webContents.getPrintersAsync

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

// Deprecated
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 模块。

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

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

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

已弃用:systemPreferences.getColoralternate-selected-control-text

systemPreferences.getColoralternate-selected-control-text 值已被弃用。请改用 selected-content-background

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

新功能

  • 添加了 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend api。#39107
  • 添加了 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend api。#39155
  • 为通过 ipcRenderer.sendTo() 发送的消息添加了 senderIsMainFrame#39206
  • 添加了对将菜单标记为键盘启动的支持。#38954

对 23.x.y 的支持结束

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

E26 (23 年 8 月)E27 (23 年 10 月)E28 (24 年 1 月)
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
22.x.y

下一步

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

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

有关未来变更的更多信息,请访问 计划的重大更改 页面。

Electron 25.0.0

·5 分钟阅读

Electron 25.0.0 已发布!它包括对 Chromium 114、V8 11.4 和 Node.js 18.15.0 的升级。请阅读以下内容了解更多详情!


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

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

值得注意的更改

亮点

  • 在 Electron 的 net 模块中实现了 net.fetch,它使用 Chromium 的网络堆栈。这与使用 Node.js 的 HTTP 堆栈的 Node 的 fetch() 不同。请参阅#36733#36606
  • 添加了 protocol.handle,它取代并弃用了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • 为了与 Chromium 和微软的 Windows 7/8/8.1 弃用计划相匹配,扩展了对 Electron 22 的支持。请查看此博客文章末尾的更多详细信息。

堆栈更改

重大更改

已弃用:protocol.{register,intercept}{Buffer,String,Stream,File,Http}Protocol

protocol.register*Protocolprotocol.intercept*Protocol 方法已被protocol.handle取代。

新方法可以注册新协议或拦截现有协议,并且响应可以是任何类型。

// Deprecated in Electron 25
protocol.registerBufferProtocol('some-protocol', () => {
callback({ mimeType: 'text/html', data: Buffer.from('<h5>Response</h5>') });
});

// Replace with
protocol.handle('some-protocol', () => {
return new Response(
Buffer.from('<h5>Response</h5>'), // Could also be a string or ReadableStream.
{ headers: { 'content-type': 'text/html' } },
);
});
// Deprecated in Electron 25
protocol.registerHttpProtocol('some-protocol', () => {
callback({ url: 'https://electron.js.cn' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('https://electron.js.cn');
});
// Deprecated in Electron 25
protocol.registerFileProtocol('some-protocol', () => {
callback({ filePath: '/path/to/my/file' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('file:///path/to/my/file');
});

已弃用:BrowserWindow.setTrafficLightPosition(position)

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

// Deprecated in Electron 25
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 }

// Deprecated in Electron 25
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.
}

新功能

  • 添加了 net.fetch()#36733
    • net.fetch 支持对 file: URL 和使用 protocol.register*Protocol 注册的自定义协议的请求。#36606
  • 添加了 BrowserWindow.set/getWindowButtonPosition API。#37094
  • 添加了 protocol.handle,取代并弃用了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • webContents<webview> 标签添加了 will-frame-navigate 事件,只要帧层次结构中的任何帧尝试导航,就会触发该事件。#34418
  • 为导航器事件添加了发起者信息。此信息允许区分 window.open 与父帧导致导航,而不是由子项发起的导航。#37085
  • 添加了使用 defaultSession 对象解析主机的 net.resolveHost。#38152
  • app 添加了新的“did-resign-active”事件。#38018
  • webContents.print() 添加了几个标准页面尺寸选项。#37159
  • 为会话处理程序 ses.setDisplayMediaRequestHandler() 回调添加了 enableLocalEcho 标志,以便在 audioWebFrameMain 时,允许在本地输出流中回显远程音频输入。#37315
  • powerMonitor 添加了热管理信息。#38028
  • 允许将绝对路径传递给 session.fromPath() API。#37604
  • webContents 上公开了 audio-state-changed 事件。#37366

22.x.y 继续支持

正如告别 Windows 7/8/8.1 中所述,Electron 22 (Chromium 108) 计划的生命周期结束日期将从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日。Electron 团队将继续将此计划中的任何安全修复程序反向移植到 Electron 22,直到 2023 年 10 月 10 日。10 月份的支持日期遵循 Chromium 和 Microsoft 的延长支持日期。10 月 11 日,Electron 团队将停止支持到最新的三个稳定主要版本,这些版本将不再支持 Windows 7/8/8.1。

E25 (23年5月)E26 (23 年 8 月)E27 (23 年 10 月)
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
23.x.y24.x.y25.x.y
22.x.y22.x.y--

下一步

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

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

有关未来变更的更多信息,请访问 计划的重大更改 页面。