为何选择 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 和 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 基金会的一个影响项目,而该基金会本身也是 Linux 基金会的一部分。我们与 Node.js、ESLint、Webpack 等其他基金会项目——或者 Linux 内核或 Kubernetes——共享资源和专业知识。
对于你,一个开发者来说,这一切在实践中意味着什么?
- 可靠的发布计划:Electron 将与每第二个 Chromium 主要版本同步发布一个新的主版本,通常与 Chromium 在同一天发布。为了实现这一点,需要投入大量工作,既包括构建流程和工具,也包括每周投入的原始工时。
- 没有独裁者:有时候,押注于一项技术也需要你押注于某个人或公司。反过来,这需要你相信这个人或公司永远不会崩溃、开始直接与你作对,或者做出任何其他会迫使你重新思考整个技术栈的极端行为。Electron 由多家不同的公司(微软、Slack/Salesforce、Notion 等)共同维护,并将继续欢迎更多有兴趣确保其“在决策桌上有一席之地”的公司加入。
稳定性、安全性、性能
Electron 通过将最新版本的 Chromium、V8 和 Node.js 直接与应用程序二进制文件捆绑,在所有目标平台(macOS、Windows、Linux)上提供最佳体验。当涉及到以最高的稳定性、安全性和性能运行和渲染 Web 内容时,我们目前认为该技术栈是“同类最佳”的。
为什么要打包
你可能会想,既然大多数现代操作系统已经自带了浏览器和某种形式的 Web 视图,为什么我们还要将 Chromium 的 Web 技术栈与我们的应用捆绑在一起。打包不仅极大地增加了 Electron 维护者的工作量,还增加了 Electron 应用的总磁盘大小(大多数应用都大于 100MB)。许多 Electron 维护者曾经开发过使用嵌入式 Web 视图的应用程序——并从此接受了增加的磁盘大小和维护工作量,认为这是一个值得的权衡。
当使用操作系统的内置 Web 视图时,你会受到你需要支持的最旧操作系统版本所包含的浏览器版本的限制。我们发现这种方法存在以下问题:
- 稳定性:现代 Web 技术栈非常复杂,因此,你迟早会遇到 bug。如果你使用操作系统的 Web 视图,你唯一的补救措施就是要求你的客户升级他们的操作系统。如果该机器没有可用的升级(因为无法升级到最新的 macOS 或 Windows 11),你就得让他们买一台新电脑。如果运气不好,你现在可能会失去一个大客户,因为他们不会仅仅因为一个团队想试试你们创业公司的应用就升级他们数千台机器的整个机队。在这种情况下,你毫无办法。即使只是发生这种情况的风险,对于雇用 Electron 维护者的公司来说也是不可接受的。
- 安全性: 与通过发布应用更新来修复稳定性 bug 类似,你也可以向你的应用程序发布安全修复程序,而无需请求客户升级其操作系统。即使操作系统提供商优先更新其内置浏览器,我们也没有看到他们以同样的紧迫性可靠地更新内置的 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,用于更深度的操作系统集成——例如用于透明或奇形怪状小部件的高级窗口定制、从苹果推送通知网络接收推送通知,或为你的应用处理自定义 URL 协议。
- 开源:整个技术栈都是开源的,可供你检查。这确保了你在未来添加任何功能或修复任何可能遇到的 bug 的自由。
- 需要时可使用原生代码: 值得重申的是,Electron 允许你混合搭配 Web 技术和 C++、C、Objective-C、Rust 以及其他原生语言。无论是 SQLite、一个完整的 LLM,还是仅仅是调用某个特定原生 API 的能力,Electron 都能轻松实现。
为什么选择其他方案
如上所述,Web 是一个用于构建界面的绝佳平台。但这并不意味着我们,作为维护者,会用 HTML 和 CSS 来构建一切。以下是一些值得注意的例外情况:
资源受限的环境和物联网(IoT): 在内存或处理能力非常有限的场景下(比如,在低功耗 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 正在迅速发展,并且包括这里列出的许多游戏引擎现在都可以将其游戏输出为可在浏览器中运行的格式。话虽如此,如果你让我们去构建下一款 3A 级大作游戏,我们很可能不会只使用 Web 技术。
嵌入轻量级网站:Electron 应用通常是大部分为 Web 应用,并在需要的地方点缀一些原生代码。处理密集型的 Electron 应用倾向于用 HTML/CSS 编写 UI,并用 Rust、C++ 或其他原生语言构建后端。如果你计划构建一个主要为原生应用,只是想在特定视图中显示一个小网站,那么使用操作系统提供的 Web 视图或像 ultralight 这样的东西可能会更适合你。