跳到主要内容

45 篇标记为“发布”的博文

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

值得注意的更改

平滑圆角:原生 CSS Squircle

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 将曲线平滑地过渡为具有连续周长的 squircle 形状。

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

提示

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

最初的设计灵感来自 Figma 的圆角平滑实现。在“苦寻 Squircle”中阅读更多关于他们追求平滑圆角的故事。

技术栈变更

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

Google 编程之夏开始

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

  • @nilayarya 正在 Electron 核心中开发一个新的保存/恢复窗口状态 API。新的 API 将提供一种内置的标准化方式来处理窗口状态持久化。请查看 Nilay 正在进行的 RFC:electron/rfcs#16
  • @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
  • 添加了对节点选项 --experimental-network-inspection 的支持。#47031 (也在 3536 中)
  • 暴露了 win.isContentProtected() 以允许开发人员检查窗口保护状态。#47310 (也在 36 中)

重大变更

实用进程未处理的拒绝行为变更

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

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

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()

如果窗口当前不可见,Linux 上的 BrowserWindow.IsVisibleOnAllWorkspaces() 现在将返回 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!错误和功能请求可以在 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 为默认值

在上游更改之后,在 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!错误和功能请求可以在 Electron 的问题追踪器中报告。

值得注意的更改

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

最初由 @samuelmaddockRFC #8 中提出,Electron 35 增加了向 Service Workers 附加预加载脚本的能力。随着 Chrome Manifest V3 扩展将大量工作通过扩展 Service Workers 进行路由,此功能填补了 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'),
});

此外,IPC 现在可以通过 ServiceWorkerMain.ipc 类在 Service Worker 及其附加的预加载脚本之间可用。预加载脚本仍将使用 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
  • frame 添加到 'console-message' 事件。#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 中)
  • 添加了对服务工作线程预加载脚本的支持。#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 的公开时间线。

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

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

值得注意的更改

HTTP 压缩共享字典管理 API

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

自定义共享字典进一步提高了 Brotli 和 Zstandard 压缩的效率。有关更多信息,请参阅面向开发者的 Chrome 博客文章关于共享字典

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

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

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!错误和功能请求可以在 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
  • 在实用进程中添加了错误事件,以支持 V8 致命错误诊断报告。#43997
  • 添加了 View.setBorderRadius(radius),用于自定义视图的边框半径 — 兼容 WebContentsView#42320
  • 扩展了 navigationHistory API,新增 2 个函数以实现更好的历史管理。#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');

行为变更:applogin 事件的 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 (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 的公开时间线。

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

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

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

值得注意的更改

亮点

  • 在我们的文档中添加了新的 API 版本历史,这是 @piotrpdev 作为 Google 编程之夏的一部分创建的功能。您可以在这篇博客文章中了解更多信息。#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 使用 npm install electron@latest 安装它,或从我们的发布网站下载。继续阅读以了解此版本的详细信息。

如果您有任何反馈,请在 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 添加了 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 上持续闪烁停靠图标

这使得行为与 Windows 和 Linux 保持一致。以前的行为:第一次 flashFrame(true) 只使停靠图标弹跳一次(使用 NSInformationalRequest 级别),而 flashFrame(false) 不执行任何操作。新行为:持续闪烁直到调用 flashFrame(false)。这改为使用 NSCriticalRequest 级别。要明确使用 NSInformationalRequest 以导致单次停靠图标弹跳,仍然可以使用 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 使用 npm install electron@latest 安装它,或从我们的发布网站下载。继续阅读以了解此版本的详细信息。

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

值得注意的更改

亮点

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

技术栈变更

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

新功能

  • 为 webviews 添加了 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 上由 autoresizing 支持,而在 Windows 和 Linux 上由自定义算法支持。对于简单的用例,例如使 BrowserView 填充整个窗口,这两种方法的行为是相同的。然而,在更高级的用例中,BrowserView 在 macOS 上的自动调整大小方式会与其他平台不同,因为 Windows 和 Linux 的自定义调整大小算法与 macOS 的 autoresizing API 的行为不完全匹配。现在,自动调整大小行为已在所有平台标准化。

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

已移除:WebContentscontext-menuparams.inputFormType 属性

WebContentscontext-menu 事件中 params 对象的 inputFormType 属性已被移除。请使用新的 formControlType 属性代替。

已移除:process.getIOCounters()

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

27.x.y 支持结束

根据项目的支持策略,Electron 27.x.y 已达到支持结束。建议开发者和应用升级到更新的 Electron 版本。

E30 (2024年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 的公开时间线。

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

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

如果您有任何反馈,请在 TwitterMastodon 上与我们分享,或者加入我们的社区 Discord!错误和功能请求可以在 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,该 Fuse 允许 file:// 协议采用更安全和更严格的行为,与 Chromium 保持一致。#40372
  • protocol.registerSchemesAsPrivileged 中添加了一个选项,允许在自定义 Scheme 中使用 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 (2024年2月)E30 (2024年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 可以是与维护者就其设计展开对话的有用工具。 您还可以在 Pull Request 中查看即将讨论的更改。 要了解更多信息,请查看我们的介绍 electron/rfcs 博客文章,或直接查看 electron/rfcs 仓库的 README。

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

您可以在此处找到 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 使用 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 代替,该 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 (2023年12月)E29 (2024年2月)E30 (2024年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 的公开时间线。

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