跳到主要内容

从漏洞到壁垒:通过沙盒加强应用程序

·4 分钟阅读

距离 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 的沙盒构建在这些系统功能之上。即使你从不显示用户生成的内容,你也应该考虑你的渲染器可能受到威胁的可能性:供应链攻击这种复杂的场景,以及小错误这种简单的场景,都可能导致你的渲染器执行你完全不打算让它执行的事情。

沙盒让这种情况变得不那么可怕:内部进程可以自由使用 CPU 周期和内存——仅此而已。进程无法写入磁盘或显示自己的窗口。在我们的 libwep 错误案例中,沙盒确保攻击者无法安装或运行恶意软件。事实上,在针对员工 iPhone 的原始 Pegasus 攻击案例中,攻击者专门针对一个非沙盒化的图像进程来获取对手机的访问权限,首先突破了正常沙盒化的 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

·2 分钟阅读

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
  • 为通过 ipcRenderer.sendTo() 发送的消息添加了 senderIsMainFrame#39206
  • 添加了将菜单标记为键盘触发的功能。#38954

结束支持 23.x.y

根据项目的支持政策,Electron 23.x.y 已达到支持结束期限。鼓励开发者和应用程序升级到更新的 Electron 版本。

E26 (Aug'23)E27 (Oct'23)E28 (Jan'24)
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 的 fetch() 不同,后者使用 Node.js 的 HTTP 栈。参见 #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
  • webContents<webview> 标签添加了 will-frame-navigate 事件,该事件在框架层级结构中的任何框架尝试导航时触发。#34418
  • 为导航事件添加了发起者信息。此信息允许区分由父框架引起的导航 (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 (May'23)E26 (Aug'23)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 cookies 的功能。#37365
  • shell.openExternal() 选项添加了 logUsage,它允许在 Windows 上将 SEE_MASK_FLAG_LOG_USAGE 标志传递给 ShellExecuteExSEE_MASK_FLAG_LOG_USAGE 标志表示用户发起的启动,启用对常用程序和其他行为的跟踪。#37291
  • webRequest 过滤器添加了 types,增加了过滤你监听的请求的能力。#37427
  • webContents 添加了一个新的 devtools-open-url 事件,允许开发者使用它们打开新窗口。#36774
  • webContents.print() 添加了几个标准页面尺寸选项。#37265
  • 为会话处理程序 ses.setDisplayMediaRequestHandler() 回调添加了 enableLocalEcho 标志,以便在 audioWebFrameMain 时,允许将远程音频输入回显到本地输出流中。#37528
  • 允许将应用程序特定的用户名传递给 inAppPurchase.purchaseProduct()#35902
  • 暴露了 window.invalidateShadow() 以清除 macOS 上的残余视觉伪影。#32452
  • 电子节点头文件配置文件中现默认启用全程序优化,允许编译器利用程序中所有模块的信息进行优化,而非基于单个模块(编译单元)进行。#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 (Apr'23)E25 (May'23)E26 (Aug'23)
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 十周年 🎉

·10 分钟阅读

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

Initial commit on electron/electron by @aroben

10 年后,以及来自 1192 位独特贡献者的 27,147 次额外提交之后,Electron 已成为当今最受欢迎的桌面应用程序构建框架之一。这个里程碑是庆祝和反思我们迄今为止的历程、并分享我们一路走来所学到的知识的绝佳机会。

没有所有那些投入时间和精力为项目做出贡献的人,就没有我们今天。虽然源代码提交总是最显眼的贡献,但我们也必须认可那些报告错误、维护用户区模块、提供文档和翻译以及参与网络空间 Electron 社区的人们的努力。作为维护者,每一份贡献对我们来说都弥足珍贵。

在我们继续博客文章的其余部分之前:谢谢你们。❤️

我们是如何走到今天的?

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

在一年内,Atom Shell 的能力和受欢迎程度开始大幅增长。大公司、初创企业和个人开发者都开始使用它构建应用程序(一些早期采用者包括 SlackGitKrakenWebTorrent),该项目也恰当地被更名为 Electron

从那时起,Electron 便一往无前,从未止步。以下是 Electron 随时间推移的每周下载量,数据来自 npmtrends.com

Electron weekly downloads graph over time

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

到了 Electron v6,我们将主要版本发布周期调整为与 Chromium 保持一致的固定 12 周周期。这一决定改变了项目的理念,将“拥有最新版 Chromium”从一个加分项转变为优先事项。这减少了升级之间的技术债务,使我们更容易保持 Electron 的更新和安全。

自那时起,我们就像一台运转良好的机器,在每个 Chromium 稳定版发布的同一天发布一个新的 Electron 版本。到 2021 年 Chromium 将其发布周期加快到 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 Foundation。尽管最初的核心团队至今仍工作于 Microsoft,但他们只是构成 Electron 治理的更庞大协作者群体的一部分。2

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

信息

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

社区

开源项目的社区部分很难,特别是当你的外联团队是十几个穿着风衣、上面写着“社区经理”的工程师时。也就是说,作为一个大型开源项目意味着我们有很多用户,而利用他们的能量为 Electron 构建用户态生态系统是维持项目健康的关键部分。

我们一直在做些什么来发展我们的社区影响力?

构建虚拟社区

  • 2020 年,我们启动了社区 Discord 服务器。此前我们在 Atom 的论坛中有一个板块,但后来决定采用一个更非正式的消息平台,以便为维护者和 Electron 开发者之间的讨论以及一般的调试帮助提供空间。
  • 2021 年,我们在 @BlackHole1 的帮助下成立了 Electron 中国 用户组。这个小组对 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++ 代码集合,构建时间一直是限制我们发布错误修复和新功能速度的因素。2020 年,我们部署了 Not Goma,这是 Google Goma 分布式编译器服务的自定义 Electron 特有后端。Not Goma 处理来自授权用户机器的编译请求,并将过程分布到后端数百个核心上。它还缓存编译结果,这样其他人编译相同文件时,只需要下载预编译结果即可。

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

信息

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

持续因素认证 (Continuous Factor Authentication)

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

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

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

我们使用带有 Slack 集成前端的 CFA,允许维护者从任何装有 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 自动化 Electron 的向后移植过程,根据 GitHub PR 标签尝试将补丁 cherry-pick 到以前的发布分支。
  • 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

·阅读时长 3 分钟

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() 的支持,并在 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(23 年 2 月)E24 (Apr'23)E25 (May'23)E26 (Aug'23)
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

·5 分钟阅读

Electron 22.0.0 已发布!它包括新的 UtilityProcess 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 作为新的 fuse,允许主/浏览器进程从 browser_v8_context_snapshot.bin 文件加载其 v8 快照。任何其他进程将使用当前相同的路径。#35266
  • 添加了 WebContents.opener 以访问窗口打开器,并添加了 webContents.fromFrame(frame) 以获取与 WebFrameMain 实例对应的 WebContents。#35140
  • 通过新的 session 处理程序 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 的 Electron 版本,将接受与 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 中获得社区支持。

寂静之地 II (Dec'22)

·阅读时长 1 分钟

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

via GIPHY


12 月保持不变的事项

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

12 月会有所不同的事项

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

为什么会这样?

鉴于 2021 年 12 月静默月的成功,我们希望在 2022 年再次这样做。12 月对于大多数公司来说仍然是一个安静的月份,所以我们想让维护者有机会充电。每个人都期待着 2023 年,我们期望好事情发生!我们鼓励其他项目考虑类似的措施。

Electron Forge 6 简介

·阅读时长 6 分钟

我们很高兴地宣布 Electron Forge v6.0.0 现已发布!此版本标志着 Forge 自 2018 年以来的第一个主要版本,并将项目从 electron-userland 迁移到 Github 上的主 electron 组织下。

继续阅读以了解新功能以及您的应用如何采用 Electron Forge!

什么是 Electron Forge?

Electron Forge 是一个用于打包和分发 Electron 应用的工具。它将 Electron 的构建工具生态系统统一到一个可扩展的接口中,以便任何人都可以直接上手制作 Electron 应用。

主要功能包括:

  • 📦 应用打包和代码签名
  • 🚚 Windows、macOS 和 Linux 上可定制的安装程序(DMG、deb、MSI、PKG、AppX 等)
  • ☁️ 针对云提供商(GitHub、S3、Bitbucket 等)的自动化发布流程
  • ⚡️ 易于使用的 Webpack 和 TypeScript 样板模板
  • ⚙️ 原生 Node.js 模块支持
  • 🔌 可扩展的 JavaScript 插件 API
延伸阅读

访问为什么选择 Electron Forge 文档,了解更多关于 Forge 的理念和架构。

v6 的新功能?

完全重写

从 v1 到 v5,Electron Forge 基于现已停止维护的 electron-compile 项目。Forge 6 完全重写了该项目,采用新的模块化架构,可以根据任何 Electron 应用的需求进行扩展。

在过去几年中,Forge v6.0.0-beta 已经实现了与 v5 的功能对等,并且代码变更显著放缓,使得该工具可以普遍采用。

不要安装错误的包

对于版本 5 及以下,Electron Forge 发布在 npm 上的 electron-forge 包中。从 v6 重写开始,Forge 转而构建为一个包含许多小项目的 monorepo 项目。

官方支持

在历史上,Electron 维护者对构建工具没有发表明确的意见,将任务留给了各种社区包。然而,随着 Electron 项目的成熟,新的 Electron 开发者越来越难理解他们需要哪些工具来构建和分发他们的应用。

为了帮助指导 Electron 开发者进行分发过程,我们决定将 Forge 作为 Electron 的官方内置构建流程

在过去的一年中,我们一直在将 Forge 慢慢集成到官方的 Electron 文档中,并且最近我们将 Forge 从旧的 electron-userland/electron-forge 仓库迁移到了 electron/forge 仓库。现在,我们终于准备好向大众发布 Electron Forge 了!

入门

初始化新的 Forge 项目

可以使用 create-electron-app CLI 脚本来脚手架一个新的 Electron Forge 项目。

yarn create electron-app my-app --template=webpack
cd my-app
yarn start

该脚本将在 my-app 文件夹中创建一个 Electron 项目,该项目具有完整的 JavaScript 打包和预配置的构建流程。

更多信息请参阅 Forge 文档中的入门指南

一流的 webpack 支持

上面的代码片段使用了 Forge 的Webpack 模板,我们建议将其作为新 Electron 项目的起点。此模板围绕 @electron-forge/plugin-webpack 插件构建,该插件以几种方式将 webpack 与 Electron Forge 集成,包括:

  • 通过 webpack-dev-server 增强本地开发流程,包括支持渲染进程中的 HMR;
  • 在应用打包之前处理 webpack 打包的构建逻辑;以及
  • 在 webpack 打包过程中添加对原生 Node 模块的支持。

如果您需要 TypeScript 支持,请考虑使用Webpack + TypeScript 模板

导入现有项目

Electron Forge CLI 还包含一个用于导入现有 Electron 项目的命令。

cd my-app
yarn add --dev @electron-forge/cli
yarn electron-forge import

当您使用 import 命令时,Electron Forge 将添加一些核心依赖项并创建一个新的 forge.config.js 配置文件。如果您有任何现有的构建工具(例如 Electron Packager、Electron Builder 或 Forge 5),它将尝试迁移尽可能多的设置。您的一些现有配置可能需要手动迁移。

手动迁移的详细信息可以在 Forge 导入文档中找到。如果您需要帮助,请随时加入我们的 Discord 服务器

为什么要切换到 Forge?

如果您已经有了用于打包和发布 Electron 应用的工具,采用 Electron Forge 的好处仍然可能超过初始的切换成本。

我们认为使用 Forge 有两个主要好处:

  1. Forge 会尽快获得 Electron 支持的新应用构建功能。在这种情况下,您无需自己连接新的工具支持,也无需等待其他包最终实现该支持后才能升级。最近的例子包括 macOS 通用二进制文件ASAR 完整性检查

  2. Forge 的多包架构使其易于理解和扩展。由于 Forge 由许多职责明确的小包组成,因此更容易跟踪代码流。此外,Forge 可扩展的 API 设计意味着您可以编写自己的附加构建逻辑,与提供的配置选项分开,以用于高级用例。有关编写自定义 Forge 插件、makers 和 publishers 的更多详细信息,请参阅文档的扩展 Electron Forge 部分。

重大变更

Forge 6 在 beta 阶段花费了很长时间,其发布节奏逐渐放缓。然而,我们在 2022 年下半年加速了开发,并利用最后几个版本在 v6.0.0 稳定版发布之前推出了一些最终的重大变更。

如果您是 Electron Forge 6 beta 用户,请参阅 v6.0.0 GitHub 发布说明,了解近期 beta 版本(>=6.0.0-beta.65)中进行的重大变更列表。

完整的变更列表和提交记录可以在仓库的 CHANGELOG.md 中找到。

提交您的反馈!

告诉我们您需要什么!Electron Forge 团队一直在寻求改进项目以更好地满足用户需求。

您可以通过提交功能请求、发布问题或仅仅告知我们您的反馈来帮助我们改进 Electron Forge!您也可以加入官方 Electron Discord 服务器,那里有一个专门用于讨论 Electron Forge 的频道。

如果您想对 https://forge.electron.js.cn 上的 Forge 文档提供任何反馈,我们有一个与 electron-forge/electron-forge-docs 仓库同步的 GitBook 实例。