跳到主内容

Electron 36.0.0

·4 分钟阅读

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 (也在 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 只 intended to handle Chromium switches (which aren't case-sensitive) and switches passed via app.commandLine will not be passed down to any of the child processes.

如果你使用 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

·5 分钟阅读

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 添加了为服务工作线程附加预加载脚本的功能。 随着 Chrome 的 Manifest V3 扩展程序通过扩展程序服务工作线程处理大量工作,此功能填补了 Electron 对现代 Chrome 扩展程序支持的空白。

在会话级别以编程方式注册预加载脚本时,您现在可以使用 ses.registerPreloadScript(script) API 将其专门应用于服务工作线程上下文。

主进程
// 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 类,服务工作线程及其附加的预加载脚本之间现在可以使用 IPC。 预加载脚本仍将使用 ipcRenderer 模块与其服务工作线程通信。 更多详细信息请参阅原始 RFC。

此功能之前已经进行了许多其他更改,为它奠定了基础

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

堆栈变更

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 参数

WebContentsconsole-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,该版本仅支持 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 Summer of Code 2025

·5 分钟阅读

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 贡献者,您将有机会在 github.com/electron 旗下的众多项目之一上与 Electron 的一些核心贡献者合作。

申请前

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

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

npm init electron-app@latest my-app

在熟悉代码后,加入 Electron Discord 服务器上的对话。

信息

如果这是您第一次参加 Google Summer of Code,或者您是开源领域的新手,我们建议您在与社区互动之前阅读 Google 的贡献者指南

项目贡献

我们鼓励您查看与您感兴趣的项目想法相关的任何仓库。 一种进行研究的方法是通过报告错误、分类现有问题或提交拉取请求来进行贡献。 这样做是获得实践我们代码库经验的有效方式,但这对于提案提交不是强制性的。 一个精心撰写的提案应该能够证明您对代码的理解,而无需引用过去的贡献。

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

  1. 提交贡献时,请提供描述性的问题或 PR 描述。 无论代码本身如何,在贡献的书面部分付出努力表明您在协作环境中具备有效的沟通能力。
  2. PR 总是欢迎针对开放问题的。 您无需在问题下评论询问维护者是否可以将问题分配给您。 请注意,如果您需要完善解决方案的想法,我们仍然鼓励您在问题下讨论潜在的解决方案,但严格询问您是否可以处理某事的评论是多余的,并且会增加问题跟踪器的噪音。
  3. 低投入的项目贡献(例如,无效的 issue 报告、repo 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 的问题追踪器中报告。

重要变更

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 调用栈。

在存在导致进程挂起的长时间运行的 JavaScript 事件的情况下,此 API 可用于确定帧无响应的原因。有关更多信息,请参阅提议的 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 中添加了 error 事件,以支持 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 的生态系统工作组决定将所有软件包升级到最早支持同步 ESM 图的 require() 的 Node 版本(参见 nodejs/node#51977nodejs/node#53500),时间是在该版本达到 LTS 日期之后的某个未来时间点。

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

我需要采取什么行动?

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

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

下一步是什么

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

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

·1 分钟阅读

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

via GIPHY


12 月将保持不变的事项

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

12 月将发生变化的事项

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

2025 年见!

从 BrowserView 迁移到 WebContentsView

·3 分钟阅读

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


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

熟悉 BrowserWindow 和 BrowserView 的开发者应注意,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 中获得透明背景,请将其背景颜色设置为一个带有 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 的 issue 跟踪器上的WebContentsView 标签,看看您遇到的问题是否已被报告。如果您在那里没有看到您的问题,请随时添加新的 bug 报告。包含测试用例 gists 将有助于我们更好地分类处理您的问题!

恭喜,您已迁移到 WebContentsViews!🎉

Electron 33.0.0

·4 分钟阅读

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


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

如果您有任何反馈,请在TwitterMastodon 上与我们分享,或加入我们的社区Discord!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 属性

applogin 事件因使用 respondToAuthRequestsFromMainProcess 选项创建的utility process 中的请求而触发时,该事件中的 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 的公开时间表

关于未来变更的更多信息可以在计划中的重大变更页面找到。

API 历史介绍 (GSoC 2024)

·7 分钟阅读

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


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

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

Electron 32.0.0

·4 分钟阅读

Electron 32.0.0 已发布!它包含对 Chromium 128.0.6613.36、V8 12.8 和 Node 20.16.0 的升级。


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

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

重要变更

亮点

  • 在我们的文档中添加了新的 API 版本历史记录,这是由 @piotrpdev 作为 Google Summer of Code 的一部分创建的功能。您可以在这篇博文中了解更多信息。#42982
  • 从 Web File API 中移除了非标准的 File.path 扩展。#42053
  • 在 Web 文件系统 API 中,当尝试在被阻止的路径中打开文件或目录时,与上游保持一致的失败路径。#42993
  • 将以下现有的导航相关 API 添加到 webcontents.navigationHistory 中:canGoBack, goBack, canGoForward, goForward, canGoToOffset, goToOffset, clear。之前的导航 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' 事件响应从 utility process 发起的 auth 请求的支持。#43317
  • CPUUsage 结构添加了 cumulativeCPUUsage 属性,该属性返回自进程启动以来使用的总 CPU 时间(以秒为单位)。#41819
  • 将以下现有的导航相关 API 添加到 webContents.navigationHistory 中:canGoBack, goBack, canGoForward, goForward, canGoToOffset, goToOffset, clear#41752
  • 扩展了 WebContentsView 以接受预先存在的 webContents 对象。#42086
  • nativeTheme 添加了一个新属性 prefersReducedTransparency,该属性指示用户是否已通过系统辅助功能设置选择减少操作系统级别的透明度。#43137
  • 在文件系统访问 API 中,当尝试在被阻止的路径中打开文件或目录时,与上游保持一致的失败路径。#42993
  • 在 Linux 上启用了 Windows Control Overlay 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 上的 clearHistory, canGoBack, goBack, canGoForward, goForward, goToIndex, canGoToOffset, goToOffset

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 使用,WebSQL 已在 Electron 31 中移除。Chromium 现在会执行清理操作删除此目录。参见 issue #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 的公开时间表

关于未来变更的更多信息可以在计划中的重大变更页面找到。