为何选择 Electron
Electron 是一个框架,它使开发者能够通过结合 Web 技术(HTML、JavaScript、CSS)与 Node.js 和原生代码来构建跨平台桌面应用程序,适用于 macOS、Windows 和 Linux。它是开源的,采用 MIT 许可,可免费用于商业和个人用途。 在本文档中,我们将解释为什么公司和开发者选择 Electron。
我们可以将 Electron 的优势分为两个问题:首先,为什么你应该使用 Web 技术来构建你的应用程序?然后,为什么你应该选择 Electron 作为框架来实现它?
如果你已经在使用 Web 技术构建你的应用程序,可以直接跳到下面的 为什么选择 Electron? 部分。
为什么选择 Web 技术
Web 技术包括 HTML、CSS、JavaScript 和 WebAssembly。它们是现代互联网的门面。这些技术已成为构建用户界面的最佳选择——既适用于面向消费者的应用程序,也适用于关键业务应用程序。这对于需要在浏览器中运行以及无法从浏览器访问的桌面应用程序都是如此。我们在这里大胆地声称,这不仅适用于需要在多个操作系统上运行的跨平台应用程序,而是普遍适用的。
例如,NASA 实际的 任务控制 是用 Web 技术编写的。 彭博终端,在每家金融机构都能找到的计算机系统,是用 Web 技术编写的,并在 Chromium 中运行。它每用户每年花费 25,000 美元。麦当劳的订购亭,为世界上最大的快餐零售商提供服务,完全由 Chromium 构建。 SpaceX 的龙 2 号飞船 使用 Chromium 来显示其界面。 你明白了吗:Web 技术是构建用户界面的绝佳技术栈。
以下是我们,Electron 维护者,看好 Web 的原因。
多功能性
现代版本的 HTML 和 CSS 使你的开发者和设计师能够充分表达自己。Web 的展示包括 Google Earth、Netflix、Spotify、Gmail、Facebook、Airbnb 或 GitHub。 无论你的应用程序需要什么样的界面,你都可以用 HTML、CSS 和 JavaScript 来表达它。
如果你想专注于构建一个优秀的产品,而无需弄清楚如何在特定的 UI 框架中实现设计师的愿景,那么 Web 是一个安全的选择。
可靠性
Web 技术是地球上用户界面最常用的基础。它们已经得到了相应的加固。现代计算机从 CPU 到操作系统都经过优化,以擅长运行 Web 技术。 你的用户的设备制造商——无论是 Android 手机还是最新的 MacBook——都会确保他们可以访问网站、在 YouTube 上播放视频或显示电子邮件。反过来,他们也会确保你的应用程序拥有稳定的基础,即使你只有一个用户。
如果你想专注于构建一个优秀的产品,而无需调试没有人发现过的奇怪问题,那么 Web 是一个安全的选择。
互操作性
无论你需要与哪个提供商或客户数据交互,他们很可能已经考虑过与 Web 的集成路径。根据你的技术选择,嵌入 YouTube 视频可能需要 30 秒,或者需要你雇佣一个专门从事流媒体和硬件加速视频解码的团队。对于 YouTube 而言,使用任何其他播放器实际上违反了他们的条款和条件,因此你很可能在嵌入浏览器框架之前实现自己的视频流解码器。
如果你使用 Web 技术构建应用程序,几乎没有平台无法运行它。 几乎所有带有显示器的设备——无论是 ATM、汽车信息娱乐系统、智能电视、冰箱还是 Nintendo Switch——都带有显示 Web 技术的方式。如果你想实现跨平台,Web 是一个安全的选择。
普及性
很容易找到具有 Web 技术构建经验的开发者。如果你是一名开发者,很容易在 Google、Stack Overflow、GitHub 或你选择的编码 AI 上找到问题的答案。无论你需要解决什么问题,很可能有人已经很好地解决了它——并且你可以在网上找到答案。
如果你想专注于构建一个优秀的产品,并能充分利用资源和材料,那么 Web 是一个安全的选择。
为什么选择 Electron
Electron 将 Chromium、Node.js 和编写自定义原生代码的能力结合到一个框架中,用于构建强大的桌面应用程序。选择 Electron 的主要原因有三个
企业级
Electron 可靠、安全、稳定且成熟。它是构建旗舰产品的公司的首选。我们在主页上列出了一些公司,但仅在聊天应用程序中,Slack、Discord 和 Signal 都是用 Electron 构建的。在 AI 应用程序中,OpenAI 的 ChatGPT 和 Anthropic 的 Claude 都使用 Electron。Visual Studio Code、Loom、Canva、Notion、Docker 和无数其他领先的软件开发者都押注 Electron。
我们优先考虑使 Electron 易于使用,并为开发者带来愉悦的体验。这可能是 Electron 变得如此受欢迎的主要原因——但保持 Electron 活跃和繁荣的是维护者专注于使 Electron 尽可能稳定、安全、高性能且能够用于最终用户的关键任务用例。我们正在构建一个准备好在无法修复的错误、未修补的安全漏洞和任何类型的停机是最坏情况的场景中使用的 Electron。
成熟度
我们目前的估计是,地球上大多数桌面计算机都运行至少一个 Electron 应用程序。Electron 通过优先考虑维护者群体中的人才、在管理持续维护中培养卓越和可持续的工程实践,并主动邀请对 Electron 下注的公司直接为该项目做出贡献来发展壮大。我们是 OpenJS 基金会的一个影响力项目,而 OpenJS 基金会本身是 Linux 基金会的一部分。我们与其他基金会项目(如 Node.js、ESLint、Webpack 或 Linux 内核或 Kubernetes)共享资源和专业知识。
这对你,一个开发者来说,意味着什么?
- 可靠的发布计划:Electron 将与每个第二个主要 Chromium 版本同步发布新的主要版本,通常与 Chromium 的发布日期相同。大量的工程工作和工具,以及每周投入的原始时间,都必须投入到实现这一点上。
- 没有独裁者:有时,押注一项技术也需要你押注一个人或一家公司。反过来,它需要你信任这个人或公司永远不会崩溃、直接与你对抗,或者做任何其他会迫使你重新考虑整个技术栈的事情。Electron 由一组多元化的公司(Microsoft、Slack/Salesforce、Notion 等)维护,并将继续欢迎更多有兴趣确保他们在决策中拥有“席位”的公司。
稳定性、安全性、性能
Electron 通过将最新版本的 Chromium、V8 和 Node.js 直接与应用程序二进制文件捆绑在一起,在所有目标平台(macOS、Windows、Linux)上提供最佳体验。在以最高的稳定性和安全性运行和渲染 Web 内容方面,我们目前认为该堆栈是“最佳的”。
为什么捆绑任何东西
你可能想知道为什么我们要将 Chromium 的 Web 堆栈与我们的应用程序捆绑在一起,而大多数现代操作系统已经提供了一个浏览器和某种形式的 Web 视图。捆绑不仅大大增加了 Electron 维护者的工作量,也增加了 Electron 应用程序的总磁盘大小(大多数应用程序大于 100MB)。许多 Electron 维护者曾经开发过使用嵌入式 Web 视图的应用程序——并且已经接受了增加的磁盘大小和维护者工作量作为值得的权衡。
在使用操作系统的内置 Web 视图时,你将受到操作系统中包含的浏览器版本的限制。我们发现使用这种方法存在以下问题
- 稳定性:现代 Web 技术堆栈很复杂,因此你迟早会遇到错误。如果你使用操作系统的 Web 视图,你唯一的补救措施就是要求你的客户升级他们的操作系统。如果该机器无法升级到最新的 macOS 或 Windows 11,你将不得不要求他们购买一台新电脑。如果你不走运,你现在可能会失去一个主要客户,因为他们不会为了你的初创公司的应用程序而升级成千上万台机器。在这种情况下,你没有任何补救措施。即使发生这种情况的风险对 Electron 维护者所雇佣的公司来说也是不可接受的。
- 安全性: 就像你可以通过发布应用程序更新来修复稳定性错误一样,你也可以在不要求客户升级操作系统的情况下发布安全修复程序。即使操作系统提供商优先考虑对其内置浏览器的更新,我们也没有看到他们以类似的紧迫性可靠地更新内置的 Web 视图。捆绑 Web 渲染器让你,开发者,拥有控制权。
- 性能: 对于简单的 HTML 文档,内置的 WebView 有时会比带有捆绑框架的应用程序使用更少的资源。对于更大的应用程序,我们的经验是,我们可以使用最新版本的 Chromium 提供比内置 WebView 更好的性能。你可能会认为内置的视图可以与其它应用程序和操作系统共享很多资源——但出于安全原因,应用程序必须在自己的沙箱中运行,彼此隔离。 到了这一点,问题就变成了操作系统的 WebView 是否比 Chromium 性能更高。 在许多应用程序中,我们的经验是,捆绑 Chromium 和 Node.js 使我们能够构建更好、更具性能的体验。
为什么捆绑 Chromium 和 Node.js
Electron 旨在使它支持的应用程序能够提供最佳的用户体验,其次是最佳的开发体验。 Chromium 是目前可用的最佳跨平台渲染堆栈。 Node.js 使用 Chromium 的 JavaScript 引擎 V8,使我们能够结合两者的优势。
- 需要时使用原生代码: 感谢 Node.js 成熟的原生插件系统,你始终可以编写原生代码。 没有超出你范围的系统 API。 只要你可以用 C、C++、Objective-C、Rust 或其它原生语言实现,你就可以在 Electron 中集成任何 macOS、Windows 或 Linux 功能——这为你,开发者,提供了最大的控制权。 使用 Electron,你可以在不只选择 Web 技术的情况下使用 Web 技术。
开发者体验
总而言之,我们的目标是构建一个成熟、企业级且适用于关键任务应用程序的 Electron。 我们优先考虑可靠性、稳定性、安全性以及性能。 也就是说,你也可以因为它的开发者体验而选择 Electron
- 强大的生态系统: npm 上找到的任何内容都可以在 Electron 中运行。 关于如何使用 Node.js 的任何资源也适用于 Electron。 此外,Electron 本身拥有一个 蓬勃发展的生态系统——包括大量的安装程序、更新程序、更深层次的操作系统集成等等。
- 大量内置功能: 在过去的十年中,Electron 的核心获得了许多你可能需要构建应用程序的原生功能。 Electron 使用 C++ 和 Objective-C 编写,拥有 数十个易于使用的 API,用于更深入的操作系统集成——例如,用于透明或形状奇特的窗口的高级自定义、从 Apple Push Notification Network 接收推送通知,或为你的应用程序处理自定义 URL 协议。
- 开源: 整个堆栈都是开源的,并且可以供你检查。 这确保了你未来添加任何功能或修复任何错误的能力。
- 需要时使用原生代码: 重申一下,Electron 允许你混合和匹配 Web 技术以及 C++、C、Objective-C、Rust 和其它原生语言。 无论是 SQLite、整个 LLM,还是仅仅调用一个特定的原生 API,Electron 都会使其变得容易。
为什么选择其它方案
如上所述,Web 是构建界面的绝佳平台。 这并不意味着我们,维护者,会用 HTML 和 CSS 构建一切。 以下是一些值得注意的例外情况
资源受限的环境和物联网: 在内存或处理能力非常有限的情况下(例如,低功耗 ARM Cortex-M 上的 1 兆字节内存和 100MHz 处理能力),你可能需要使用低级语言直接与显示器通信以输出基本的文本和图像。 即使在略微更高功率的单片设备上,你可能也需要考虑使用嵌入式 UI 框架。 智能手表就是一个经典例子。
小型磁盘占用空间: 压缩后的 Electron 应用程序通常约为 80 到 100 兆字节。 如果较小的磁盘占用空间是硬性要求,你必须使用其它方案。
操作系统 UI 框架和库: 通过允许你编写原生代码,Electron 可以执行任何原生应用程序可以执行的操作,包括使用操作系统的 UI 组件,例如 WinUI、SwiftUI 或 AppKit。 在实践中,大多数 Electron 应用程序很少使用这种能力。 如果你希望你的应用程序的大部分内容都使用操作系统提供的界面组件构建,那么你可能最好为每个你想要定位的操作系统构建完全原生的应用程序。 这并不是说在 Electron 中不可能实现,只是它可能是一个更简单的开发过程。
游戏和实时图形: 如果你正在构建高性能游戏或需要复杂实时 3D 图形的应用,那么 Unity、Unreal Engine 或 DirectX/OpenGL 等原生框架将提供更好的性能和对图形硬件的更直接访问。 Web 爱好者可能会指出一些注意事项,例如 Unreal Engine 也附带 Chromium——或者 WebGPU 和 WebGL 正在快速发展,许多游戏引擎(包括这里列出的引擎)现在可以以在浏览器中运行的格式输出游戏。 也就是说,如果你让我们构建下一款 AAA 游戏,我们可能不会只使用 Web 技术。
嵌入轻量级网站: Electron 应用程序通常主要是 Web 应用程序,并在有用的地方添加了原生代码。 资源密集型的 Electron 应用程序倾向于用 HTML/CSS 编写 UI,并在 Rust、C++ 或其它原生语言中构建后端。 如果你计划构建一个主要原生应用程序,它还想在特定视图中显示一个小网站,那么你可能最好使用操作系统提供的 WebView 或类似 ultralight 的工具。