跳至主要内容

Electron 37.0.0

·7 分钟阅读

Electron 37.0.0 已发布!它包括 Chromium 138、V8 13.8 和 Node 22.16.0 的升级。


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

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

值得注意的更改

平滑圆角:原生 CSS 扁方圆

An image showing different corner smoothing values (0%, 30%, 60%, and 100%) applied to rectangles, with 60% labeled as matching macOS style

Electron 37 引入了自定义的 -electron-corner-smoothing CSS 属性,允许应用程序创建更平滑的圆角以匹配 Apple 的 macOS 设计语言。此功能最初在 Electron 36 中推出,但我们认为它值得更突出地展示。

代码结果
.box {
width: 128px;
height: 128px;
border-radius: 24px;
-electron-corner-smoothing: 100%;
}

与标准 border-radius 属性不同,后者从矩形中雕刻出四分之一圆角,-electron-corner-smoothing 将曲线平滑过渡为具有连续周长的扁方圆形状。

您可以使用 0% 到 100% 的值调整平滑度,或使用 system-ui 值以匹配操作系统的样式(macOS 上为 60%,否则为 0%)。此设计增强功能可应用于边框、轮廓和阴影,为您的应用增添一层微妙的精致感。

提示

@clavinRFC 0012中阅读更多关于 Electron 扁方圆实现的信息。该文档更详细地介绍了动机和技术实现。

最初的设计灵感来自 Figma 的圆角平滑实现。在《绝望地寻找扁方圆》中阅读更多关于他们自己对平滑圆角的追求。

堆栈更改

Electron 37 将 Chromium 从 136.0.7103.48 升级到 138.0.7204.35,并将 V8 从 13.6 升级到 13.8

Google 编程之夏开始

我们的两位Google 编程之夏贡献者已开始该项目的编码期!

  • @nilayarya 正在 Electron 核心中创建新的保存/恢复窗口状态 API。新的 API 将提供内置的标准化方法来处理窗口状态持久性。请参阅 Nilay 在electron/rfcs#16中的进行中 RFC。
  • @hitarth-gg 正在努力使用 Chrome Manifest V3 API 现代化长期休眠的 Devtron 扩展。此项目将为开发人员提供工具,用于调试 IPC 通信、跟踪事件侦听器以及可视化其 Electron 应用程序中的模块依赖项。

对于我们的 GSOC 参与者来说,这是令人兴奋的几周,请继续关注更多更新!

新功能和改进

  • window.open 添加了 innerWidthinnerHeight 选项。#47039(也包括在3536中)
  • 添加了 before-mouse-event 以允许在 webContents 中拦截和阻止鼠标事件。#47364(也包括在36中)
  • ServiceWorkerMain 添加了 scriptURL 属性。#45863
  • 为 macOS >= 14.4 上的菜单添加了 sublabel 功能。#47042(也包括在3536中)
  • 添加了对 HIDDevice.collections 的支持。#47483(也包括在36中)
  • 添加了对 --no-experimental-global-navigator 标志的支持。#47418(也包括在3536中)
  • 在 Linux X11 上添加了对 screen.dipToScreenPoint(point)screen.screenToDipPoint(point) 的支持。#46895(也包括在3536中)
  • 为 macOS 上的菜单项角色 paletteheader 添加了支持。#47245
  • 添加了对 node 选项 --experimental-network-inspection 的支持。#47031(也包括在3536中)
  • 暴露了 win.isContentProtected() 以允许开发人员检查窗口保护状态。#47310(也包括在36中)

重大变更

Utility Process 未处理的拒绝行为更改

Utility Processes 现在在发生未处理的拒绝时将发出错误消息警告,而不是崩溃进程。

要恢复以前的行为,您可以使用

process.on('unhandledRejection', () => {
process.exit(1);
});

行为更改:process.exit() 同步杀死 utility process

在 utility process 中调用 process.exit() 现在将同步杀死 utility process。这将 process.exit() 的行为与 Node.js 行为对齐。

请参阅 Node.js 文档PR #45690 以了解其潜在影响,例如在 process.exit() 之前调用 console.log() 时。

行为更改:WebUSB 和 WebSerial 黑名单支持

WebUSBWeb Serial 现在支持 Chromium 使用的WebUSB 黑名单Web Serial 黑名单,并在各自的规范中概述。

要禁用这些,用户可以传递 disable-usb-blocklistdisable-serial-blocklist 作为命令行标志。

已移除:ProtocolResponsesession 属性的 null

此已弃用功能已移除。

以前,将 ProtocolResponse.session 属性设置为 null 会创建一个随机的独立会话。这不再受支持。

由于开销成本,不鼓励在此处使用单用途会话;但是,需要保留此行为的旧代码可以通过使用 session.fromPartition(some_random_string) 创建随机会话,然后在 ProtocolResponse.session 中使用它来模拟此行为。

行为更改:Linux 上 BrowserWindow.IsVisibleOnAllWorkspaces()

如果窗口当前不可见,BrowserWindow.IsVisibleOnAllWorkspaces() 现在将在 Linux 上返回 false。

停止支持 34.x.y

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

E37 (2025 年 6 月)E38 (2025 年 8 月)E39 (2025 年 10 月)
37.x.y38.x.y39.x.y
36.x.y37.x.y38.x.y
35.x.y36.x.y37.x.y

下一步

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

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

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

Electron 36.0.0

·5 分钟阅读

Electron 36.0.0 已发布!它包括 Chromium 136、V8 13.6 和 Node 22.14.0 的升级。


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

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

值得注意的更改

写作工具支持

在 Electron 36 中,您可以在上下文菜单中启用 macOS 系统级功能,例如写作工具(拼写和语法)、自动填充和“服务”菜单项。为此,请将 WebFrameMain 实例传递到 menu.popup()frame 参数中。

import { BrowserWindow, Menu, WebFrameMain } from 'electron';

const currentWindow = BrowserWindow.getFocusedWindow();
const focusedFrame = currentWindow.webContents.focusedFrame;
const menu = Menu.buildFromTemplate([{ label: 'Copy', role: 'copy' }]);

menu.popup({
window: currentWindow,
frame: focusedFrame,
});

堆栈更改

Electron 36 将 Chromium 从 134.0.6998.23 升级到 136.0.7103.48,并将 V8 从 13.5 升级到 13.6

新功能和改进

  • 添加了 BrowserWindow.isSnapped(),用于指示给定窗口是否已通过 Windows 上的 Snap 进行排列。#46226
  • 添加了 WebContents.focusedFrame 以获取焦点帧。
  • 修复了 WebContents.opener 以指定潜在的 null 类型。#45667
  • ffmpeg.dll 添加到延迟加载配置中。#46173(也包括在3435中)
  • 添加了 nativeTheme.shouldUseDarkColorsForSystemIntegratedUI 以区分系统和应用程序主题。#46598(也包括在35中)
  • excludeUrls 添加到 webRequest 过滤器,并弃用了 urls 属性中使用空数组。#44692(也包括在35中)
  • 通过 menu.popup 中新的 frame 选项,添加了对上下文菜单中自动填充、写作工具和 macOS 服务级菜单项的支持。#46350
  • 添加了对 Linux 上 system-context-menu 的支持。#46399
  • 改进了 Windows 上的 ASAR 完整性检查。#46537
  • 在 macOS 上未请求缩略图时,改进了 desktopCapturer.getSources 的性能。#46251(也包括在3435中)
  • 使用共享纹理 OSR 时,移除了 240 FPS 限制。#45669(也包括在35中)

重大变更

已弃用:NativeImage.getBitmap()

NativeImage.getBitmap() 函数现已弃用,并记录为 NativeImage.toBitmap() 的别名。这两个函数都返回新分配的位图副本,功能上是等效的。

已弃用:session 上的扩展方法和事件

session.loadExtensionsession.removeExtensionsession.getExtensionsession.getAllExtensions 以及事件 extension-loadedextension-unloadedextension-ready 都已移至可通过 session.extensions 实例属性访问的新Extensions 对象

已移除:session.clearStorageData(options)quota 类型 syncable

调用 session.clearStorageData(options) 时,不再支持 options.quota 类型 syncable,因为它已从上游 Chromium 中移除

已弃用:session.clearStorageData(options) 中的 quota 属性

调用 Session.clearStorageData(options) 时,options.quota 属性已弃用。由于 syncable 类型已移除,只剩下 'temporary' 类型,因此指定它是不必要的。

行为更改:在 GNOME 上运行时 GTK 4 为默认设置

上游更改之后,GTK 4 现在是 GNOME 上运行时的默认设置。

在极少数情况下,这可能会导致某些应用程序或配置出现以下错误信息错误

Gtk-ERROR **: 11:30:38.382: GTK 2/3 symbols detected. Using GTK 2/3 and GTK 4 in the same process is not supported

受影响的用户可以通过指定 gtk-version 命令行标志来解决此问题

$ electron --gtk-version=3   # or --gtk-version=2

同样可以通过 app.commandLine.appendSwitch 函数完成。

行为更改:app.commandLine

app.commandLine 将把大写开关和参数转换为小写。

app.commandLine 仅用于处理 Chromium 开关(不区分大小写),通过 app.commandLine 传递的开关不会传递给任何子进程。

如果您使用 app.commandLine 来解析应用程序特定的命令行参数,则应通过 process.argv 来完成。

停止支持 33.x.y

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

E36 (2025 年 4 月)E37 (2025 年 6 月)E38 (2025 年 8 月)
36.x.y37.x.y38.x.y
35.x.y36.x.y37.x.y
34.x.y35.x.y36.x.y

下一步

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

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

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

Electron 35.0.0

·6 分钟阅读

Electron 35.0.0 已发布!它包括 Chromium 134.0.6998.44、V8 13.5 和 Node 22.14.0 的升级。


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

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

值得注意的更改

Service Worker 预加载脚本以改进扩展支持

Electron 35 最初由@samuelmaddockRFC #8中提出,它增加了向Service Worker附加预加载脚本的功能。随着 Chrome 的 Manifest V3 扩展将大量工作通过扩展 Service Worker路由,此功能填补了 Electron 对现代 Chrome 扩展支持的空白。

在 Session 级别以编程方式注册预加载脚本时,您现在可以使用 ses.registerPreloadScript(script) API 将其专门应用于 Service Worker 上下文。

主进程
// Add our preload realm script to the session.
session.defaultSession.registerPreloadScript({
// Our script should only run in service worker preload realms.
type: 'service-worker',
// The absolute path to the script.
script: path.join(__dirname, 'extension-sw-preload.js'),
});

此外,Service Worker 及其附加的预加载脚本之间现在可以通过 ServiceWorkerMain.ipc 类进行 IPC。预加载脚本仍将使用 ipcRenderer 模块与其 Service Worker 通信。有关更多详细信息,请参阅原始 RFC。

此功能之前有许多其他更改为其奠定了基础

  • #45329 重新设计了 Session 模块的预加载 API,以支持注册和注销单个预加载脚本。
  • #45229 添加了实验性的 contextBridge.executeInMainWorld(executionScript) 脚本,用于通过上下文桥在主世界中评估 JavaScript。
  • #45341 添加了 ServiceWorkerMain 类,用于在主进程中与 Service Worker 交互。

堆栈更改

Electron 35 将 Chromium 从 132.0.6834.83 升级到 134.0.6998.44,将 Node 从 20.18.1 升级到 22.14.0,并将 V8 从 13.2 升级到 13.5

新功能

  • Info.plist 中添加了 NSPrefersDisplaySafeAreaCompatibilityMode = false,以从应用选项中移除“缩放到内置摄像头下方”的功能。#45357 (也在v34.1.0中)
  • 添加了 ServiceWorkerMain 类以在主进程中与服务工作线程交互。#45341
    • ServiceWorkers 上添加了 running-status-changed 事件,以指示服务工作线程的运行状态何时发生变化。
    • ServiceWorkers 上添加了 startWorkerForScope 以启动可能已停止的工作线程。
  • 添加了实验性的 contextBridge.executeInMainWorld 以安全地跨世界边界执行代码。#45330
  • 'console-message' 事件添加了 frame#43617
  • 添加了 query-session-end 事件并改进了 Windows 上的 session-end 事件。#44598
  • 添加了 view.getVisible()#45409
  • 添加了 webContents.navigationHistory.restore(index, entries) API,允许恢复导航历史。#45583
  • BrowserWindow.setVibrancy 添加了可选的动画参数。#35987
  • 添加了对 document.executeCommand("paste") 的权限支持。#45471 (也在v34.1.0中)
  • 添加了对 Windows 上 roundedCorners BrowserWindow 构造函数选项的支持。#45740 (也在v34.3.0中)
  • 添加了对服务工作线程预加载脚本的支持。#45408
  • 支持 Portal 的 globalShortcuts。Electron 必须以 --enable-features=GlobalShortcutsPortal 运行,功能才能正常工作。#45297

重大变更

已移除:PrinterInfo 上的 isDefaultstatus 属性

这些属性已从 PrinterInfo 对象中移除,因为它们已从上游 Chromium 中移除。

已弃用:session.serviceWorkers 上的 getFromVersionID

session.serviceWorkers.fromVersionID(versionId) API 已弃用,取而代之的是 session.serviceWorkers.getInfoFromVersionID(versionId)。此更改旨在通过引入 session.serviceWorkers.getWorkerFromVersionID(versionId) API 来使返回的对象更清晰。

// Deprecated
session.serviceWorkers.fromVersionID(versionId);

// Replace with
session.serviceWorkers.getInfoFromVersionID(versionId);

已弃用:Session 上的 setPreloadsgetPreloads

引入了 registerPreloadScriptunregisterPreloadScriptgetPreloadScripts 作为已弃用方法的替代品。这些新的 API 允许第三方库注册预加载脚本,而无需替换现有脚本。此外,新的 type 选项允许除了 frame 之外的更多预加载目标。

// Deprecated
session.setPreloads([path.join(__dirname, 'preload.js')]);

// Replace with:
session.registerPreloadScript({
type: 'frame',
id: 'app-preload',
filePath: path.join(__dirname, 'preload.js'),
});

已弃用:WebContentsconsole-message 事件中的 levelmessagelinesourceId 参数

WebContents 上的 console-message 事件已更新,以提供 Event 参数的详细信息。

// Deprecated
webContents.on(
'console-message',
(event, level, message, line, sourceId) => {},
);

// Replace with:
webContents.on(
'console-message',
({ level, message, lineNumber, sourceId, frame }) => {},
);

此外,level 现在是一个字符串,可能的值为 infowarningerrordebug

行为更改:WebRequestFilterurls 属性。

以前,空的 urls 数组被解释为包含所有 URL。现在,要显式包含所有 URL,开发人员应该使用 <all_urls> 模式,这是一个指定的 URL 模式,它匹配所有可能的 URL。此更改阐明了意图并确保了更可预测的行为。

// Deprecated
const deprecatedFilter = {
urls: [],
};

// Replace with
const newFilter = {
urls: ['<all_urls>'],
};

已弃用:systemPreferences.isAeroGlassEnabled()

systemPreferences.isAeroGlassEnabled() 函数已弃用,没有替代。自 Electron 23 以来,它一直返回 true,因为 Electron 23 只支持 Windows 10+,其中 DWM 组合无法再禁用。

https://learn.microsoft.com/en-us/windows/win32/dwm/composition-ovw#disabling-dwm-composition-windows7-and-earlier

停止支持 32.x.y

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

E35 (2025 年 3 月)E36 (2025 年 4 月)E37 (2025 年 6 月)
35.x.y36.x.y37.x.y
34.x.y35.x.y36.x.y
33.x.y34.x.y35.x.y

下一步

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

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

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

Google 编程之夏 2025

·6 分钟阅读

Electron 再次被 Google 编程之夏 (GSoC) 2025 接受为指导组织!Google 编程之夏是一个全球性的项目,旨在吸引新的贡献者参与开源软件开发。

有关该计划的更多详细信息,请访问 Google 的编程之夏主页

关于我们

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

除了 Electron 核心仓库,我们还维护了几个项目来支持 Electron 生态系统,包括

作为 GSoC 贡献者,您将有机会与 Electron 的一些核心贡献者在 github.com/electron 旗下的众多项目之一上进行协作。

申请前

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

要了解更多关于分发 Electron 应用程序的信息,请尝试使用 Electron Forge 创建一个示例应用程序。

npm init electron-app@latest my-app

熟悉代码后,请加入 Electron Discord 服务器上的讨论。

信息

如果这是您第一次参加 Google 编程之夏,或者您通常不熟悉开源,我们建议您在参与社区之前阅读 Google 的贡献者指南

项目贡献

我们鼓励您查看与您感兴趣的项目想法相关的任何存储库。进行研究的一种方法是通过报告错误、分类现有问题或提交拉取请求来做出贡献。这样做是掌握我们代码库的有效方法,但对于提案提交来说并非强制性。一个精心制作的提案应该能够展示您对代码的理解,而无需提及过去的贡献。

以下是您在提交提案之前希望为 Electron 做出贡献的一些技巧

  1. 在提交贡献时,请提供描述性的问题或 PR 描述。无论代码本身如何,在贡献的书面部分投入精力表明您可以在协作环境中成为一名有效的沟通者。
  2. 我们始终欢迎对开放问题的 PR。您无需在问题下评论询问维护者是否可以将其分配给您。请注意,如果您需要完善解决方案的想法,我们仍然鼓励您在问题上讨论潜在的解决方案,但严格要求是否可以处理某事的评论是多余的,并会增加问题跟踪器的噪音。
  3. 低效的项目贡献(例如无效的问题报告、仓库 README 中微不足道的措辞更改或前端代码的轻微样式更改)将对您的最终提案产生负面影响,因为它们占用了有限的维护者时间,并且对 Electron 项目没有提供任何净收益。
  4. 虽然人工智能编码助手可以成为调试和理解新概念的有效工具,但我们强烈不鼓励直接从人工智能生成输出中复制/粘贴的贡献。这些贡献往往质量低下,维护者清理 LLM 生成的代码通常比直接拒绝 PR 更费力。

撰写您的提案

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

如果您有未在列表中的独特想法,我们乐于考虑,但请确保您的提案详细且大纲清晰。如有疑问,我们建议您坚持我们列出的想法。

您的申请应包括

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

此处有关于提交 Electron 申请的详细指南请直接向 Google 编程之夏门户提交提案。发送到 Electron 团队的电子邮件提案将不被视为最终提交。

有关您提案的更多指导,我们建议您遵循此处的官方 Google 编程之夏提案撰写建议。

申请于 2025 年 3 月 24 日 开放,于 2025 年 4 月 8 日 截止。

过去的项目提案

📚 在 2024 年 GSoC 中,@piotrpdev 致力于为 Electron 核心文档添加 API 历史记录。要查看 Piotr 在 Electron 夏季期间的工作,请阅读他在2024 年 GSoC 计划档案中的报告。

🔐 在 2022 年 GSoC 中,@aryanshridhar 致力于在 Electron Fiddle 中启用上下文隔离。如果您想查看 Aryan 在 Electron 夏季期间的工作,您可以在2022 年 GSoC 计划档案中阅读他的报告。

问题?

如果您有本博客文章中未解决的问题或关于您的提案草案的疑问,请发送电子邮件至 summer-of-code@electronjs.org 或查看 GSoC 常见问题。请在发送电子邮件之前阅读我们的贡献者指南

资源

Electron 34.0.0

·4 分钟阅读

Electron 34.0.0 已发布!它包括 Chromium 132.0.6834.83、V8 13.2 和 Node 20.18.1 的升级。


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

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

值得注意的更改

HTTP 压缩共享字典管理 API

HTTP 压缩允许 Web 服务器在浏览器接收数据之前对其进行压缩。现代版本的 Chromium 支持 Brotli 和 Zstandard,这些是比 gzip 等旧方案对文本文件性能更好的新型压缩算法。

自定义共享字典进一步提高了 Brotli 和 Zstandard 压缩的效率。有关更多信息,请参见Chrome for Developers 博客上关于共享字典的文章

@felixrieseberg#44950 中添加了以下 API,用于在 Session 级别管理共享字典

  • session.getSharedDictionaryUsageInfo()
  • session.getSharedDictionaryInfo(options)
  • session.clearSharedDictionaryCache()
  • session.clearSharedDictionaryCacheForIsolationKey(options)

无响应渲染器 JavaScript 调用堆栈

当渲染器进程挂起时间过长时,Electron 的unresponsive 事件就会发生。@samuelmaddock#44204 中添加的新 WebFrameMain.collectJavaScriptCallStack() API 允许您从相关的 WebFrameMain 对象(webContnets.mainFrame)收集 JavaScript 调用堆栈。

此 API 在由于长时间运行的 JavaScript 事件导致进程挂起的情况下,可用于确定帧无响应的原因。有关更多信息,请参见提议的 Web 标准崩溃报告 API

主进程
const { app } = require('electron');

app.commandLine.appendSwitch(
'enable-features',
'DocumentPolicyIncludeJSCallStacksInCrashReports',
);

app.on('web-contents-created', (_, webContents) => {
webContents.on('unresponsive', async () => {
// Interrupt execution and collect call stack from unresponsive renderer
const callStack = await webContents.mainFrame.collectJavaScriptCallStack();
console.log('Renderer unresponsive\n', callStack);
});
});
警告

此 API 需要启用 'Document-Policy': 'include-js-call-stacks-in-crash-reports' 标头。有关更多详细信息,请参见#45356

堆栈更改

Electron 34 将 Chromium 从 130.0.6723.44 升级到 132.0.6834.83,将 Node 从 20.18.0 升级到 20.18.1,并将 V8 从 13.0 升级到 13.2

新功能

  • 添加了 API 以使用 Brotli 或 ZStandard 管理共享字典以提高压缩效率。新的 API 包括 session.getSharedDictionaryUsageInfo()session.getSharedDictionaryInfo(options)session.clearSharedDictionaryCache()session.clearSharedDictionaryCacheForIsolationKey(options)#44950
  • 添加了 WebFrameMain.collectJavaScriptCallStack(),用于访问无响应渲染器的 JavaScript 调用堆栈。#44938
  • 添加了处于卸载状态的帧的 WebFrameMain.detached
    • 添加了 WebFrameMain.isDestroyed() 以确定帧是否已被销毁。
    • 修复了 webFrameMain.fromId(processId, frameId) 在帧卸载时返回与给定参数不匹配的 WebFrameMain 实例的问题。#43473
  • 在 utility process 中添加了错误事件,以支持 V8 致命错误的诊断报告。#43774
  • 功能:GPU 加速共享纹理离屏渲染。#42953

重大变更

行为更改:Windows 全屏时菜单栏将隐藏

这使得行为与 Linux 保持一致。之前行为:Windows 全屏时菜单栏仍然可见。新行为:Windows 全屏时菜单栏隐藏。

更正:这之前被列为 Electron 33 中的重大更改,但首次发布在 Electron 34 中。

停止支持 31.x.y

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

E34 (2025 年 1 月)E35 (2025 年 4 月)E36 (2025 年 6 月)
34.x.y35.x.y36.x.y
33.x.y34.x.y35.x.y
32.x.y33.x.y34.x.y

下一步

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

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

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

将我们的生态系统迁移到 Node 22

·2 分钟阅读

2025 年初,Electron 的 npm 生态系统仓库(在 @electron/@electron-forge/ 命名空间下)将把 Node.js 22 作为最低支持版本。


这意味着什么?

过去,Electron npm 生态系统中的软件包(如 Forge、Packager 等)会尽可能长时间地支持 Node 版本,即使某个版本已达到其生命周期结束 (EOL) 日期。这样做是为了确保我们不会碎片化生态系统——我们理解许多项目依赖于旧版本的 Node,并且我们不想冒使这些项目陷入困境的风险,除非有紧急的升级理由。

随着时间的推移,将 Node.js 14 作为我们的最低版本变得越来越困难,原因如下

  • 缺少官方 Node.js 14 macOS ARM64 版本,这要求我们维护 CI 基础设施变通方案以提供完整的测试覆盖。
  • 上游包依赖项的 engines 要求已向前推进,使得通过依赖项升级解决供应链安全问题变得越来越困难。

此外,较新版本的 Node.js 包含了许多我们希望利用的改进,例如运行时原生通用实用程序(例如 fs.globutil.parseArgs)以及全新的内建模块(例如 node:testnode:sqlite)。

为什么现在升级?

2024 年 7 月,Electron 的生态系统工作组决定将所有软件包升级到最早的 Node 版本,在该版本达到 LTS 日期后,将支持 require() 同步 ESM 图形(参见 nodejs/node#51977nodejs/node#53500)。

我们已决定将更新时间定在 2025 年 1 月/2 月。在此次升级之后,Node 22 将成为现有生态系统包的最低支持版本。

我需要采取什么行动?

我们将尽力保持兼容性。但是,为了确保最佳支持,我们鼓励您将应用程序升级到 Node 22 或更高版本。

请注意,您项目中运行的 Node 版本与当前 Electron 版本中嵌入的 Node 版本无关。

下一步

如果您有任何疑问或疑虑,请随时给我们发送电子邮件至 info@electronjs.org 。您也可以在我们的官方 Electron Discord 中找到社区支持。

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

·2 分钟阅读

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

通过 GIPHY


12 月保持不变的方面

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

12 月将发生变化的方面

  1. 2024 年最后一批稳定分支版本,包括 Electron 31、32 和 33,将于 12 月第一周发布。12 月将不再有额外的计划发布。
  2. 12 月的最后两周不发布 Nightly 和 Alpha 版本。
  3. 除少数例外,不进行拉取请求审查或合并。
  4. 任何仓库的问题跟踪器均不更新。
  5. 维护者不提供 Discord 调试帮助。
  6. 不更新社交媒体内容。

2025 年再见!

从 BrowserView 迁移到 WebContentsView

·4 分钟阅读

BrowserViewElectron 30 以来已被弃用,并由 WebContentView 取代。值得庆幸的是,迁移过程相当轻松。


Electron 正在从 BrowserView 转向 WebContentsView,以与 Chromium 的 UI 框架 Views API 对齐。WebContentsView 提供了一个直接与 Chromium 渲染管线绑定的可重用视图,简化了未来的升级,并为开发人员在 Electron 应用程序中集成非 Web UI 元素提供了可能性。通过采用 WebContentsView,应用程序不仅为即将到来的更新做好了准备,而且从长远来看,还能受益于减少的代码复杂性和更少的潜在 bug。

熟悉 BrowserWindow 和 BrowserView 的开发人员应注意,BrowserWindow 和 WebContentsView 分别是继承自 BaseWindow 和 View 基类的子类。要充分了解可用的实例变量和方法,请务必查阅这些基类的文档。

迁移步骤

1. 升级 Electron 到 30.0.0 或更高版本

警告

Electron 版本可能包含会影响您应用程序的重大更改。最好在继续进行此迁移的其余部分之前,首先测试并完成您应用程序的 Electron 升级。每个 Electron 主要版本的重大更改列表可在此处以及 Electron 博客上每个主要版本的发布说明中找到。

2. 熟悉应用程序中使用 BrowserViews 的位置

一种方法是搜索您的代码库中的 new BrowserView(。这应该能让您了解您的应用程序如何使用 BrowserViews 以及需要迁移多少个调用点。

提示

在大多数情况下,您的应用程序实例化新 BrowserView 的每个实例都可以与其他实例隔离地进行迁移。

3. 迁移每个 BrowserView 的使用

  1. 迁移实例化。这应该相当简单,因为 WebContentsViewBrowserView 的构造函数形状基本相同。两者都通过 webPreferences 参数接受 WebPreferences

    - this.tabBar = new BrowserView({
    + this.tabBar = new WebContentsView({
    信息

    默认情况下,WebContentsView 实例化时背景为白色,而 BrowserView 实例化时背景透明。要在 WebContentsView 中获得透明背景,请将其背景颜色设置为 RGBA 十六进制值,并将 alpha(不透明度)通道设置为 00

    + this.webContentsView.setBackgroundColor("#00000000");
  2. 迁移 BrowserView 添加到其父窗口的位置。

    - this.browserWindow.addBrowserView(this.tabBar)
    + this.browserWindow.contentView.addChildView(this.tabBar);
  3. 迁移父窗口上的 BrowserView 实例方法调用。

    旧方法新方法备注
    win.setBrowserViewwin.contentView.removeChildView + win.contentView.addChildView
    win.getBrowserViewwin.contentView.children
    win.removeBrowserViewwin.contentView.removeChildView
    win.setTopBrowserViewwin.contentView.addChildView在现有视图上调用 addChildView 会将其重新排序到顶部。
    win.getBrowserViewswin.contentView.children
  4. setAutoResize 实例方法迁移到 resize 侦听器。

    - this.browserView.setAutoResize({
    - vertical: true,
    - })

    + this.browserWindow.on('resize', () => {
    + if (!this.browserWindow || !this.webContentsView) {
    + return;
    + }
    + const bounds = this.browserWindow.getBounds();
    + this.webContentsView.setBounds({
    + x: 0,
    + y: 0,
    + width: bounds.width,
    + height: bounds.height,
    + });
    + });
    提示

    所有现有 browserView.webContents 和实例方法 browserView.setBoundsbrowserView.getBounds 以及 browserView.setBackgroundColor 的用法都不需要迁移,并且应该可以直接与 WebContentsView 实例一起使用!

4. 测试并提交您的更改

遇到问题?检查 Electron 问题跟踪器上的 WebContentsView 标签,查看您遇到的问题是否已被报告。如果您没有在那里看到您的问题,请随时添加新的 bug 报告。包含测试用例要点将帮助我们更好地分类您的问题!

恭喜,您已迁移到 WebContentsViews!🎉

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

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

值得注意的更改

亮点

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

重大变更

已移除:macOS 10.15 支持

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

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

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

由于上游的变化,V8Node.js 现在都要求 C++20 作为最低版本。使用原生 Node 模块的开发人员应该使用 --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 选项

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 (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 历史记录 (2024 年 GSoC)

·8 分钟阅读

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


大家好 👋,我是 Peter,2024 年 Google 编程之夏 (GSoC) 对 Electron 的贡献者。

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