跳至主要内容

Electron 33.0.0

·阅读时间:4 分钟

Electron 33.0.0 已发布!它包含 Chromium 130.0.6723.44、V8 13.0 和 Node 20.18.0 的升级。


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

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

值得注意的更改

亮点

  • 添加了一个处理程序,app.setClientCertRequestPasswordHandler(handler),以帮助在需要 PIN 时解锁加密设备。 #41205
  • 使用两个新函数扩展了 navigationHistory API,以更好地管理历史记录。 #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
  • 在实用程序进程中添加了错误事件,以支持 V8 致命错误的诊断报告。 #43997
  • 添加了 View.setBorderRadius(radius) 用于自定义视图的边框半径 - 与 WebContentsView 兼容。 #42320
  • 使用两个新函数扩展了 navigationHistory API,以更好地管理历史记录。 #42014

重大变更

移除:macOS 10.15 支持

macOS 10.15 (Catalina) 不再受 Chromium 支持。

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

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

由于上游进行的更改,V8Node.js 现在都将 C++20 作为最低版本要求。使用原生节点模块的开发人员应该使用 --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 属性

当从使用 respondToAuthRequestsFromMainProcess 选项创建的 实用程序进程 中的请求触发事件时,来自 applogin 事件中的 webContents 属性将为 null

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

BrowserWindowConstructorOptions 中的 typetextured 选项已被弃用,没有替代方案。此选项依赖于 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 (2024 年 10 月)E34 (2025 年 1 月)E35 (2025 年 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)

·阅读时间:7 分钟

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


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

在 GSoC 项目期间,我为 Electron 文档实现了 API 历史记录功能,并像 Node.js 文档 一样,为其函数、类等提供类似功能:通过允许在 API 文档的 Markdown 文件中使用简单但功能强大的 YAML 模式,并在 Electron 文档网站上以良好的方式显示。

Electron 32.0.0

·阅读时间:4 分钟

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!错误和功能请求可以在 Electron 的 问题跟踪器 中报告。

值得注意的更改

亮点

  • 在我们的文档中添加了新的 API 版本历史记录功能,该功能由 @piotrpdev 作为 Google Summer of Code 的一部分创建。您可以在 这篇博文 中了解更多信息。 #42982
  • 从 Web 文件 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
  • CPUUsage 结构添加了 cumulativeCPUUsage 属性,该属性返回自进程启动以来的总 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);

29.x.y 版本支持结束

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

E32 (2024 年 8 月)E33 (2024 年 10 月)E34 (2025 年 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

·阅读时间:3 分钟

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!错误和功能请求可以在 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 添加了选项参数。 #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 (Jun'24)E32 (2024 年 8 月)E33 (2024 年 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

·阅读时间:4 分钟

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!错误和功能请求可以在 Electron 的 问题跟踪器 中报告。

值得注意的更改

亮点

堆栈更改

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)
  • 添加了对使用 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 的包装器。

以前,BrowserView API 的 setAutoResize 函数在 macOS 上由 自动调整大小 支持,在 Windows 和 Linux 上由自定义算法支持。对于简单用例,例如使 BrowserView 填充整个窗口,这两种方法的行为是相同的。但是,在更高级的用例中,BrowserView 在 macOS 上的自动调整大小方式与在其他平台上的方式不同,因为 Windows 和 Linux 的自定义调整大小算法与 macOS 的自动调整大小 API 的行为并不完全匹配。自动调整大小行为现在已在所有平台上标准化。

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

已删除:WebContentscontext-menu 上的 params.inputFormType 属性

来自 WebContentscontext-menu 事件中 params 对象的 inputFormType 属性已被删除。请改用新的 formControlType 属性。

已删除:process.getIOCounters()

Chromium 已删除对该信息的访问权限。

27.x.y 版本支持已结束

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

E30 (Apr'24)E31 (Jun'24)E32 (2024 年 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 的公开时间线。

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

Google Summer of Code 2024

·阅读时间:4 分钟

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

有关更多计划详细信息,请查看 Google 的 Summer of Code 主页

关于我们

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

除了 Electron 核心之外,我们还参与各种项目来帮助维持 Electron 组织,例如

作为 Summer of Code 贡献者,您将在 github.com/electron 伞下参与多个项目之一,并与 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 项目档案 中阅读他的报告。

有问题吗?

如果您有任何问题,我们没有在博文中解答,或者您对提案草稿有疑问,请发送电子邮件至 [email protected] 或查看 GSoC 常见问题解答

资源

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 install electron@latest 使用 npm 安装它,也可以从我们的 发布网站 下载它。继续阅读以了解有关此版本的详细信息。

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

值得注意的更改

亮点

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

堆栈更改

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 (2024 年 2 月)E30 (Apr'24)E31 (Jun'24)
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 上的问题和拉取请求进行讨论。对于大多数 Electron 的更改,这是一个很好的系统。许多错误修复、文档更改,甚至新功能都足够简单,可以通过标准的 GitHub 流程异步进行审查和合并。

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

此流程旨在对公众开放,这也将使整个开源社区更容易在潜在更改落地到 Electron 之前对其进行反馈。

它是如何工作的?

整个 RFC 流程都在 GitHub 上的 electron/rfcs 存储库中进行。这些步骤在存储库的 README 中进行了详细说明。

简而言之,一旦对 electron/rfcs 存储库进行 PR,RFC 就成为 **Proposed**。

  • **Active** 表示当 PR 合并到存储库的 main 分支时,这意味着 Electron 维护者同意在 electron/electron 中进行实现,或者
  • **Declined** 表示如果 PR 最终被拒绝。
信息

要使 RFC 成为 **Active**,PR 必须至少获得 2 名 API 工作组成员的批准。在合并之前,RFC 应由至少三分之二的 WG 成员组成的法定人数同步提出并一致通过。如果达成共识,将触发为期一个月的最终评论期,之后 PR 将被合并。

如果实现已合并到 electron/electron 中,则 Active RFC 成为 **Completed**。

谁可以参与?

Electron 社区的任何人都可以提交 RFC 或对 electron/rfcs 存储库发表反馈!

我们希望使此流程成为双向对话,并鼓励社区参与,以从将来可能使用这些 API 的 Electron 应用程序中获得各种观点。如果您有兴趣对当前提议的 RFC 发表反馈,Electron 维护人员已经创建了一些

致谢

Electron 的 RFC 流程借鉴了许多已建立的开源 RFC 流程。许多想法和主要部分的文案灵感来自

关于 "runAsNode" CVE 的声明

·阅读时间:4 分钟

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

我们认为这些 CVE 并非出于善意。首先,该说法是不正确的 - 该配置 *不会* 启用远程代码执行。其次,尽管这些 CVE 中提到的公司拥有漏洞赏金计划,但他们却没有收到通知。最后,虽然我们确实认为禁用有问题的组件可以增强应用程序安全性,但我们认为这些 CVE 的严重程度并不正确。“Critical” 是为最高危险级别的问题保留的,这显然不是这里的情况。

任何人都可以申请 CVE。虽然这对软件行业整体健康发展有利,但“农场 CVE”来提升单个安全研究人员的声誉并没有帮助。

也就是说,我们理解 CVE 的存在,即使它带有一个可怕的“严重”级别,也可能导致最终用户的困惑,所以作为项目,我们想提供一些指导和帮助来处理这个问题。

这可能如何影响我?

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

攻击者需要已经能够在机器上执行任意命令,要么通过拥有硬件的物理访问权限,要么通过实现完全的远程代码执行。需要再次强调:所描述的漏洞 *需要攻击者已经访问了目标系统*。

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

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

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

我受到影响了吗?

默认情况下,所有发布的 Electron 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您没有按照 Electron Fuses 文档 中的说明将其关闭,您的应用程序同样容易受到“活在系统中”攻击。再次强调,攻击者需要 *已经* 能够在受害者机器上执行代码和程序。

缓解措施

缓解此问题的最简单方法是在您的 Electron 应用程序中禁用 runAsNode 保险丝。runAsNode 保险丝控制是否尊重 ELECTRON_RUN_AS_NODE 环境变量。有关如何切换这些保险丝的信息,请参阅 Electron Fuses 文档

请注意,如果此保险丝被禁用,则主进程中的 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 本身中的 ESM 的支持,以及 UtilityProcess API 入口点等领域。查看我们的 ESM 文档 以获取更多详细信息。
  • 除了在 Electron 本身中启用 ESM 支持之外,Electron Forge 还支持使用 ESM 打包、构建和开发 Electron 应用程序。您可以在 Forge v7.0.0 或更高版本中找到此支持。

堆栈更改

新功能

  • 启用了 ESM 支持。#37535
    • 有关更多详细信息,请参阅 ESM 文档
  • 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,它接受 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,它在没有自定义位置时返回 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 (2024 年 2 月)E30 (Apr'24)
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 的公开时间线。

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