跳到主要内容

为何选择 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 和 Skype 都是用 Electron 构建的。在 AI 应用中,OpenAI 的 ChatGPT 和 Anthropic 的 Claude 都使用了 Electron。Visual Studio Code、Loom、Canva、Notion、Docker 以及无数其他领先的软件开发者都选择 Electron。

我们将使 Electron 易于使用并令开发者满意放在首位。这可能是 Electron 如此受欢迎的主要原因——但让 Electron 保持活力和蓬勃发展的是维护者们专注于使 Electron 尽可能稳定、安全、高性能,并能够满足最终用户的任务关键型用例。我们正在构建一个 Electron,它准备好应用于那些不可修复的 Bug、未打补丁的安全漏洞以及任何类型的服务中断都是最糟糕情况的场景。

成熟

我们目前的估计是,地球上大多数桌面计算机都运行着至少一个 Electron 应用程序。Electron 通过优先吸纳有才华的维护者、在持续维护中培养优秀和可持续的工程实践,并积极邀请依赖 Electron 的公司直接为项目做出贡献而不断成长。我们是 OpenJS 基金会的一个重点项目,该基金会本身是 Linux 基金会的一部分。我们与 Node.js、ESLint、Webpack 等其他基金会项目(或 Linux 内核或 Kubernetes)共享资源和专业知识。

这一切对您,一位开发者而言,在实践中意味着什么?

  • 可靠的发布计划:Electron 将随着每两个 Chromium 主要版本同步发布新的主要版本,通常与 Chromium 同一天发布。为了实现这一点,需要付出大量工作,包括构建流程和工具,以及每周投入的大量时间。
  • 没有独裁者:有时,选择一项技术也意味着您要依赖某个人或公司。反过来,这也要求您相信该个人或公司永远不会崩溃、与您直接对抗,或做任何其他可能迫使您重新考虑整个技术栈的激烈举动。Electron 由一系列不同的公司(微软、Slack/Salesforce、Notion 等)共同维护,并将继续欢迎更多有兴趣确保在“决策桌上拥有一席之地”的公司加入。

稳定性、安全性、性能

Electron 通过将最新版本的 Chromium、V8 和 Node.js 直接与应用程序二进制文件捆绑,在所有目标平台 (macOS, Windows, Linux) 上提供最佳体验。在以最高的稳定性、安全性和性能运行和渲染 Web 内容方面,我们目前认为该技术栈是“同类最佳”的。

为何要捆绑任何东西

您可能想知道,既然大多数现代操作系统已经附带了浏览器和某种形式的 Web View,为什么我们还要将 Chromium 的 Web 技术栈与我们的应用程序捆绑。捆绑不仅极大地增加了 Electron 维护者的工作量,也增加了 Electron 应用程序的总磁盘空间(大多数应用程序都大于 100MB)。许多 Electron 维护者曾开发过使用嵌入式 Web View 的应用程序——此后已接受增加的磁盘空间和维护工作作为值得的权衡。

使用操作系统内置的 Web View 时,您受限于您需要支持的最旧操作系统版本中包含的浏览器版本。我们发现这种方法存在以下问题:

  • 稳定性:现代 Web 技术栈很复杂,因此您迟早会遇到 Bug。如果您使用操作系统的 Web View,唯一的办法是要求您的客户升级他们的操作系统。如果该机器无法升级(因为无法升级到最新的 macOS 或 Windows 11),您就必须要求他们购买一台新电脑。如果您运气不好,您可能会失去一个重要客户,因为他们不会仅仅因为一个团队想尝试您初创公司的应用,就升级他们整个由数千台机器组成的设备队。在这种情况下,您束手无策。即使是发生这种情况的风险,对雇用 Electron 维护者的公司来说也是不可接受的。
  • 安全性:与您可以通过发布应用程序更新来修复稳定性 Bug 类似,您也可以发布应用程序的安全修复程序,而无需要求您的客户升级他们的操作系统。即使操作系统提供商优先更新其内置浏览器,我们并未看到他们能以类似的紧迫性可靠地更新内置 Web View。捆绑 Web 渲染器赋予您,开发者,控制权。
  • 性能:对于简单的 HTML 文档,内置 Web View 有时会比捆绑了框架的应用使用更少的资源。对于较大的应用,我们的经验是,使用最新版本的 Chromium 可以提供比内置 Web View 更好的性能。您可能认为内置 View 可以与其他应用和操作系统共享大量资源——但出于安全原因,应用必须在其自己的沙箱中运行,彼此隔离。此时,问题在于操作系统的 Web View 是否比 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 Push Notification Network 接收推送通知,或处理您的应用程序的自定义 URL 协议。
  • 开源:整个技术栈都是开源的,您可以自由查看。这确保了您将来可以自由添加任何功能或修复任何您可能遇到的 Bug。
  • 需要时使用原生代码:值得重复的是,Electron 允许您混合使用 Web 技术和 C++、C、Objective-C、Rust 及其他原生语言。无论是 SQLite、一个完整的 LLM,还是仅仅调用一个特定的原生 API,Electron 都会让事情变得简单。

为何选择其他

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

资源受限环境和物联网:在内存或处理能力非常有限的场景(例如,低功耗 ARM Cortex-M 设备上,只有一兆字节内存和 100MHz 处理能力),您可能需要使用低级语言直接与显示器交互以输出基本文本和图像。即使在处理能力稍高一些的单芯片设备上,您可能也需要考虑使用嵌入式 UI 框架。智能手表就是一个经典的例子。

较小的磁盘占用空间:压缩后的 Electron 应用程序通常在 80 到 100MB 左右。如果较小的磁盘占用空间是一个硬性要求,您将需要使用其他东西。

操作系统 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 View 或像ultralight这样的东西。