跳转到主要内容

Electron 33.0.0

·阅读时长 5 分钟

Electron 33.0.0 现已发布!此版本升级到了 Chromium 130.0.6723.44、V8 13.0 和 Node 20.18.0。


Electron 团队很高兴地宣布发布 Electron 33.0.0!您可以通过 npm install electron@latest 使用 npm 进行安装,或者从我们的 发布网站 下载。请继续阅读以获取此版本详情。

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

重要变更

亮点

  • 添加了一个处理程序 app.setClientCertRequestPasswordHandler(handler),用于在需要 PIN 码时帮助解锁加密设备。#41205
  • 扩展了 navigationHistory API,新增了 2 个函数以实现更好的历史记录管理。#42014
  • 改进了原生主题透明度检查。#42862

技术栈变更

Electron 33 将 Chromium 从 128.0.6613.36 升级到 130.0.6723.44,Node 从 20.16.0 升级到 20.18.0,V8 从 12.8 升级到 13.0

新特性

  • 添加了一个处理程序 app.setClientCertRequestPasswordHandler(handler),用于在需要 PIN 码时帮助解锁加密设备。#41205
  • 在 utility process 中添加了 error 事件,以支持对 V8 致命错误的诊断报告。#43997
  • 添加了 View.setBorderRadius(radius),用于自定义视图的边框圆角,并兼容 WebContentsView#42320
  • 扩展了 navigationHistory API,新增了 2 个函数以实现更好的历史记录管理。#42014

破坏性变更

移除:对 macOS 10.15 的支持

Chromium 不再支持 macOS 10.15 (Catalina)。

旧版本的 Electron 将继续在 Catalina 上运行,但运行 Electron v33.0.0 及更高版本需要 macOS 11 (Big Sur) 或更高版本。

行为变更:原生模块现在需要 C++20

由于上游的变更,V8Node.js 现在都需要 C++20 作为最低版本。使用原生 Node.js 模块的开发者应该使用 --std=c++20 而不是 --std=c++17 来编译他们的模块。使用 gcc9 或更低版本的图像可能需要更新到 gcc10 才能进行编译。有关更多详细信息,请参阅 #43555

行为变更:Windows 上的自定义协议 URL 处理

由于 Chromium 进行了变更以支持 非特殊方案 URL,使用 Windows 文件路径的自定义协议 URL 将不再能正确地与已弃用的 protocol.registerFileProtocol 以及 BrowserWindow.loadURLWebContents.loadURL<webview>.loadURL 上的 baseURLForDataURL 属性配合使用。protocol.handle 也将无法与这些类型的 URL 一起使用,但这并不是一个变更,因为它一直都是这样工作的。

// No longer works
protocol.registerFileProtocol('other', () => {
callback({ filePath: '/path/to/my/file' });
});

const mainWindow = new BrowserWindow();
mainWindow.loadURL(
'data:text/html,<script src="loaded-from-dataurl.js"></script>',
{ baseURLForDataURL: 'other://C:\\myapp' },
);
mainWindow.loadURL('other://C:\\myapp\\index.html');

// Replace with
const path = require('node:path');
const nodeUrl = require('node:url');
protocol.handle(other, (req) => {
const srcPath = 'C:\\myapp\\';
const reqURL = new URL(req.url);
return net.fetch(
nodeUrl.pathToFileURL(path.join(srcPath, reqURL.pathname)).toString(),
);
});

mainWindow.loadURL(
'data:text/html,<script src="loaded-from-dataurl.js"></script>',
{ baseURLForDataURL: 'other://' },
);
mainWindow.loadURL('other://index.html');

行为变更:`app` 的 `login` 事件上的 `webContents` 属性

当 `app` 的 `login` 事件由使用 respondToAuthRequestsFromMainProcess 选项创建的 utility process 触发请求时,`webContents` 属性将为 null

已弃用:BrowserWindowConstructorOption.type 中的 textured 选项

BrowserWindowConstructorOptionstypetextured 选项已被弃用,没有替代方案。该选项依赖于 macOS 上的 NSWindowStyleMaskTexturedBackground 样式掩码,该掩码已被弃用且没有替代方案。

已弃用:systemPreferences.accessibilityDisplayShouldReduceTransparency

systemPreferences.accessibilityDisplayShouldReduceTransparency 属性现已废弃,推荐使用新的 nativeTheme.prefersReducedTransparency,它提供相同的信息并且可以跨平台工作。

// Deprecated
const shouldReduceTransparency =
systemPreferences.accessibilityDisplayShouldReduceTransparency;

// Replace with:
const prefersReducedTransparency = nativeTheme.prefersReducedTransparency;

终止对 30.x.y 版本的支持

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

E33 (24年10月)E34 (25年1月)E35 (25年4月)
33.x.y34.x.y35.x.y
32.x.y33.x.y34.x.y
31.x.y32.x.y33.x.y

下一步计划

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

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

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

API 历史记录功能介绍 (GSoC 2024)

·8 分钟阅读

Electron API 的历史变更现在将在文档中详细说明。


你好 👋,我是 Peter,2024 年 Google Summer of Code (GSoC) 的 Electron 贡献者。

在 GSoC 项目期间,我为 Electron 文档及其函数、类等实现了 API 历史功能,其方式与 Node.js 文档 类似:通过允许在 API 文档 Markdown 文件中使用简单但功能强大的 YAML 模式,并将其美观地显示在 Electron 文档网站上。

Electron 32.0.0

·阅读时长 5 分钟

Electron 32.0.0 已发布! 此版本包含了对 Chromium 128.0.6613.36、V8 12.8 和 Node 20.16.0 的升级。


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

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

重要变更

亮点

  • 在我们的文档中新增了 API 版本历史,这项功能由 @piotrpdev 作为 Google Summer of Code 的一部分创建。您可以在这篇博文中了解更多信息。 #42982
  • 从 Web File API 中移除了非标准的 File.path 扩展。#42053
  • 当尝试在被阻止的路径中打开文件或目录时,Web 文件系统 API 中的失败路径已与上游保持一致。 #42993
  • 将以下现有导航相关 API 添加到 webcontents.navigationHistorycanGoBackgoBackcanGoForwardgoForwardcanGoToOffsetgoToOffsetclear。以前的导航 API 现已弃用。#41752

技术栈变更

Electron 32 将 Chromium 从 126.0.6478.36 升级到 128.0.6613.36,Node 从 20.14.0 升级到 20.16.0,V8 从 12.6 升级到 12.8

新特性

  • 增加了对通过 app 模块的 'login' 事件响应从实用进程发起的认证请求的支持。#43317
  • cumulativeCPUUsage 属性添加到 CPUUsage 结构中,该属性返回自进程启动以来使用的 CPU 时间总秒数。#41819
  • 将以下现有导航相关 API 添加到 webContents.navigationHistorycanGoBackgoBackcanGoForwardgoForwardcanGoToOffsetgoToOffsetclear#41752
  • 扩展了 WebContentsView 以接受预先存在的 webContents 对象。#42086
  • nativeTheme 添加了一个新属性 prefersReducedTransparency,它指示用户是否已通过系统辅助功能设置选择降低操作系统级别的透明度。#43137
  • 在文件系统访问 API 中,当尝试打开被阻止路径中的文件或目录时,其失败路径与上游保持一致。#42993
  • 在 Linux 上启用了 Windows 控件覆盖 API。#42681
  • 在网络请求中启用了 zstd 压缩。#43300

破坏性变更

已移除:File.path

Web File 对象的非标准 path 属性是在 Electron 的早期版本中添加的,作为在渲染器中进行所有操作更常见时处理本地文件的便捷方法。然而,它代表了对标准的偏离,也带来了一个轻微的安全风险,因此从 Electron 32.0 开始,它已被移除,取而代之的是 webUtils.getPathForFile 方法。

// Before (renderer)
const file = document.querySelector('input[type=file]');
alert(`Uploaded file path was: ${file.path}`);
// After (renderer)
const file = document.querySelector('input[type=file]');
electron.showFilePath(file);

// After (preload)
const { contextBridge, webUtils } = require('electron');

contextBridge.exposeInMainWorld('electron', {
showFilePath(file) {
// It's best not to expose the full file path to the web content if
// possible.
const path = webUtils.getPathForFile(file);
alert(`Uploaded file path was: ${path}`);
},
});

已弃用:WebContents 上的 clearHistorycanGoBackgoBackcanGoForwardgoForwardgoToIndexcanGoToOffsetgoToOffset

WebContents 实例上的导航相关 API 现已弃用。这些 API 已移至 WebContentsnavigationHistory 属性,以提供更结构化和直观的界面来管理导航历史记录。

// Deprecated
win.webContents.clearHistory();
win.webContents.canGoBack();
win.webContents.goBack();
win.webContents.canGoForward();
win.webContents.goForward();
win.webContents.goToIndex(index);
win.webContents.canGoToOffset();
win.webContents.goToOffset(index);

// Replace with
win.webContents.navigationHistory.clear();
win.webContents.navigationHistory.canGoBack();
win.webContents.navigationHistory.goBack();
win.webContents.navigationHistory.canGoForward();
win.webContents.navigationHistory.goForward();
win.webContents.navigationHistory.canGoToOffset();
win.webContents.navigationHistory.goToOffset(index);

行为改变:userData 中的 databases 目录将被删除

如果您在 app.getPath('userData') 返回的目录中有一个名为 databases 的目录,它将在 Electron 32 首次运行时被删除。databases 目录曾被 WebSQL 使用,该功能已在 Electron 31 中移除。Chromium 现在执行一项清理操作,会删除此目录。请参阅问题 #45396

终止对 29.x.y 的支持

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

E32 (24年8月)E33 (24年10月)E34 (25年1月)
32.x.y33.x.y34.x.y
31.x.y32.x.y33.x.y
30.x.y31.x.y32.x.y

下一步计划

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

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

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

Electron 31.0.0

·阅读时长 4 分钟

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


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

如果您有任何反馈,请在 TwitterMastodon 上与我们分享,或者加入我们的社区 Discord!Bug 和功能请求可以在 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 标准 文件系统 API 的支持。 #41419
  • 扩展了 WebContentsView 以接受预先存在的 WebContents 实例。#42319
  • 在 webContents API 中新增了 navigationHistory 实例属性,并提供了 navigationHistory.getEntryAtIndex 方法,允许应用程序检索浏览历史中任意导航条目的 URL 和标题。 #41577 (同样包含在 2930 中)

破坏性变更

已移除: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 的公开时间线

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

Electron 30.0.0

·阅读时长 5 分钟

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


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

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

重要变更

亮点

  • ASAR 完整性保险丝现在在 Windows 上受支持 (#40504)
    • 如果配置不正确,现有已启用 ASAR 完整性的应用程序可能无法在 Windows 上运行。使用 Electron 打包工具的应用程序应升级到 @electron/packager@18.3.1@electron/forge@7.4.0
    • 请查看我们的ASAR 完整性教程以获取更多信息。
  • 添加了主进程模块 WebContentsViewBaseWindow,同时弃用并替换了 BrowserView (#35658)。请参阅 这篇博文 了解如何从 BrowserView 迁移到 WebContentsView
    • BrowserView 现在是 WebContentsView 的一个垫片,旧的实现已被移除。
    • 请参阅我们的 Web 嵌入文档,了解新的 WebContentsView API 与其他类似 API 的比较。
  • 实现了对 文件系统 API 的支持 (#41822)

技术栈变更

  • Chromium 124.0.6367.49
    • Chrome 124 新增功能,以及 DevTools 124 新增功能
    • Chrome 123 新增功能,以及 DevTools 123 新增功能
  • Node 20.11.1
  • V8 12.4

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

新特性

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

破坏性变更

行为变更:跨域 iframe 现在使用权限策略访问功能

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

更多信息请参阅文档

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

这个开关从未被正式记录,但在此仍会注明其移除。Chromium 本身现在对颜色空间有更好的支持,所以应该不再需要这个标志。

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

在 Electron 30 中,BrowserView 现在是新的 WebContentsView API 的一个包装器。

之前,macOS 上的 BrowserView API 的 setAutoResize 函数是基于 autoresizing 实现的,而在 Windows 和 Linux 上则使用自定义算法。对于使 BrowserView 充满整个窗口等简单用例,这两种方法的行为是相同的。但是,在更复杂的场景下,BrowserView 在 macOS 上的 autoresize 方式与其他平台不同,因为 Windows 和 Linux 的自定义调整大小算法并未完全匹配 macOS 的 autoresizing API 的行为。现在,所有平台的 autoresize 行为已统一。

如果您的应用程序使用 BrowserView.setAutoResize 来执行比让 BrowserView 充满整个窗口更复杂的操作,那么您可能已经实现了自定义逻辑来处理 macOS 上的这种行为差异。如果是这样,在 Electron 30 中,由于 autoresize 行为已一致,这些自定义逻辑将不再需要。

已移除:WebContentscontext-menuparams.inputFormType 属性

WebContentscontext-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 的公开时间线

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

2024 年谷歌编程之夏

2024 年 2 月 23 日 ·阅读时长 4 分钟

我们很高兴地宣布,Electron 已被接纳为 2024 年 Google Summer of Code (GSoC) 第 20 届的指导组织!Google Summer of Code 是一个旨在吸引新贡献者加入开源软件开发的全球性计划。

有关该项目的更多详情,请查看谷歌的 Summer of Code 主页

关于我们

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

在 Electron 核心之外,我们还致力于各种项目来维持 Electron 组织,例如:

作为 Summer of Code 的贡献者,您将与 Electron 的一些核心贡献者在 github.com/electron 旗下的众多项目之一上进行合作。

申请前

如果您对 Electron 还不熟悉,我们建议您先阅读 文档,并尝试 Electron Fiddle 中的示例。

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

npm init electron-app@latest my-app

在对代码稍加熟悉后,欢迎加入 Electron Discord 服务器上的对话。

信息

如果您是第一次参加 Google Summer of Code,或者您对开源总体来说是新手,我们建议您在与社区互动之前,先阅读 Google 的 贡献者指南 作为第一步。

起草您的提案

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

您有希望我们考虑的其他想法吗?我们也接受不在拟议项目列表中的新想法,但请确保您的方法有详尽的概述和细节。如果不确定,我们建议您选择我们列出的想法。

您的申请应包括:

  • 您的提案:一份书面文件,详细描述您计划在暑期实现的目标。
  • 您作为开发者的背景。如果您有简历,请附上一份副本。否则,请告诉我们您过去的技术经验。
    • 在某些领域缺乏经验不会使您失去资格,但这将有助于我们的导师制定计划,以最好地支持您,并确保您的暑期项目取得成功。

此处提供有关您作为 Electron 应用程序一部分应提交内容的详细指南。 请直接将提案提交至 Google Summer of Code 门户。请注意,直接发送电子邮件给 Electron 团队而非通过申请门户提交的提案将不会被视为最终提交。

如果您希望在提案方面获得更多指导,或者不确定要包含哪些内容,我们也建议您在此处遵循 Google Summer of Code 官方提案撰写建议

申请于 2024 年 3 月 18 日 开放,并于 2024 年 4 月 2 日 截止。

信息

我们的 2022 年 Google Summer of Code 实习生 @aryanshridhar 完成了出色的工作!如果您想了解 Aryan 在 Electron 度过的夏天都做了些什么,可以在 2022 年 GSoC 项目存档 中阅读他的报告。

有疑问?

如果您有本篇博文中未提及的问题,或对您的提案草稿有疑问,请发送电子邮件至 summer-of-code@electronjs.org,或查阅 GSoC 常见问题解答

资源

Electron 29.0.0

·阅读时长 5 分钟

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


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

如果您有任何反馈,请在 TwitterMastodon 上与我们分享,或者加入我们的社区 Discord!Bug 和功能请求可以在 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 FusegrantFileProtocolExtraPrivileges,它使 file:// 协议具有更安全、更严格的行为,与 Chromium 匹配。#40372
  • protocol.registerSchemesAsPrivileged 中添加了一个选项,允许在自定义方案中使用 V8 代码缓存。 #40544
  • 在 macOS 13.0+ 上,已将 app.{set|get}LoginItemSettings(settings) 迁移到使用 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 介绍

·阅读时长 4 分钟

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

为什么需要 RFC?

简而言之,我们希望能够顺利地将重大变更引入 Electron 核心。

目前,新的代码变更主要通过 GitHub 上的问题和拉取请求进行讨论。对于 Electron 的大多数变更而言,这是一个不错的系统。许多错误修复、文档变更,甚至新功能都足够直接,可以通过标准 GitHub 流程异步审查和合并。

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

此流程被设计为向公众开放,这也将使广大的开源社区更容易在潜在变更进入 Electron 之前对其提供反馈。

它是如何运作的?

整个 RFC 流程都在 GitHub 上的 electron/rfcs 仓库中。具体步骤在仓库的 README 中详细描述。

简而言之,一旦向 electron/rfcs 仓库提交了 PR,一个 RFC 就进入了提案(Proposed)阶段。一个提案中的 RFC 会进入

  • 激活(Active)状态,当该 PR 被合并到仓库的 main 分支时,这意味着 Electron 维护者们同意在 electron/electron 中实现该提案,或者
  • 拒绝(Declined)状态,如果该 PR 最终被拒绝。
信息

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

一个激活状态的 RFC 在其实现被合并到 electron/electron 后,将进入完成(Completed)状态。

谁可以参与?

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

我们希望这个过程是一个双向对话,并鼓励社区参与,以从未来可能使用这些 API 的 Electron 应用程序中获得各种意见。如果您有兴趣对当前提议的 RFC 发表反馈意见,Electron 维护者已经创建了一些

致谢

Electron 的 RFC 流程是基于许多已建立的开源 RFC 流程建模的。许多想法的灵感和主要文案部分都来自于:

关于 "runAsNode" CVE 的声明

·阅读时长 4 分钟

今天早些时候,Electron 团队收到了关于最近提交给一些知名 Electron 应用的多个公开 CVE 的通知。这些 CVE 与 Electron 的两个 fuses 相关——runAsNodeenableNodeCliInspectArguments——并且错误地声称,如果远程攻击者未主动禁用这些组件,就可以通过它们执行任意代码。

我们不认为这些 CVE 是善意提交的。首先,该声明是不正确的——该配置**不**允许远程代码执行。其次,尽管 CVE 中提到的公司设有漏洞赏金计划,但它们并未收到通知。最后,虽然我们确实认为禁用相关组件可以提高应用程序的安全性,但我们不认为这些 CVE 是以正确的严重性级别提交的。“关键”是为最高危险的漏洞保留的,而这里的情况绝非如此。

任何人都可以请求 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 Fuses 文档中的说明将其关闭,您的应用程序同样容易受到被用作“利用系统自带工具进行攻击”的攻击。再次强调,我们需要指出,攻击者需要**已经**能够在受害者的计算机上执行代码和程序。

缓解措施

缓解此问题的最简单方法是禁用 Electron 应用程序中的 runAsNode fuse。runAsNode fuse 控制是否尊重 ELECTRON_RUN_AS_NODE 环境变量。请参阅 Electron Fuses 文档,了解如何切换这些 fuses。

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

您可以在我们的 安全清单 中找到更多关于我们为 Electron 应用程序推荐的安全最佳实践信息。

Electron 28.0.0

·阅读时长 4 分钟

Electron 28.0.0 已发布! 此版本升级了 Chromium 120.0.6099.56、V8 12.0 和 Node.js 18.18.2


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

如果您有任何反馈,请在 TwitterMastodon 上与我们分享,或者加入我们的社区 Discord!Bug 和功能请求可以在 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 的公开时间线

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