跳到主要内容

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

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

值得注意的更改

堆栈更改

重大更改

已删除:macOS 10.13 / 10.14 支持

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

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

已弃用: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 (Oct'23)E28 (Dec'23)E29 (Feb'24)
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)调查发现,一个“总部位于华盛顿特区的公民社会组织”使用 iMessage 中的零点击漏洞攻击了一部 iPhone。

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 的沙盒构建在这些系统功能的顶部。即使您从未显示用户生成的内容,您也应该考虑您的渲染器可能受到损害的可能性:像供应链攻击这样复杂的场景,以及像小错误这样简单的场景,都可能导致您的渲染器执行您并非完全打算让它执行的事情。

沙盒使这种情况变得不那么可怕:内部的进程可以自由地使用 CPU 周期和内存——就是这样。进程无法写入磁盘或显示它们自己的窗口。在我们 libwep 错误的情况下,沙盒确保攻击者无法安装或运行恶意软件。事实上,在最初的 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. 由于启用沙盒会禁用 preload 脚本中的 Node.js 集成,因此您不能再使用 require("../my-script")。换句话说,您的 preload 脚本需要是一个单独的文件。

    有多种方法可以做到这一点: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 使用 npm install electron@latest 安装它,或者从我们的发布网站下载它。继续阅读以了解有关此版本的详细信息。

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

值得注意的更改

堆栈更改

重大更改

已弃用: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
  • senderIsMainFrame 添加到通过 ipcRenderer.sendTo() 发送的消息中。#39206
  • 添加了对将菜单标记为键盘启动的支持。#38954

对 23.x.y 停止支持

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

E26 (23年8月)E27 (Oct'23)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 使用 npm install electron@latest 安装它,或从我们的发布网站下载它。 继续阅读以了解有关此版本的详细信息。

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

值得注意的更改

亮点

  • 在 Electron 的 net 模块中实现了 net.fetch,使用 Chromium 的网络堆栈。 这与使用 Node.js 的 HTTP 堆栈的 Node 的 fetch() 不同。 请参阅#36733#36606
  • 添加了 protocol.handle,它替换并弃用了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • 扩展了对 Electron 22 的支持,以匹配 Chromium 和 Microsoft 的 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,该 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,当没有自定义位置时,该 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
  • will-frame-navigate 事件添加到 webContents<webview> 标签,每当框架层次结构中的任何框架尝试导航时,都会触发该事件。#34418
  • 将启动器信息添加到导航器事件。 此信息允许区分 window.open 与导致导航的父框架,而不是子框架启动的导航。#37085
  • 添加了 net.resolveHost,它使用 defaultSession 对象解析主机。#38152
  • app 添加了新的 'did-resign-active' 事件。#38018
  • webContents.print() 添加了几个标准页面尺寸选项。#37159
  • enableLocalEcho 标志添加到会话处理程序 ses.setDisplayMediaRequestHandler() 回调中,以允许在 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 (Oct'23)
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 使用 npm install electron@latest 安装它,或从我们的发布网站下载它。 继续阅读以了解有关此版本的详细信息。

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

值得注意的更改

堆栈更改

重大更改

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

maxSize 参数已更改为 size,以反映传入的大小将是创建的缩略图的大小。 以前,如果图像小于 maxSize,Windows 将不会放大图像,并且 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
  • logUsage 添加到 shell.openExternal() 选项,允许将 SEE_MASK_FLAG_LOG_USAGE 标志传递给 Windows 上的 ShellExecuteExSEE_MASK_FLAG_LOG_USAGE 标志指示用户启动启动,从而能够跟踪常用程序和其他行为。#37291
  • types 添加到 webRequest 过滤器,从而能够过滤您侦听的请求。#37427
  • webContents 添加了一个新的 devtools-open-url 事件,以允许开发人员使用它们打开新窗口。#36774
  • webContents.print() 添加了几个标准页面尺寸选项。#37265
  • enableLocalEcho 标志添加到会话处理程序 ses.setDisplayMediaRequestHandler() 回调中,以允许在 audioWebFrameMain 时,将远程音频输入回显到本地输出流中。#37528
  • 允许将特定于应用程序的用户名传递给 inAppPurchase.purchaseProduct()#35902
  • 公开了 window.invalidateShadow() 以清除 macOS 上的残留视觉伪影。#32452
  • 现在默认在 electron 节点标头配置文件中启用整个程序优化,允许编译器使用程序中所有模块的信息(而不是基于每个模块(编译单元))来执行优化。#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 (23年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

在 1192 位独特贡献者的 10 年和 27,147 次更多提交之后,Electron 已成为当今构建桌面应用程序的最流行的框架之一。 这个里程碑是庆祝和反思我们迄今为止的旅程的绝佳机会,并分享我们一路走来所学到的东西。

如果没有所有投入时间和精力为项目做出贡献的人,我们今天就不会在这里。 尽管源代码提交始终是最显眼的贡献,但我们还必须承认那些报告错误、维护 userland 模块、提供文档和翻译以及参与网络空间中的 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 版本(发布 WG)
  • 升级 Chromium 和 Node.js(升级 WG)
  • 监督公共 API 设计(API WG)
  • 保持 Electron 安全(安全 WG)
  • 运行网站、文档和工具(生态系统 WG)
  • 社区和公司外展(外展 WG)
  • 社区审核(社区与安全 WG)
  • 维护我们的构建基础设施、维护者工具和云服务(基础设施 WG)

大约在我们转向治理模型的同时,我们还将 Electron 的所有权从 GitHub 转移到 OpenJS 基金会。 尽管最初的核心团队今天仍在 Microsoft 工作,但他们只是构成 Electron 治理的更大协作群体的一部分。2

虽然此模型并不完美,但在全球疫情和持续的宏观经济逆风中,它非常适合我们。 展望未来,我们计划修改治理章程,以指导我们度过 Electron 的第二个十年。

信息

如果您想了解更多信息,请查看 electron/governance 存储库!

社区

开源的社区部分很难,尤其是在您的外展团队是由十几个穿着风衣并说“社区经理”的工程师组成的情况下。 也就是说,作为一个大型开源项目意味着我们有很多用户,利用他们的能量让 Electron 构建一个用户领域生态系统是维持项目健康的关键部分。

为了发展我们的社区影响力,我们一直在做什么?

构建虚拟社区

  • 在 2020 年,我们启动了我们的社区 Discord 服务器。 我们之前在 Atom 的论坛中有一个部分,但决定拥有一个更非正式的消息传递平台,以便维护者和 Electron 开发人员之间进行讨论,并提供一般的调试帮助。
  • 在 2021 年,我们在 @BlackHole1 的帮助下成立了 Electron China 用户组。 该小组在 Electron 用户(来自中国蓬勃发展的科技界)的增长中发挥了重要作用,为他们提供了一个协作想法和讨论英语空间之外的 Electron 的空间。 我们还要感谢 cnpm 在其 npm 中文镜像中支持 Electron 的夜间版本方面所做的工作。

参与高知名度的开源计划

  • 自 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++ 代码的庞然大物,构建时间一直是限制我们发布错误修复程序和新功能的速度的一个因素。 在 2020 年,我们部署了 Not Goma,它是 Google 的 Goma 分布式编译器服务的自定义 Electron 特定后端。 Not Goma 处理来自授权用户机器的编译请求,并将该过程分布在后端数百个核心上。 它还会缓存编译结果,以便其他人编译相同的文件时只需要下载预编译的结果。

自启动 Not Goma 以来,维护者的编译时间已从数小时缩短到数分钟。 稳定的互联网连接成为贡献者编译 Electron 的最低要求!

信息

如果您是开源贡献者,您也可以尝试 Not Goma 的只读缓存,该缓存在默认情况下通过 Electron Build Tools 提供。

持续因子身份验证

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

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

我们构建 CFA 是为了为 npm 2FA 提供基于时间的一次性密码 (TOTP) 给任意 CI 作业,允许我们利用 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 标签将补丁 cherry-pick 到以前的发布分支来自动化 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 基金会 的一部分。

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

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

值得注意的更改

堆栈更改

新功能

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

放弃 Windows 7/8/8.1 支持

Electron 23 不再支持 Windows 7/8/8.1。 Electron 遵循计划的 Chromium 弃用策略,该策略将 弃用 Windows 7/8/8.1 以及 Chromium 109 中的 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 (23 年 2 月)E24 (23年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 使用 npm install electron@latest 安装它,或者从我们的 发布网站 下载它。 继续阅读以了解有关此版本的详细信息。

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

值得注意的更改

堆栈更改

突出显示的特点

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 月恢复。 更多信息可以在 十二月关闭博客文章中找到。

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

您可以在此处找到 Electron 的公共时间表

有关未来更改的更多信息,请访问计划的重大更改页面。

告别 Windows 7/8/8.1

·3 分钟阅读

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


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

Electron 22 将是最后一个支持低于 10 的 Windows 版本的 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。
  • 与 Windows 7/8/8.1 相关的新问题将被接受用于旧于 Electron 23 的 Electron 版本。
    • 任何更新的发布行都不会接受新问题。
  • 一旦 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 中找到社区支持。

寂静之地 Part II (Dec'22)

·2 分钟阅读

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

通过 GIPHY


十二月将保持不变的内容

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

十二月将发生变化的内容

  1. 十二月没有新的稳定版本。 十二月的最后两周没有 Nightly 和 Alpha 版本。
  2. 除了少数例外,没有拉取请求审核或合并。
  3. 任何存储库上都没有问题跟踪器更新。
  4. 维护人员不提供 Discord 调试帮助。
  5. 没有社交媒体内容更新。

为什么会这样?

鉴于 2021 年 12 月安静月的成功,我们希望在 2022 年将其带回来。 十二月仍然是大多数公司的安静月份,因此我们希望让我们的维护人员有机会充电。 每个人都期待 2023 年,我们期待美好的事物! 我们鼓励其他项目考虑类似的措施。