跳转到主要内容

Electron 27.0.0

·阅读时长 4 分钟

Electron 27.0.0 现已发布! 它包括对 Chromium 118.0.5993.32、V8 11.8 和 Node.js 18.17.1 的升级。


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

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

重要变更

技术栈变更

破坏性变更

已移除:对 macOS 10.13 / 10.14 的支持

Chromium 不再支持 macOS 10.13 (High Sierra) 和 macOS 10.14 (Mojave)。

旧版本的 Electron 将继续在这些操作系统上运行,但运行 Electron v27.0.0 及更高版本将需要 macOS 10.15 (Catalina) 或更高版本。

已弃用:ipcRenderer.sendTo()

ipcRenderer.sendTo() API 已弃用。应使用在渲染器之间设置 MessageChannel 来替代它。

IpcRendererEventsenderIdsenderIsMainFrame 属性也已被弃用。

移除:systemPreferences 中的颜色方案事件

以下 systemPreferences 事件已被移除:

  • inverted-color-scheme-changed
  • high-contrast-color-scheme-changed

请改用 nativeTheme 模块上新的 updated 事件。

// Removed
systemPreferences.on('inverted-color-scheme-changed', () => {
/* ... */
});
systemPreferences.on('high-contrast-color-scheme-changed', () => {
/* ... */
});

// Replace with
nativeTheme.on('updated', () => {
/* ... */
});

已移除:webContents.getPrinters

webContents.getPrinters 方法已被移除。 请改用 webContents.getPrintersAsync

const w = new BrowserWindow({ show: false });

// Removed
console.log(w.webContents.getPrinters());
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers);
});

移除:systemPreferences.{get,set}AppLevelAppearancesystemPreferences.appLevelAppearance

systemPreferences.getAppLevelAppearancesystemPreferences.setAppLevelAppearance 方法已被移除,systemPreferences.appLevelAppearance 属性也已被移除。请改用 nativeTheme 模块。

// Removed
systemPreferences.getAppLevelAppearance();
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.appLevelAppearance;
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.setAppLevelAppearance('dark');
// Replace with
nativeTheme.themeSource = 'dark';

移除:systemPreferences.getColoralternate-selected-control-text

systemPreferences.getColoralternate-selected-control-text 值已被移除。 请改用 selected-content-background

// Removed
systemPreferences.getColor('alternate-selected-control-text');
// Replace with
systemPreferences.getColor('selected-content-background');

新特性

  • 添加了应用无障碍透明度设置 API #39631
  • 添加了对 chrome.scripting 扩展 API 的支持 #39675
  • 默认启用了 WaylandWindowDecorations #39644

终止对 24.x.y 的支持

根据项目的 支持策略,Electron 24.x.y 已停止支持。鼓励开发者和应用程序升级到新版本的 Electron。

E27 (23年10月)E28 (23年12月)E29 (24年2月)
27.x.y28.x.y29.x.y
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y

终止对 22.x.y 的扩展支持

今年早些时候,Electron 团队将 Electron 22 的预期寿命从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日,以匹配 Chrome 对 Windows 7/8/8.1 的延长支持(更多详情请参阅 告别 Windows 7/8/8.1)。

根据项目的 支持策略 和本次支持延期,Electron 22.x.y 已停止支持。这将使支持回退到最新的三个稳定主版本,并结束对 Windows 7/8/8.1 的官方支持。

下一步计划

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

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

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

从突破到壁垒:使用沙盒强化应用

·阅读时长 5 分钟

距离 CVE-2023-4863:WebP 中的堆缓冲区溢出 公布已经过去一周多了,这引发了大量渲染 webp 图像的软件的新版本发布:macOS、iOS、Chrome、Firefox 和各种 Linux 发行版都收到了更新。此前 Citizen Lab 进行了一项调查,发现一名“位于华盛顿特区的公民社会组织”的 iPhone 正在遭受利用 iMessage 中零点击漏洞的攻击。

Electron 也采取了行动,并在当天发布了新版本:如果您的应用程序渲染任何用户提供的​​内容,您应该更新您的 Electron 版本——v27.0.0-beta.2、v26.2.1、v25.8.1、v24.8.3 和 v22.3.24 都包含对 libwebp 的修复版本,该库负责渲染 webp 图像。

现在我们都清楚,像“渲染图像”这样无害的操作可能是一个危险的行为,我们想借此机会提醒大家,Electron 提供了一个进程沙箱,它将限制下一次重大攻击(无论是什么)的破坏范围。

沙箱自 Electron v1 起就可用,并在 v20 中默认启用,但我们知道许多应用程序(尤其是那些存在时间较长的应用程序)可能在代码中某处设置了 sandbox: false——或者设置了 nodeIntegration: true,在没有显式 sandbox 设置的情况下,这同样会禁用沙箱。这是可以理解的:如果您陪伴我们很久了,您可能享受过将 require("child_process")require("fs") 放入运行 HTML/CSS 的代码中的强大功能。

在我们讨论如何迁移到沙箱之前,让我们先讨论一下你为什么需要它。

沙箱为所有渲染器进程提供了一个硬性隔离,确保无论内部发生什么,代码都在受限环境中执行。作为一个概念,它比 Chromium 早得多,并且被所有主要操作系统作为一项功能提供。Electron 和 Chromium 的沙箱建立在这些系统功能之上。即使您从不显示用户生成的内容,也应考虑您的渲染器可能被攻破的可能性:诸如供应链攻击之类的复杂场景以及像小 bug 这样简单的场景都可能导致您的渲染器执行您并未完全打算执行的操作。

沙箱使这种情况不那么可怕:内部进程可以自由使用 CPU 周期和内存——仅此而已。进程无法写入磁盘或显示自己的窗口。在我们的 libwep Bug 的情况下,沙箱确保攻击者无法安装或运行恶意软件。事实上,在本例的原始 Pegasus 攻击 iPhone 员工的情况下,攻击专门针对非沙箱化的图像进程以访问手机,首先突破了通常沙箱化的 iMessage 的边界。当像本例中的 CVE 被宣布时,您仍然需要将您的 Electron 应用程序升级到安全版本——但在此期间,攻击者可以造成的损害将大大减少。

将一个普通的 Electron 应用程序从 sandbox: false 迁移到 sandbox: true 是一项艰巨的任务。我知道,因为尽管我本人起草了《Electron 安全指南》的初稿,但我还没有成功地将我自己的一个应用程序迁移到使用它。这个周末情况有所改变,我建议您也进行更改。

Don’t be scared by the number of line changes, most of it is in package-lock.json

你需要解决两个问题

  1. 如果您在 preload 脚本或实际的 WebContents 中使用 Node.js 代码,您需要将所有 Node.js 交互都移至主进程(或者,如果您想更高级,可以移至一个辅助进程)。鉴于渲染器的功能越来越强大,很可能您的大部分代码实际上不需要重构。

    请参考我们关于 进程间通信 的文档。就我而言,我移动了很多代码并将其封装在 ipcRenderer.invoke()ipcMain.handle() 中,但过程很简单,很快就完成了。请稍加注意您在此处的 API——如果您构建了一个名为 executeCodeAsRoot(code) 的 API,沙箱将无法很好地保护您的用户。

  2. 由于启用沙箱会禁用预加载脚本中的 Node.js 集成,因此你无法再使用 require("../my-script")。换句话说,你的预加载脚本需要是单个文件。

    有多种方法可以做到这一点:Webpack、esbuild、parcel 和 rollup 都可以胜任。我使用了 Electron Forge 出色的 Webpack 插件,同样受欢迎的 electron-builder 的用户可以使用 electron-webpack

总而言之,整个过程花费了我大约四天时间——这还包括了我为了用各种方式重构我的代码而对如何驾驭 Webpack 的强大功能感到困惑的时间。

Electron 26.0.0

·3 分钟阅读

Electron 26.0.0 现已发布! 它包括对 Chromium 116.0.5845.62、V8 11.2 和 Node.js 18.16.1 的升级。 请继续阅读以获取更多详细信息!


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

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

重要变更

技术栈变更

破坏性变更

已废弃:webContents.getPrinters

webContents.getPrinters 方法已被废弃。 请改用 webContents.getPrintersAsync

const w = new BrowserWindow({ show: false });

// Deprecated
console.log(w.webContents.getPrinters());
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers);
});

已弃用:systemPreferences.{get,set}AppLevelAppearancesystemPreferences.appLevelAppearance

systemPreferences.getAppLevelAppearancesystemPreferences.setAppLevelAppearance 方法以及 systemPreferences.appLevelAppearance 属性已被弃用。请改用 nativeTheme 模块。

// Deprecated
systemPreferences.getAppLevelAppearance();
// Replace with
nativeTheme.shouldUseDarkColors;

// Deprecated
systemPreferences.appLevelAppearance;
// Replace with
nativeTheme.shouldUseDarkColors;

// Deprecated
systemPreferences.setAppLevelAppearance('dark');
// Replace with
nativeTheme.themeSource = 'dark';

已弃用:systemPreferences.getColoralternate-selected-control-text

systemPreferences.getColoralternate-selected-control-text 值已被废弃。 请改用 selected-content-background

// Deprecated
systemPreferences.getColor('alternate-selected-control-text');
// Replace with
systemPreferences.getColor('selected-content-background');

新特性

  • 添加了 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend API。 #39107
  • 添加了 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend API。 #39155
  • 为通过 ipcRenderer.sendTo() 发送的消息添加了 senderIsMainFrame#39206
  • 增加了对将菜单标记为由键盘启动的支持。 #38954

停止对 23.x.y 的支持

根据项目的 支持策略,Electron 23.x.y 已停止支持。鼓励开发者和应用程序升级到新版本的 Electron。

E26 (23年8月)E27 (23年10月)E28 (24年1月)
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
22.x.y

下一步计划

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

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

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

Electron 25.0.0

·阅读时长 5 分钟

Electron 25.0.0 已经发布! 它包括对 Chromium 114、V8 11.4 和 Node.js 18.15.0 的升级。 请继续阅读以了解更多详情!


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

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

重要变更

亮点

  • 在 Electron 的 net 模块中实现了 net.fetch,使用了 Chromium 的网络堆栈。这与 Node 的 fetch() 不同,后者使用 Node.js 的 HTTP 堆栈。请参阅 #36733#36606
  • 添加了 protocol.handle,它取代并弃用了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • 扩展了对 Electron 22 的支持,以匹配 Chromium 和微软对 Windows 7/8/8.1 的废弃计划。 请参阅本篇博文末尾的更多细节。

技术栈变更

破坏性变更

已弃用:protocol.{register,intercept}{Buffer,String,Stream,File,Http}Protocol

protocol.register*Protocolprotocol.intercept*Protocol 方法已被 protocol.handle 取代。

新方法既可以注册一个新协议,也可以拦截一个现有协议,并且响应可以是任何类型。

// Deprecated in Electron 25
protocol.registerBufferProtocol('some-protocol', () => {
callback({ mimeType: 'text/html', data: Buffer.from('<h5>Response</h5>') });
});

// Replace with
protocol.handle('some-protocol', () => {
return new Response(
Buffer.from('<h5>Response</h5>'), // Could also be a string or ReadableStream.
{ headers: { 'content-type': 'text/html' } },
);
});
// Deprecated in Electron 25
protocol.registerHttpProtocol('some-protocol', () => {
callback({ url: 'https://electron.js.cn' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('https://electron.js.cn');
});
// Deprecated in Electron 25
protocol.registerFileProtocol('some-protocol', () => {
callback({ filePath: '/path/to/my/file' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('file:///path/to/my/file');
});

已弃用:BrowserWindow.setTrafficLightPosition(position)

BrowserWindow.setTrafficLightPosition(position) 已被弃用,应改用 BrowserWindow.setWindowButtonPosition(position) API,它接受 null 而非 { x: 0, y: 0 } 来将位置重置为系统默认值。

// Deprecated in Electron 25
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,当没有自定义位置时,它返回 null 而非 { x: 0, y: 0 }

// Deprecated in Electron 25
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.
}

新特性

  • 添加了 net.fetch()#36733
    • net.fetch 支持对 file: URL 和使用 protocol.register*Protocol 注册的自定义协议的请求。 #36606
  • 添加了 BrowserWindow.set/getWindowButtonPosition API。 #37094
  • 添加了 protocol.handle,取代并废弃了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • webContents<webview> 标签添加了 will-frame-navigate 事件,该事件在框架层级中的任何框架尝试导航时触发。#34418
  • 向 navigator 事件添加了发起者信息。此信息允许区分由父框架引起的 window.open 导航与由子级发起的导航。#37085
  • 添加了 net.resolveHost,它使用 defaultSession 对象解析主机。 #38152
  • app 添加了新的 'did-resign-active' 事件。 #38018
  • webContents.print() 添加了几个标准的页面尺寸选项。 #37159
  • 在会话处理程序 ses.setDisplayMediaRequestHandler() 回调中添加了 enableLocalEcho 标志,允许在 audioWebFrameMain 时,将远程音频输入回显到本地输出流。#37315
  • powerMonitor 添加了热管理信息。 #38028
  • 允许将绝对路径传递给 session.fromPath() API。 #37604
  • webContents 上暴露了 audio-state-changed 事件。 #37366

22.x.y 持续支持

正如 告别 Windows 7/8/8.1 中所述,Electron 22(Chromium 108)的预期寿命将从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日。Electron 团队将继续将此计划中的安全修复回溯到 Electron 22,直到 2023 年 10 月 10 日。10 月的支持日期遵循 Chromium 和 Microsoft 的延长支持日期。10 月 11 日,Electron 团队将支持回退到最新的三个稳定主版本,这些版本将不再支持 Windows 7/8/8.1。

E25 (23年5月)E26 (23年8月)E27 (23年10月)
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
23.x.y24.x.y25.x.y
22.x.y22.x.y--

下一步计划

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

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

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

Electron 24.0.0

·阅读时长 4 分钟

Electron 24.0.0 已发布!它包含了 Chromium 112.0.5615.49、V8 11.2 和 Node.js 18.14.0 的升级。请继续阅读以了解更多详情!


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

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

重要变更

技术栈变更

破坏性变更

API 更改:nativeImage.createThumbnailFromPath(path, size)

maxSize 参数已更改为 size,以反映传递的尺寸将是创建缩略图的尺寸。以前,Windows 不会放大小于 maxSize 的图像,而 macOS 总是将尺寸设置为 maxSize。现在所有平台的行为都相同。

// a 128x128 image.
const imagePath = path.join('path', 'to', 'capybara.png');

// Scaling up a smaller image.
const upSize = { width: 256, height: 256 };
nativeImage.createThumbnailFromPath(imagePath, upSize).then((result) => {
console.log(result.getSize()); // { width: 256, height: 256 }
});

// Scaling down a larger image.
const downSize = { width: 64, height: 64 };
nativeImage.createThumbnailFromPath(imagePath, downSize).then((result) => {
console.log(result.getSize()); // { width: 64, height: 64 }
});

新特性

  • 已添加使用 cookies.get() 过滤 HttpOnly Cookie 的功能。#37365
  • shell.openExternal() 选项中添加了 logUsage,它允许将 SEE_MASK_FLAG_LOG_USAGE 标志传递给 Windows 上的 ShellExecuteExSEE_MASK_FLAG_LOG_USAGE 标志表示用户发起的启动,它启用了对常用程序和其他行为的跟踪。#37291
  • 已将 types 添加到 webRequest 过滤器中,增加了监听请求的能力。#37427
  • webContents 添加了新的 devtools-open-url 事件,以允许开发者打开新窗口。#36774
  • 已向 webContents.print() 添加了几种标准的页面大小选项。#37265
  • 在会话处理程序 ses.setDisplayMediaRequestHandler() 回调中添加了 enableLocalEcho 标志,允许在 audioWebFrameMain 时,将远程音频输入回显到本地输出流。#37528
  • 允许将特定于应用程序的用户名传递给 inAppPurchase.purchaseProduct()#35902
  • 暴露了 window.invalidateShadow() 以清除 macOS 上的残留视觉伪影。#32452
  • 整个程序优化现在默认在 Electron Node 头文件配置文件中启用,允许编译器在了解整个程序所有模块的信息的基础上执行优化,而不是仅基于每个模块(编译单元)进行优化。#36937
  • SystemPreferences::CanPromptTouchID (macOS) 现在支持 Apple Watch。#36935

停止支持 21.x.y

根据项目的 支持策略,Electron 21.x.y 已停止支持。鼓励开发者和应用程序升级到新版本的 Electron。

正如 告别 Windows 7/8/8.1 中所述,Electron 22(Chromium 108)的预期寿命将从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日。Electron 团队将继续将此计划中的安全修复回溯到 Electron 22,直到 2023 年 10 月 10 日。

E24 (2023 年 4 月)E25 (23年5月)E26 (23年8月)
24.x.y25.x.y26.x.y
23.x.y24.x.y25.x.y
22.x.y23.x.y24.x.y
--22.x.y22.x.y

下一步计划

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

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

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

Electron 十周年 🎉

·阅读时长 11 分钟

electron/electron 仓库的首次提交是在 2013 年 3 月 13 日1

Initial commit on electron/electron by @aroben

10 年过去了,来自 1192 位独立贡献者的 27,147 条提交记录,Electron 已成为当今构建桌面应用程序最受欢迎的框架之一。这个里程碑是一个绝佳的机会来庆祝并回顾我们迄今为止的旅程,并分享我们在此过程中学到的东西。

没有每一个奉献时间与精力为项目做出贡献的人,我们就不会有今天。虽然源代码提交始终是最显眼的贡献,但我们也要承认那些报告 Bug、维护用户空间模块、提供文档和翻译,以及参与 Electron 社区的人们的努力。对我们维护者来说,每一项贡献都弥足珍贵。

在继续阅读这篇博客文章之前:谢谢你。❤️

我们是如何走到这里的?

Atom Shell 是作为 GitHub 的 Atom 编辑器 的骨干构建的,该编辑器于 2014 年 4 月推出公开测试版。它从头开始构建,作为当时可用的 Web 应用程序框架(node-webkit 和 Chromium Embedded Framework)的替代品。它有一个杀手级特性:嵌入 Node.js 和 Chromium,为 Web 技术提供强大的桌面运行时。

一年之内,Atom Shell 在功能和受欢迎程度上都获得了巨大的增长。大公司、初创公司和个人开发者都开始用它来构建应用程序(一些早期采用者包括 SlackGitKrakenWebTorrent),该项目因此被恰当地更名为 **Electron**。

从那时起,Electron 便一路高歌猛进,从未停歇。以下是我们的每周下载量随时间变化的图表,由 npmtrends.com 提供:

Electron weekly downloads graph over time

Electron v1 于 2016 年发布,承诺提供更稳定的 API、更好的文档和工具。Electron v2 于 2018 年发布,并引入了语义化版本控制,使 Electron 开发者更容易跟踪发布周期。

到 Electron v6,我们将主要的发布周期改为固定的 12 周,以匹配 Chromium。这一决定是项目心态的转变,将“拥有最新的 Chromium 版本”从一个可选项变成了一个优先级。这减少了升级之间的技术债务,使我们更容易保持 Electron 的更新和安全。

从那时起,我们就像一台运转良好的机器,在每个 Chromium 稳定版发布的同一天发布新的 Electron 版本。当 Chromium 在 2021 年加快其发布周期到 4 周时,我们能够轻松应对,并将发布周期相应地增加到 8 周。

我们现在是 Electron v23(并且还在不断发展),并且仍然致力于构建用于构建跨平台桌面应用程序的最佳运行时。即使近年来 JavaScript 开发工具得到了蓬勃发展,Electron 仍然是桌面应用程序框架领域的稳定、经过实战检验的基石。如今,Electron 应用程序无处不在:您可以使用 Visual Studio Code 进行编程,使用 Figma 进行设计,使用 Slack 进行通信,并使用 Notion 进行笔记(以及许多其他用例)。我们为这一成就感到无比自豪,并感谢所有为此付出努力的人。

我们一路走来学到了什么?

通往十周年的道路漫长而曲折。以下是一些帮助我们运营一个可持续的大型开源项目的关键经验。

通过治理模型扩展分布式决策制定

当 Electron 首次流行起来后,我们必须克服的一个挑战是如何处理项目的长期发展方向。我们如何管理一个由分布在不同公司、国家和时区的几十名工程师组成的团队?

早期,Electron 的维护者团队依靠非正式的协调,这对于小型项目来说是快速且轻量级的,但无法扩展到更广泛的协作。2019 年,我们转向了一个治理模型,不同的工作组拥有正式的责任领域。这在简化流程和将部分项目所有权分配给特定维护者方面发挥了重要作用。如今,每个工作组(WG)负责什么?

  • 负责发布 Electron 版本(Releases WG)
  • 升级 Chromium 和 Node.js(Upgrades WG)
  • 监督公共 API 设计(API WG)
  • 维护 Electron 的安全(Security WG)
  • 运营网站、文档和工具(Ecosystem WG)
  • 社区和企业推广(Outreach WG)
  • 社区管理(Community & Safety WG)
  • 维护我们的构建基础设施、维护者工具和云服务(Infrastructure WG)

大约在转向治理模型的同时,我们也从 GitHub 将 Electron 的所有权 转移到了 OpenJS Foundation。虽然最初的核心团队今天仍在 Microsoft 工作,但他们只是构成 Electron 治理的更大范围的协作者群体的一部分。2

虽然这个模式并非完美,但它在全球疫情和持续的宏观经济逆风中很好地支持了我们。展望未来,我们计划修订治理章程,以指导我们度过 Electron 的第二个十年。

信息

如果你想了解更多信息,请查看 electron/governance 仓库!

社区

开源的社区部分很困难,尤其是当您的外展团队是由十二名工程师组成的、穿着写着“社区经理”的雨衣时。即便如此,作为一个大型开源项目意味着我们有很多用户,利用他们的能量来构建用户空间的生态系统是维持项目健康的关键部分。

我们为发展我们的社区做了些什么?

建立虚拟社区

  • 2020 年,我们启动了社区 Discord 服务器。以前我们在 Atom 的论坛有一个版块,但我们决定使用一个更非正式的消息平台,为维护者和 Electron 开发者之间的讨论以及一般的调试帮助提供一个空间。
  • 2021 年,我们在 @BlackHole1 的帮助下,建立了 Electron China 用户组。该小组在中国蓬勃发展的科技界推动了 Electron 用户群体的增长,为他们提供了一个在我们的英语社区之外交流想法和讨论 Electron 的空间。我们还要感谢 cnpm 在其 npm 的中国镜像中支持 Electron 的 nightly 发布。

参与高可见度的开源项目

  • 自 2019 年以来,我们每年都会庆祝 Hacktoberfest。Hacktoberfest 是由 DigitalOcean 组织的年度开源庆祝活动,每年我们都会收到几十名热情的贡献者,他们希望在开源软件上留下自己的印记。
  • 2020 年,我们参加了 Google Season of Docs 的首届活动,与 @bandantonio 合作重构了 Electron 的新用户教程流程。
  • 2022 年,我们首次指导了一名 Google Summer of Code 学生。@aryanshridhar 完成了大量工作,重构了 Electron Fiddle 的核心版本加载逻辑,并将其打包器迁移到了 webpack

自动化一切!

如今,Electron 治理团队约有 30 名活跃的维护者。其中不到一半是全职贡献者,这意味着有很多工作需要分配。我们保持一切顺利运行的诀窍是什么?我们的座右铭是:计算机便宜,而人力昂贵。以典型的工程师风格,我们开发了一套自动化的支持工具来让我们的生活更轻松。

Not Goma

核心 Electron 代码库是庞大的 C++ 代码,构建时间一直是限制我们快速发布 Bug 修复和新功能的因素。2020 年,我们部署了 Not Goma,这是 Google 的 Goma 分布式编译器服务的自定义 Electron 特定后端。Not Goma 处理授权用户机器的编译请求,并将过程分布在后端的数百个核心上。它还会缓存编译结果,这样其他人编译相同文件时只需下载预编译结果。

自从推出 Not Goma 以来,维护者的编译时间从几小时缩短到了几分钟。稳定的网络连接成为贡献者编译 Electron 的最低要求!

信息

如果你是一名开源贡献者,你也可以尝试 Not Goma 的只读缓存,它在 Electron Build Tools 中默认可用。

持续因子认证 (Continuous Factor Authentication)

Continuous Factor Authentication (CFA) 是 npm 双因素认证(2FA)系统之上的一层自动化,我们将其与 semantic-release 结合使用,以管理我们各种 @electron/ npm 包的安全和自动化发布。

虽然 semantic-release 已经自动化了 npm 包的发布过程,但它需要关闭双因素认证,或者传入一个绕过此限制的秘密令牌。

我们构建了 CFA,以便为任意的 CI 作业提供基于时间的一次性密码 (TOTP) 用于 npm 2FA,这使我们能够利用 semantic-release 的自动化,同时保持双因素认证的额外安全性。

我们使用 CFA 与一个 Slack 集成前端,允许维护者在任何装有 Slack 的设备上验证包的发布,只要他们手头有 TOTP 生成器。

信息

如果您想在自己的项目中试用 CFA,请查看 GitHub 存储库文档!如果您使用 CircleCI 作为您的 CI 提供商,我们还有一个 方便的 orb,可以快速为项目脚手架化 CFA。

Sheriff

Sheriff 是我们编写的一个开源工具,用于自动化管理 GitHub、Slack 和 Google Workspace 的权限。

Sheriff 的主要价值在于,权限管理应该是一个透明的过程。它使用一个 YAML 配置文件,该文件指定了所有上述服务的权限。有了 Sheriff,获得仓库的协作者身份或创建新的邮件列表就像获得 PR 批准并合并一样简单。

Sheriff 还有一个审计日志,会发布到 Slack,当 Electron 组织内任何地方发生可疑活动时,会警告管理员。

…以及我们所有的 GitHub 机器人

GitHub 是一个具有丰富 API 扩展性和名为 Probot 的第一方机器人应用程序框架的平台。为了帮助我们专注于工作的更具创造性的部分,我们构建了一套小型机器人来为我们完成繁重的工作。以下是一些例子

  • Sudowoodo 从头到尾自动化 Electron 的发布过程,从启动构建到将发布资源上传到 GitHub 和 npm。
  • Trop 通过尝试根据 GitHub PR 标签将补丁挑选到以前的发布分支,来自动化 Electron 的向后移植过程。
  • Roller 自动化地滚动升级 Electron 的 Chromium 和 Node.js 依赖。
  • Cation 是我们用于 electron/electron PR 的状态检查机器人。

总而言之,我们这个小小的机器人家族极大地提高了我们的开发效率!

下一步是什么?

当我们进入项目的第二个十年时,你可能会问:Electron 的下一步是什么?

我们将与 Chromium 的发布节奏保持同步,每 8 周发布一次新的 Electron 主要版本,使框架保持在最新的 Web 平台和 Node.js 的最新技术之上,同时为企业级应用程序保持稳定性和安全性。

我们通常在新的计划变得具体时宣布有关未来举措的新闻。如果您想跟上未来的发布、功能和一般项目更新,您可以阅读 我们的博客 并关注我们的社交媒体资料(TwitterMastodon)!

脚注

  1. 这实际上是 electron-archive/brightray 项目 的第一个提交,该项目于 2017 年被合并到 Electron 中,并将其 git 历史合并。但谁在乎呢?这是我们的生日,所以我们可以制定规则!

  2. 与普遍看法相反,Electron 不再由 GitHub 或 Microsoft 拥有,如今它是 OpenJS Foundation 的一部分。

Electron 23.0.0

·阅读时长 4 分钟

Electron 23.0.0 已发布!它包含了 Chromium 110、V8 11.0 和 Node.js 18.12.1 的升级。此外,Windows 7/8/8.1 的支持已被移除。请继续阅读以获取更多详细信息!


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

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

重要变更

技术栈变更

新特性

  • Display 对象中添加了 label 属性。#36933
  • 添加了 app.getPreferredSystemLanguages() API,用于返回用户系统的语言。 #36035
  • 添加了对 WebUSB API 的支持。#36289
  • 添加了对 SerialPort.forget() 的支持,以及在给定源被撤销时,在 Session 对象上发出的新事件 serial-port-revoked#35310
  • 添加了新的 win.setHiddenInMissionControl API,允许开发者在 macOS 上选择不显示 Mission Control。 #36092

停止支持 Windows 7/8/8.1

Electron 23 不再支持 Windows 7/8/8.1。Electron 遵循 Chromium 的计划弃用策略,该策略将 在 Chromium 109 中弃用 Windows 7/8/8.1 以及 Windows Server 2012 和 2012 R2 的支持(在此处阅读更多信息)

破坏性 API 变更

以下是 Electron 23 中引入的重大更改。您可以在 计划的重大更改 页面上了解有关这些更改和未来更改的更多信息。

移除:BrowserWindow scroll-touch-* 事件

已移除 BrowserWindow 上已弃用的 scroll-touch-beginscroll-touch-endscroll-touch-edge 事件。请改用 WebContents 上新提供的 input-event 事件。

// Removed in Electron 23.0
-win.on('scroll-touch-begin', scrollTouchBegin)
-win.on('scroll-touch-edge', scrollTouchEdge)
-win.on('scroll-touch-end', scrollTouchEnd)

// Replace with
+win.webContents.on('input-event', (_, event) => {
+ if (event.type === 'gestureScrollBegin') {
+ scrollTouchBegin()
+ } else if (event.type === 'gestureScrollUpdate') +{
+ scrollTouchEdge()
+ } else if (event.type === 'gestureScrollEnd') {
+ scrollTouchEnd()
+ }
+})

20.x.y 版本支持终止

根据项目的 支持策略,Electron 20.x.y 已停止支持。鼓励开发者和应用程序升级到新版本的 Electron。

E22 (22年11月)E23 (2023年2月)E24 (2023 年 4 月)E25 (23年5月)E26 (23年8月)
22.x.y23.x.y24.x.y25.x.y26.x.y
21.x.y22.x.y23.x.y24.x.y25.x.y
20.x.y21.x.y22.x.y23.x.y24.x.y

下一步计划

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

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

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

Electron 22.0.0

·6 分钟阅读

Electron 22.0.0 已经发布! 它包括一个新的实用工具进程 API,对 Windows 7/8/8.1 支持的更新,以及对 Chromium 108, V8 10.8, 和 Node.js 16.17.1 的升级。 请继续阅读以了解更多详情!


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

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

重要变更

技术栈变更

亮点功能

UtilityProcess API #36089

新的 UtilityProcess 主进程模块允许创建轻量级的 Chromium 子进程,该进程仅具有 Node.js 集成,同时允许使用 MessageChannel 与沙箱化渲染器进行通信。该 API 基于 Node.js 的 child_process.fork 设计,以便更容易过渡,主要区别在于入口点 modulePath 必须来自打包的应用程序内部,以便只允许加载受信任的脚本。此外,该模块默认阻止与渲染器建立通信通道,以维护主进程是应用程序中唯一受信任进程的约定。

您可以在我们的文档中阅读有关新的 UtilityProcess API 的更多信息

Windows 7/8/8.1 支持更新

信息

2023/02/16:关于 Windows Server 2012 支持的更新

上个月,Google 宣布 Chrome 109 将继续为 Windows Server 2012 和 Windows Server 2012 R2 提供关键安全修复,直到 2023 年 10 月 10 日。因此,Electron 22(Chromium 108)的预期寿命将从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日。Electron 团队将继续将此计划中的安全修复回溯到 Electron 22,直到 2023 年 10 月 10 日。

请注意,我们不会为 Windows 7/8/8.1 提供额外的安全修复。此外,如先前宣布,Electron 23 (Chromium 110) 将只在 Windows 10 及以上版本运行。

Electron 22 将是最后一个支持 Windows 7/8/8.1 的 Electron 主版本。Electron 遵循 Chromium 的计划弃用策略,该策略将 在 Chromium 109 中弃用 Windows 7/8/8.1 的支持(在此处阅读更多信息)

Electron 23 及更高版本将不再支持 Windows 7/8/8.1。

其他亮点变更

  • 增加了对 Linux 和 Windows 上 Web Bluetooth PIN 配对的支持。#35416
  • 添加了 LoadBrowserProcessSpecificV8Snapshot 作为一项新功能,它允许主/浏览器进程从 browser_v8_context_snapshot.bin 文件加载其 v8 快照。其他任何进程将使用与今天相同的路径。#35266
  • 添加了 WebContents.opener 以访问窗口打开程序,以及 webContents.fromFrame(frame) 以获取与 WebFrameMain 实例对应的 WebContents。#35140
  • 通过一个新的会话处理程序 ses.setDisplayMediaRequestHandler,增加了对 navigator.mediaDevices.getDisplayMedia 的支持。#30702

破坏性 API 变更

以下是 Electron 22 中引入的重大更改。您可以在 计划的重大更改 页面上了解有关这些更改和未来更改的更多信息。

已弃用:webContents.incrementCapturerCount(stayHidden, stayAwake)

webContents.incrementCapturerCount(stayHidden, stayAwake) 已被弃用。 现在当页面捕获完成时,它由 webContents.capturePage 自动处理。

const w = new BrowserWindow({ show: false })

- w.webContents.incrementCapturerCount()
- w.capturePage().then(image => {
- console.log(image.toDataURL())
- w.webContents.decrementCapturerCount()
- })

+ w.capturePage().then(image => {
+ console.log(image.toDataURL())
+ })

已弃用:webContents.decrementCapturerCount(stayHidden, stayAwake)

webContents.decrementCapturerCount(stayHidden, stayAwake) 已被弃用。 现在当页面捕获完成时,它由 webContents.capturePage 自动处理。

const w = new BrowserWindow({ show: false })

- w.webContents.incrementCapturerCount()
- w.capturePage().then(image => {
- console.log(image.toDataURL())
- w.webContents.decrementCapturerCount()
- })

+ w.capturePage().then(image => {
+ console.log(image.toDataURL())
+ })

已移除: WebContents 的 new-window 事件

WebContents 的 new-window 事件已被移除。它被 webContents.setWindowOpenHandler() 取代。

- webContents.on('new-window', (event) => {
- event.preventDefault()
- })

+ webContents.setWindowOpenHandler((details) => {
+ return { action: 'deny' }
+ })

已弃用:BrowserWindow scroll-touch-* 事件

BrowserWindow 上的 scroll-touch-beginscroll-touch-endscroll-touch-edge 事件已弃用。现在,请使用 WebContents 上新提供的 input-event 事件

// Deprecated
- win.on('scroll-touch-begin', scrollTouchBegin)
- win.on('scroll-touch-edge', scrollTouchEdge)
- win.on('scroll-touch-end', scrollTouchEnd)

// Replace with
+ win.webContents.on('input-event', (_, event) => {
+ if (event.type === 'gestureScrollBegin') {
+ scrollTouchBegin()
+ } else if (event.type === 'gestureScrollUpdate') {
+ scrollTouchEdge()
+ } else if (event.type === 'gestureScrollEnd') {
+ scrollTouchEnd()
+ }
+ })

19.x.y 版本支持结束

根据项目的 支持策略,Electron 19.x.y 已停止支持。鼓励开发者和应用程序升级到新版本的 Electron。

E19 (22年5月)E20 (22年8月)E21 (22年9月)E22 (22年11月)E23 (23年1月)
19.x.y20.x.y21.x.y22.x.y23.x.y
18.x.y19.x.y20.x.y21.x.y22.x.y
17.x.y18.x.y19.x.y20.x.y21.x.y

下一步计划

Electron 项目将在 2022 年 12 月暂停,并于 2023 年 1 月返回。更多信息可以在 12 月停工博客文章 中找到。

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

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

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

告别 Windows 7/8/8.1

·3 分钟阅读

从 Electron 23 开始,Electron 将结束对 Windows 7、Windows 8 和 Windows 8.1 的支持。


根据 Chromium 的弃用策略,Electron 将在 Electron 23 开始停止支持 Windows 7、Windows 8 和 Windows 8.1。这与 Microsoft 对 Windows 7 ESUWindows 8.1 扩展支持 在 2023 年 1 月 10 日的结束日期相符。

Electron 22 将是最后一个支持 Windows 10 以下版本的 Electron 主版本。Electron 23 及后续主版本将不再支持 Windows 7/8/8.1。旧版本的 Electron 将继续在 Windows 7 上运行,我们将继续为 Electron 22.x 系列发布补丁,直到 2023 年 5 月 30 日,届时 Electron 将停止支持 22.x(根据我们的 支持时间表)。

为何弃用?

Electron 遵循 Chromium 的计划弃用策略,该策略将在 Chromium 109 中弃用支持(在此处阅读有关 Chromium 时间表的更多信息)。Electron 23 将包含 Chromium 110,它将不支持旧版本的 Windows。

因此,包含 Chromium 108 的 Electron 22 将是最后一个受支持的版本。

弃用时间表

以下是我们计划的弃用时间表

  • 2022 年 12 月:Electron 团队进入假期休整期
  • 2023 年 1 月:所有受支持的发布分支都接受与 Windows 7 和 8 相关的问题。
  • 2023 年 2 月 7 日:Electron 23 发布。
  • 2023 年 2 月 8 日 - 2023 年 5 月 29 日:Electron 将继续为早于 Electron 23 的受支持产品线接受修复。
  • 2023 年 5 月 30 日:Electron 22 达到其支持周期终点。

这对开发者意味着什么

  • Electron 团队将为稳定的受支持产品线接受与 Windows 7/8/8.1 相关的问题和修复,直到每个产品线达到其支持周期终点。
    • 这特别适用于 Electron 22、Electron 21 和 Electron 20。
  • 对于早于 Electron 23 的版本,将接受与 Windows 7/8/8.1 相关的新问题。
    • 任何更新的发布产品线将不再接受新问题。
  • 一旦 Electron 22 达到其支持周期终点,所有与 Windows 7/8/8.1 相关的现有问题都将被关闭。
信息

2023/02/16:关于 Windows Server 2012 支持的更新

上个月,Google 宣布 Chrome 109 将继续为 Windows Server 2012 和 Windows Server 2012 R2 提供关键安全修复,直到 2023 年 10 月 10 日。因此,Electron 22(Chromium 108)的预期寿命将从 2023 年 5 月 30 日延长至 2023 年 10 月 10 日。Electron 团队将继续将此计划中的安全修复回溯到 Electron 22,直到 2023 年 10 月 10 日。

请注意,我们不会为 Windows 7/8/8.1 提供额外的安全修复。此外,如先前宣布,Electron 23 (Chromium 110) 将只在 Windows 10 及以上版本运行。

下一步

如果您有任何疑问或疑虑,请随时写信给我们:info@electronjs.org。您也可以在我们官方的 Electron Discord 中获得社区支持。

寂静之地 2 (22 年 12 月)

·阅读时间 2 分钟

Electron 项目将在 2022 年 12 月暂停,并于 2023 年 1 月恢复全速运行。

来自 GIPHY


12 月份保持不变的事项

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

12 月份会有所不同的事项

  1. 12 月份不发布稳定版本。12 月最后两周不发布 Nightly 和 Alpha 版本。
  2. 除少数例外情况外,不会进行 Pull Request 的审查或合并。
  3. 任何代码仓库的 Issue Tracker 都不会有更新。
  4. 维护者不会在 Discord 上提供调试帮助。
  5. 社交媒体内容将暂停更新。

为什么要这样做?

继 2021 年 12 月的“静默月”取得成功后,我们希望在 2022 年再次举办。12 月对大多数公司来说仍然是相对平静的月份,所以我们希望给我们的维护者一个充电的机会。每个人都对 2023 年充满期待,我们预计会有很多好事发生!我们鼓励其他项目考虑类似的措施。