跳转到主要内容

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 的 issue 跟踪器中报告。

重要变更

平滑圆角:原生 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 属性,该属性允许应用程序创建更平滑的圆角以匹配苹果 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%)。这种设计增强可以应用于边框、轮廓和阴影,为您的应用增添一层微妙的精致感。

提示

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

最初的设计灵感来自 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 将提供一种内置的、标准化的方式来处理窗口状态的持久化。请在 electron/rfcs#16 查看 Nilay 正在进行的 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 Process 将会发出一条错误消息警告,而不是使进程崩溃。

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

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

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

在实用工具进程中调用 process.exit() 现在将同步终止该进程。这使得 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 (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 的 issue 跟踪器中报告。

重要变更

写作工具支持

在 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(同样在 3435 中)
  • 添加了 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 的 issue 跟踪器中报告。

重要变更

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

最初由 @samuelmaddockRFC #8 中提出,Electron 35 增加了将预加载脚本附加到 Service Workers 的能力。由于 Chrome 的 Manifest V3 扩展将大量工作通过扩展服务工作线程路由,此功能填补了 Electron 对现代 Chrome 扩展支持的空白。

在会话级别以编程方式注册预加载脚本时,您现在可以使用 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'),
});

此外,现在可以通过 ServiceWorkerMain.ipc 类在 Service Workers 与其附加的预加载脚本之间进行 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'),
});

已弃用:`WebContents` 上 `console-message` 事件中的 `level`、`message`、`line` 和 `sourceId` 参数

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 Summer of Code,或者您是开源新手,我们建议您在与社区互动之前阅读 Google 的贡献者指南

项目贡献

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

如果您想在提交提案之前为 Electron 做出贡献,这里有一些提示:

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

撰写您的提案

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

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

您的申请应包括:

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

此处提供了有关作为 Electron 申请一部分提交内容的详细指南请直接向 Google Summer of Code 门户提交提案。发送给 Electron 团队的提案将不被视为最终提交。

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

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

过往项目提案

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

🔐 在 GSoC 2022 中,@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 的 issue 跟踪器中报告。

重要变更

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

新特性

  • 添加了用于管理共享字典以提高 Brotli 或 ZStandard 压缩效率的 API。新的 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 渲染管道绑定的可重用视图,简化了未来的升级,并为开发者将非 Web UI 元素集成到其 Electron 应用中开辟了可能性。通过采用 WebContentsView,应用程序不仅为即将到来的更新做好了准备,还能从降低的代码复杂性和更少的潜在错误中受益。

熟悉 BrowserWindows 和 BrowserViews 的开发者应注意,BrowserWindowWebContentsView 分别是继承自 BaseWindowView 基类的子类。要完全理解可用的实例变量和方法,请务必查阅这些基类的文档。

迁移步骤

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

警告

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

2. 熟悉您的应用程序在何处使用 BrowserViews

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

提示

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

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

4. 测试并提交您的更改

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

恭喜,您已成功迁移到 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 的 issue 跟踪器中报告。

重要变更

亮点

  • 添加了一个处理程序 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 模块的开发者应该使用 --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` 选项创建的实用工具进程的请求触发时,`app` 的 `login` 事件中的 `webContents` 属性将为 `null`。

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

`BrowserWindowConstructorOptions` 中 `type` 的 `textured` 选项已被弃用,且没有替代方案。该选项依赖于 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 文档网站上精美地显示出来。