跳到主要内容

为何选择 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 机、车载信息娱乐系统、智能电视、冰箱还是任天堂 Switch——都具备显示 Web 技术的能力。如果你想实现跨平台,Web 是一个稳妥的选择。

普遍性

很容易找到具有 Web 技术开发经验的开发者。如果你是一名开发者,你将很容易在 Google、Stack Overflow、GitHub 或你选择的任何编码 AI 上找到问题的答案。无论你需要解决什么问题,很可能有人在此之前已经很好地解决了它——你可以在网上找到谜题的答案。

如果你想专注于构建一个拥有充足资源和材料的出色产品,那么 Web 是一个稳妥的选择。

为何选择 Electron

Electron 将 Chromium、Node.js 和编写自定义原生代码的能力结合到一个框架中,用于构建强大的桌面应用程序。使用 Electron 的主要原因有三个:

企业级

Electron 可靠、安全、稳定且成熟。它是公司构建其旗舰产品的首选。我们的主页上列出了一些这样的公司,但仅在聊天应用中,Slack、Discord 和 Skype 都是用 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 文档,内置 Web 视图有时会比捆绑框架的应用程序使用更少的资源。对于更大的应用程序,根据我们的经验,使用最新版本的 Chromium 可以提供比内置 Web 视图更好的性能。你可能认为内置视图可以与其他应用程序和操作系统共享大量资源——但出于安全原因,应用程序必须在其自己的沙箱中运行,彼此隔离。此时,问题是操作系统的 Web 视图是否比 Chromium 性能更好。在许多应用程序中,我们的经验是捆绑 Chromium 和 Node.js 使我们能够构建更好、性能更高的体验。

为何捆绑 Chromium 和 Node.js

Electron 旨在使其支持的应用程序提供最佳的用户体验,其次是最佳的开发者体验。Chromium 是目前可用的最佳跨平台渲染栈。Node.js 使用 Chromium 的 JavaScript 引擎 V8,这使我们能够结合两者的优势。

  • 需要时使用原生代码:得益于 Node.js 成熟的原生插件系统,你始终可以编写原生代码。没有系统 API 是你无法触及的。无论你想集成哪个 macOS、Windows 或 Linux 功能——只要你能用 C、C++、Objective-C、Rust 或其他原生语言做到,你就可以在 Electron 中做到。这再次为你(开发者)提供了最大的控制权。使用 Electron,你可以使用 Web 技术,而无需 选择 Web 技术。

开发者体验

总而言之,我们旨在构建一个成熟、企业级且适用于任务关键型应用程序的 Electron。我们优先考虑可靠性、稳定性、安全性和性能。尽管如此,你也可以因为 Electron 的开发者体验而选择它。

  • 强大的生态系统:你在 npm 上找到的任何东西都可以在 Electron 内部运行。任何关于如何使用 Node.js 的资源也适用于 Electron。此外,Electron 本身拥有一个蓬勃发展的生态系统——包括大量的安装程序、更新器、更深入的操作系统集成等选择。
  • 丰富的内置功能: 在过去的十年里,Electron 的核心获得了许多你可能需要构建应用程序的原生功能。Electron 用 C++ 和 Objective-C 编写,拥有数十个易于使用的 API,用于更深入的操作系统集成——例如针对透明或异形小部件的高级窗口定制、从 Apple 推送通知网络接收推送通知,或处理应用程序的自定义 URL 协议。
  • 开源:整个技术栈都是开源的,你可以自由检查。这确保你将来可以自由添加任何功能或修复你可能遇到的任何错误。
  • 需要时使用原生代码: 值得重申的是,Electron 允许你混合和搭配 Web 技术与 C++、C、Objective-C、Rust 和其他原生语言。无论是 SQLite、一个完整的 LLM,还是仅仅是调用一个特定的原生 API 的能力,Electron 都会使其变得容易。

为何选择其他方案

如上所述,Web 是一个构建界面的绝佳平台。但这并不意味着我们(维护者)会用 HTML 和 CSS 构建 一切。以下是一些值得注意的例外情况:

资源受限环境和物联网: 在内存或处理能力非常有限的场景中(例如,低功耗 ARM Cortex-M 上的一兆字节内存和 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++ 或其他原生语言构建后端。如果你计划构建一个主要的原生应用程序,但同时也希望在特定视图中显示一个小网站,那么使用操作系统提供的 Web 视图或像 ultralight 这样的工具可能会更好。