Electron 十周年 🎉
electron/electron
仓库的首次提交是在 2013 年 3 月 13 日1。
十年过去了,经过 1192 位独立贡献者的 27147 次提交,Electron 已经成为当今构建桌面应用程序最流行的框架之一。这个里程碑是庆祝和反思我们迄今为止的旅程,并分享我们一路走来所学到的东西的绝佳机会。
没有每一位为项目贡献时间和精力的人,我们不可能有今天。尽管源代码提交一直是最显而易见的贡献,但我们也要感谢那些报告错误、维护用户区模块、提供文档和翻译以及在网络空间中参与 Electron 社区的人们。作为维护者,每一次贡献对我们来说都是无价的。
在继续阅读这篇博客文章之前:谢谢你。❤️
我们是如何走到这里的?
Atom Shell 是作为 GitHub 的 Atom 编辑器 的核心构建的,该编辑器于 2014 年 4 月发布了公开测试版。它是从头开始构建的,作为当时可用的基于 Web 的桌面框架(node-webkit 和 Chromium Embedded Framework)的替代品。它有一个杀手级功能:嵌入 Node.js 和 Chromium,为 Web 技术提供强大的桌面运行时。
在一年之内,Atom Shell 的功能和受欢迎程度开始迅速增长。大公司、初创公司和个人开发者都开始用它来构建应用程序(一些早期采用者包括 Slack、GitKraken 和 WebTorrent),这个项目也因此被恰当地重新命名为 Electron。
从那时起,Electron 便一路高歌猛进,从未停歇。以下是我们的每周下载量随时间变化的图表,由 npmtrends.com 提供:
Electron v1 于 2016 年发布,承诺提供更稳定的 API、更好的文档和工具。Electron v2 于 2018 年发布,并引入了语义化版本控制,使 Electron 开发者更容易跟踪发布周期。
到 Electron v6 时,我们转向了每 12 周发布一个主版本的固定节奏,以与 Chromium 保持一致。这个决定是项目心态上的一个转变,将“拥有最新的 Chromium 版本”从一个可有可无的选项变成了一个优先事项。这减少了升级之间的技术债务,使我们更容易保持 Electron 的更新和安全。
从那时起,我们就像一台上满油的机器,每个 Chromium 稳定版发布的同一天,我们也会发布一个新的 Electron 版本。到 2021 年 Chromium 将其发布周期加快到 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)
大约在转向治理模式的同时,我们还将 Electron 的所有权从 GitHub 移交给了 OpenJS 基金会。虽然最初的核心团队今天仍在微软工作,但他们只是构成 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 中默认可用。
持续因子认证 (Continuous Factor Authentication)
持续因子认证 (CFA) 是一个围绕 npm 的双因素认证 (2FA) 系统的自动化层,我们将其与 semantic-release 结合使用,来管理我们各种 @electron/
npm 包的安全和自动化发布。
虽然 semantic-release 已经自动化了 npm 包的发布过程,但它需要关闭双因素认证,或者传入一个绕过此限制的秘密令牌。
我们构建了 CFA,以便为任意的 CI 作业提供基于时间的一次性密码 (TOTP) 用于 npm 2FA,这使我们能够利用 semantic-release 的自动化,同时保持双因素认证的额外安全性。
我们使用 CFA 与一个 Slack 集成前端,允许维护者在任何装有 Slack 的设备上验证包的发布,只要他们手头有 TOTP 生成器。
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 的最新和最棒的功能来更新框架,同时为企业级应用保持稳定性和安全性。
我们通常在即将推出的计划变得具体时宣布相关消息。如果你想了解未来的发布、功能和项目总体更新,可以阅读我们的博客并关注我们的社交媒体账号(Twitter 和 Mastodon)!
脚注
-
这实际上是来自 electron-archive/brightray 项目 的第一次提交,该项目于 2017 年被并入 Electron,并合并了其 git 历史。但谁在乎呢?今天是我们的生日,所以我们说了算!↩
-
与普遍看法相反,Electron 不再由 GitHub 或微软拥有,而是 OpenJS 基金会的一部分。↩