跳转到主要内容

Electron 39.0.0

·阅读时长 4 分钟

Electron 39.0.0 已发布!它包括 Chromium 142.0.7444.52、V8 14.2 和 Node 22.20.0 的升级。


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

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

重要变更

技术栈变更

Electron 39 将 Chromium 从 140.0.7339.41 升级到 142.0.7444.52,Node.js 从 22.18.0 升级到 v22.20.0,V8 从 14.0 升级到 14.2

ASAR 完整性功能升级为稳定版

一个长期存在的“实验性”功能——ASAR 完整性——现在在 Electron 39 中已稳定。当您启用此功能时,它会在运行时根据构建时哈希验证您的打包 app.asar 以检测任何篡改。如果不存在哈希或哈希不匹配,应用程序将强制终止。

有关该功能如何工作、如何在应用程序中使用以及如何在 Electron Forge 和 Electron Packager 中使用的完整信息,请参阅ASAR 完整性文档

相关新闻,Electron Packager v19 现在默认启用 ASAR。#1841

新特性与改进

  • 添加了 app.isHardwareAccelerationEnabled()#48680
  • 在离屏渲染中添加了支持 scRGB HDR 颜色空间的 RGBAF16 输出格式。#48504
  • 添加了更精细的辅助功能管理方法。#48625
  • 添加了对 USBDevice.configurations 的支持。#47459
  • 添加了在 Linux 上使用 systemPreferences.getAccentColor 获取系统强调色的功能。#48628
  • 允许在给定会话中持久化文件系统 API 授权状态。#48326 (也在37, 38 中)
  • 在非上下文隔离的预加载中支持动态 ESM 导入。#48488 (也在37, 38 中)
  • ASAR 完整性功能标记为稳定版。它以前是实验性的。#48434

破坏性变更

已弃用:--host-rules 命令行开关

Chromium 正在弃用 --host-rules 开关。

您应该改用 --host-resolver-rules

行为变更:window.open 弹窗始终可调整大小

根据当前的 WHATWG 规范window.open API 现在将始终创建可调整大小的弹窗。

恢复以前的行为

webContents.setWindowOpenHandler((details) => {
return {
action: 'allow',
overrideBrowserWindowOptions: {
resizable: details.features.includes('resizable=yes'),
},
};
});

行为变更:共享纹理 OSR paint 事件数据结构

使用共享纹理离屏渲染功能时,paint 事件现在会发出一个更结构化的对象。它将 sharedTextureHandleplanesmodifier 移动到一个统一的 handle 属性中。有关更多详细信息,请参阅 OffscreenSharedTexture 文档

36.x.y 版本停止支持

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

E39 (25年10月)E40 (2026 年 1 月)E41 (2026 年 2 月)
39.x.y40.x.y41.x.y
38.x.y39.x.y40.x.y
37.x.y38.x.y39.x.y

下一步计划

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

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

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

Electron 38.0.0

·阅读时长 5 分钟

Electron 38.0.0 已发布!它包括 Chromium 140.0.7339.41、V8 14.0 和 Node 22.16.0 的升级。


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

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

重要变更

技术栈变更

Electron 38 将 Chromium 从 138.0.7204.35 升级到 140.0.7339.41,Node 从 22.16.0 升级到 22.18.0,V8 从 13.8 升级到 14.0

新特性与改进

  • 增加了对系统强调色和活动窗口边框高光自定义的支持。#47285(也在37中)
  • 为 macOS 的 process.getSystemMemoryInfo() 添加了 fileBackedpurgeable 字段。#48146(也在37中)
  • 为 macOS 上的 Tray 构造函数选项添加了 guid 支持,以允许托盘图标在启动后保持位置。#48077(也在37中)
  • 添加了 webFrameMain.fromFrameToken(processId, frameToken) 以从其帧令牌获取 WebFrameMain 实例。#47942
  • 添加了对 Windows 和 macOS 上 app.getRecentDocuments() 的支持。#47924(也在37中)
  • 内部切换到使用 DIR_ASSETS 而不是 DIR_MODULE/DIR_EXE 来定位资产和资源,并将“assets”添加为可通过 app.getPath 查询的键。#47950(也在37中)
  • 修复了 dialog.showMessageDialog 在传入父窗口时,错误地将其居中显示在显示器而不是父窗口的问题。#48215
  • 修复了 macOS 用户无法与通过 loadURL 加载的网页交互的问题。#47575

破坏性变更

已移除:macOS 11 支持

macOS 11 (Big Sur) 不再受 Chromium 支持。

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

已移除:ELECTRON_OZONE_PLATFORM_HINT 环境变量

--ozone-plaftform 标志的默认值更改为 auto

您应该改用 XDG_SESSION_TYPE=wayland 环境变量来使用 Wayland。

已移除:plugin-crashed 事件

plugin-crashed 事件已从 webContents 中移除。

已弃用:webFrame.routingId 属性

routingId 属性将从 webFrame 对象中移除。

您应该改用 webFrame.frameToken

已弃用:webFrame.findFrameByRoutingId(routingId)

webFrame.findFrameByRoutingId(routingId) 函数将被移除。

您应该改用 webFrame.findFrameByToken(frameToken)

Google 编程之夏活动结束

我们的两位 Google 编程之夏贡献者刚刚完成了他们的夏季项目!

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

请继续关注一篇更详细的博客文章,其中将概述他们的项目和成果。

35.x.y 版本停止支持

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

E38 (2025 年 9 月)E39 (25年10月)E40 (2026 年 1 月)
38.x.y39.x.y40.x.y
37.x.y38.x.y39.x.y
36.x.y37.x.y38.x.y

下一步计划

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

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

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

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 中推出,但我们认为它值得更亮的聚光灯。

100% 圆角平滑示例

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

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

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

提示

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

最初的设计灵感来自 Figma 的角平滑实现。阅读更多关于他们自己对平滑角的追求,请参阅“苦苦寻找圆方”

技术栈变更

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

Google Summer of Code 开始

我们的两位 Google Summer of Code 贡献者已经开始了该项目的编码期!

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

对于我们的 GSoC 参与者来说,这是激动人心的几周,敬请期待更多更新!

新特性与改进

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

破坏性变更

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

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

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

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

行为变更:process.exit() 同步终止实用程序进程

在实用工具进程中调用 process.exit() 现在将同步终止该进程。这使得 process.exit() 的行为与 Node.js 的行为保持一致。

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

行为变更: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 (25年6月)E38 (25年8月)E39 (25年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 上的贴靠功能进行排列。#46226
  • 添加了 WebContents.focusedFrame 来获取当前获得焦点的 frame。
  • 修复了 WebContents.opener,以明确其可能为 null 类型。#45667
  • ffmpeg.dll 添加到延迟加载配置中。#46173(也在34, 35中)
  • 添加了 nativeTheme.shouldUseDarkColorsForSystemIntegratedUI 以区分系统和应用程序主题。#46598(也在35中)
  • webRequest 过滤器添加了 excludeUrls,并弃用了在 urls 属性中使用空数组。#44692(也在35中)
  • 通过 menu.popup 中的新 frame 选项,在上下文菜单中添加了对自动填充、书写工具和 macOS 级别服务菜单项的支持。#46350
  • 在 Linux 上添加了对 system-context-menu 的支持。#46399
  • 改进了 Windows 上的 ASAR 完整性检查。#46537
  • 在 macOS 上不请求缩略图时,改进了 desktopCapturer.getSources 的性能。#46251(也在34, 35中)
  • 使用共享纹理 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 成为默认

经过一次上游变更后,在 GNOME 上运行时,现在默认使用 GTK 4。

在极少数情况下,这可能会导致某些应用程序或配置出错,并显示以下消息:

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 (25年4月)E37 (25年6月)E38 (25年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 的问题跟踪器中报告。

重要变更

用于改进扩展支持的服务工作线程预加载脚本

最初由 @samuelmaddockRFC #8 中提出,Electron 35 增加了向 Service Workers 附加预加载脚本的功能。由于 Chrome 的 Manifest V3 扩展通过扩展服务工作线程处理大量工作,此功能填补了 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'),
});

此外,IPC 现在可在 Service Worker 及其附加的预加载脚本之间通过 ServiceWorkerMain.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 类,用于在主进程中与 Service Worker 交互。#45341
    • ServiceWorkers 上添加了 running-status-changed 事件,用于指示 Service Worker 的运行状态何时发生变化。
    • ServiceWorkers 上添加了 startWorkerForScope,用于启动先前可能已停止的 Worker。
  • 添加了实验性的 contextBridge.executeInMainWorld,用于安全地跨世界边界执行代码。#45330
  • 'console-message' 事件中添加了 frame#43617
  • 在 Windows 上添加了 query-session-end 事件并改进了 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 中)
  • 添加了对 Service Worker 预加载脚本的支持。#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 (25年3月)E36 (25年4月)E37 (25年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 的公开时间线

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

2025 年谷歌编程之夏

·6 分钟阅读

Electron 再次被接纳为 Google Summer of Code (GSoC) 2025 的指导组织!Google Summer of Code 是一个全球性项目,旨在吸引新的贡献者加入开源软件开发。

有关该项目的更多详细信息,请访问 Google 的Summer of Code 主页

关于我们

Electron 是一个使用 Web 技术构建跨平台桌面应用程序的 JavaScript 框架。核心 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. 虽然 AI 编码助手是调试和理解新概念的有效工具,但我们强烈不鼓励直接从 AI 生成的输出中复制/粘贴的贡献。这些贡献通常质量低下,维护者清理 LLM 生成的代码通常比我们完全拒绝 PR 更费力。

撰写您的提案

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

如果您有一个列表中没有的独特想法,我们愿意考虑,但请确保您的提案详细且彻底地概述。如有疑问,我们建议您坚持我们列出的想法。

您的申请应包括:

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

此处提供了关于 Electron 应用程序应提交内容的详细指南请直接向 Google 编程之夏门户提交提案。发送到 Electron 团队的提案将不被视为最终提交。

有关您的提案的更多指导,我们建议您遵循此处的官方 Google Summer of Code 提案撰写建议

申请于 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.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
  • 在实用程序进程中添加了错误事件,以支持 V8 致命错误的诊断报告。#43774
  • 特性:GPU 加速的共享纹理离屏渲染。#42953

破坏性变更

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

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

更正:此项先前被列为 Electron 33 中的重大变更,但实际上是在 Electron 34 中首次发布的。

停止支持 31.x.y

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

E34 (25年1月)E35 (25年4月)E36 (25年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 生态系统工作组决定在未来某个版本达到 LTS 日期后,将所有包升级到支持同步 ESM 图的 require() 的最早 Node 版本(参见 nodejs/node#51977nodejs/node#53500)。

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

我需要采取什么行动?

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

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

下一步

如果您有任何问题或疑虑,请随时发送邮件至 info@electronjs.org 与我们联系。您也可以在我们的官方 Electron Discord 中获得社区支持。

12 月静默期(24 年 12 月)

·阅读时间 2 分钟

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

来自 GIPHY


12 月份保持不变的事项

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

12 月份会有所不同的事项

  1. 2024 年最后一个稳定分支版本(包括 Electron 31、32 和 33)将在 12 月 1 日那一周发布。12 月将没有其他计划中的版本发布。
  2. 12 月的最后两周将不会有 Nightly 和 Alpha 版本发布。
  3. 除少数例外情况外,不会进行 Pull Request 的审查或合并。
  4. 任何代码仓库的 Issue Tracker 都不会有更新。
  5. 维护者不会在 Discord 上提供调试帮助。
  6. 社交媒体内容将暂停更新。

2025年再见!

从 BrowserView 迁移到 WebContentsView

·阅读时长 4 分钟

Electron 30 起,BrowserView 已被弃用,并由 WebContentView 取代。幸运的是,迁移过程相当轻松。


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

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

迁移步骤

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

警告

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

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

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

提示

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

3. 迁移每个 BrowserView 的用法

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

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

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

    + 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.getBoundsbrowserView.setBackgroundColor 都不需要迁移,并且应该可以直接与 WebContentsView 实例一起使用!

4. 测试并提交您的更改

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

恭喜,您已成功迁移到 WebContentsViews!🎉