为什么选择 Electron¶
Electron 是一个框架,它通过结合 Web 技术(HTML、JavaScript、CSS)与 Node.js 和原生代码,使开发者能够构建适用于 macOS、Windows 和 Linux 的跨平台桌面应用。它是开源的,采用 MIT 许可证,并且可免费用于商业和个人用途。在本文档中,我们将解释为什么企业和开发者会选择 Electron。
我们可以将 Electron 的优势拆分为两个问题:首先,为什么应该使用 Web 技术来构建你的应用?其次,为什么应该选择 Electron 作为实现这一目标的框架?
如果你的应用已经在使用 Web 技术,可以直接跳到下面的 Why Electron? 部分。
为什么选择 Web 技术¶
Web 技术包括 HTML、CSS、JavaScript 和 WebAssembly。它们是现代互联网的店面。这些技术已成为构建用户界面的最佳选择——无论是面向消费者的应用,还是关键业务应用。对于需要在浏览器中运行的应用,以及无法通过浏览器访问的桌面应用,这一点都成立。我们在此大胆主张:这不仅适用于需要在多个操作系统上运行的跨平台应用,而是普遍成立。
例如,NASA 实际的 Mission Control 是用 Web 技术编写的。Bloomberg Terminal 是每家金融机构都能看到的计算机系统,它使用 Web 技术编写,并运行在 Chromium 内部。它的费用为每位用户每年 25,000 美元。McDonald’s 的点餐机支撑着全球最大的食品零售商,完全基于 Chromium 构建。SpaceX 的 Dragon 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,它已准备好用于那些不可修复的 bug、未修补的安全漏洞以及任何类型的故障都是最坏情况的场景。
成熟¶
我们目前的估计是,地球上大多数桌面计算机至少运行一个 Electron 应用。Electron 通过优先在维护者团队中培养人才、在持续维护管理中培养优秀且可持续的工程实践,并主动邀请押注 Electron 的公司直接为项目做贡献而成长。我们是 OpenJS 基金会的一个影响力项目,而 OpenJS 基金会本身是 Linux 基金会的一部分。我们与其他基金会项目共享资源和专业知识,例如 Node.js、ESLint、Webpack——或 Linux Kernel 或 Kubernetes。
那这一切对你——一名开发者——在实践中意味着什么?
- 可靠的发布计划:Electron 会与每隔一个 Chromium 主版本同步发布新的主版本,通常与 Chromium 同一天发布。要实现这一点,需要投入大量工作,既包括构建流程与工具,也包括每周投入的大量实际工时。
- 没有独裁者:有时,押注某项技术也意味着你要押注某一个人或一家公司。反过来,这也要求你相信这个人或公司永远不会崩溃、不会直接与你为敌,或做出其他任何迫使你重新审视整个技术栈的极端举动。Electron 由多家不同公司共同维护(Microsoft、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,用于更深度的操作系统集成——例如为透明或形状不规则的小部件提供高级窗口定制、从 Apple Push Notification Network 接收推送通知,或为你的应用处理自定义 URL 协议。
- 开源:整个技术栈都是开源的,并开放供你审查。这确保你有自由添加任何功能或修复未来可能遇到的任何 bug。
- 需要时编写原生代码: 值得再次强调的是,Electron 允许你将 Web 技术与 C++、C、Objective-C、Rust 和其他原生语言混合搭配。无论是 SQLite、一整个 LLM,还是仅仅调用某个特定原生 API 的能力,Electron 都会让它变得简单。
为什么选择其他方案¶
如上所述,Web 是构建界面的绝佳平台。但这并不意味着我们作为维护者会用 HTML 和 CSS 构建 一切。以下是一些值得注意的例外情况:
资源受限环境和物联网: 在内存或处理能力非常有限的场景下(例如,在低功耗 ARM Cortex-M 上只有 1 MB 内存和 100MHz 处理能力),你可能需要使用低级语言直接与显示设备通信,以输出基本文本和图像。即使在性能稍高的单芯片设备上,你可能也需要考虑使用嵌入式 UI 框架。一个经典例子是智能手表。
较小的磁盘占用:压缩后的 Electron 应用通常约为 80 到 100 MB。如果更小的磁盘占用是硬性要求,你就必须使用其他方案。
操作系统 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 的方案可能更合适。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron