在跨平台应用程序开发领域,如果开发人员有一点共识,那就是使用 HTML、CSS 和 JavaScript 创建图形用户界面(GUI)比借助众多跨平台框架中的任何一个都更容易。像 Electron 这样的框架为开发者提供了一种两全其美的选择。你可以使用 JavaScript 或其他语言编写应用程序,并在网络浏览器中以 HTML 作为应用程序的 GUI。
不过,Electron 虽广为人知,但并非同类框架中的唯一选择。现在,让我们来认识一下 Tauri,一个与 Electron 类似的框架。这是一个较新的项目,相应地没那么成熟,但在底层架构上存在重大差异。在某些关键方面,Tauri 项目比 Electron 开发的项目更紧凑、更具前瞻性、更强大且更灵活。
下面,我们来对比一下这两个框架,看看它们究竟如何。
Electron 的工作原理
你很有可能正在通过 Electron 的核心技术 —— 网络浏览器阅读这篇文章。
Electron 最初由 GitHub 开发,它依赖于几个关键的网络浏览器项目:Chromium(Google Chrome 和 Microsoft Edge 的基础)以及 Node.js(和 Google V8)JavaScript 运行时。Electron 项目将相当于一个由 Chromium 驱动的便携式网络浏览器实例与应用程序代码重新打包在一起。当应用程序启动时,它会启动浏览器,进而加载与之捆绑的基于 JavaScript 的应用程序。
在网络浏览器中能实现的一切,在 Electron 应用程序中也都有可能实现。实际上,Electron 应用程序甚至可以做得更多,因为打包的浏览器部分有权以传统基于浏览器的应用程序(如渐进式网络应用程序)无法做到的方式与本地系统进行交互。
大量流行的应用程序都在使用 Electron。例如 Visual Studio Code,它是一款文本编辑器和可配置的集成开发环境(IDE)。还有 Discord 消息应用程序、Obsidian 笔记程序、Docker Desktop、GitHub Desktop、Slack 和 Basecamp 3 等,也都是 Electron 应用程序。
然而,一些 Electron 应用程序也颇受争议。比如 Microsoft Teams,它作为一个 Electron 应用程序曾被广泛诟病,尽管在最近的版本中有了大幅改进。
对基于 Electron 的应用程序的一个常见(且完全合理)的批评是它们的资源占用。Electron 应用程序配备了自己独特的、供应商提供的网络浏览器副本,并且在启动时必须启动一个完全独立的网络浏览器进程。Electron 应用程序在磁盘上可能占用数百兆字节甚至更多,其内存占用通常也非常大。虽然现代硬件通常能够处理这种负载,但一个更大的问题随之而来:难道就没有更好的方法吗?
以 Visual Studio Code 为例,这是一个流行的 Electron 应用程序。所有视觉元素和交互性都由一个独立的浏览器组件提供,该组件还负责处理与整个系统的交互。
Tauri 的工作方式
用 Rust 编写的 Tauri 项目背后的基本理念与 Electron 相似。你编写一个应用程序,其用户界面是网页,然后将该应用程序捆绑起来,使其通过一个自包含的网页浏览器运行。
Tauri 最大的不同在于它没有捆绑整个浏览器。相反,Tauri 为应用程序运行的任何操作系统使用本机系统的 webview 组件。这样,应用程序可以以小到几兆字节的捆绑包交付。Tauri 捆绑包使用 WRY 与本机 Web 视图进行交互,使用 andtao 进行窗口管理,并与系统托盘和其他资源进行接口。
你还可以使用大多数 HTML/CSS/JS 框架,Tauri 原生支持一大批流行的框架,如 Vue.js、Svelte、React、SolidJS、Angular、Preact、Yew、Leptos 和 Sycamore。你可以将现有的网络项目迁移到 Tauri 的后端。
不过,Tauri 有一个可能的缺点,那就是你至少需要一些 Rust 的经验。应用程序的后端或 “服务器端” 部分是用 Rust 编写的,整个软件包作为独立的 Rust 可执行文件进行编译和交付。
你可以将整个应用程序用客户端 JavaScript 编写,但这会严重限制其功能。除了 Rust 之外,还可以使用其他运行时或语言作为后端,例如 Python,但强烈推荐使用 Rust。
如果你对 Rust 还不太熟悉,Tauri 存储库中的示例应用程序是一个很好的起点,可以帮助你更好地了解 Rust,并查看如何实现特定概念,例如启动时带有启动屏幕的应用程序。
与 Electron 不同,目前用 Tauri 构建的主流桌面应用程序还比较少。这其中的一些原因可能是 Electron 的遗留影响,或者是 Rust 与 JavaScript 相比相对复杂。但也有相当多的应用程序,包括商业和开源的,都是用 Tauri 编写的。例如 PostgreSQL 的 pgMagic GUI 客户端、Payload 文件传输工具和 Noor 团队聊天应用程序。
以 Payload 为例,这是一个用 Tauri 编写的文件传输应用程序。在 Microsoft Windows 上,它的运行时内存占用仅为 4MB,但该应用程序可以访问与 Electron 应用程序相同的所有系统级功能。
哪个更好:Tauri 还是 Electron?
目前,Electron 仍然是跨平台用户界面框架中最突出和最被理解的。尽管存在各种批评,但它仍然是提供具有良好系统集成和丰富 GUI 的跨平台应用程序的流行默认选择。然而,关于 Electron 的内存消耗及其二进制文件大小的抱怨是合理的,而且这些问题不会很快消失。它们与 Electron 应用程序的设计密切相关,只有重新设计 Electron 或底层浏览器组件才能解决这个问题。
Tauri 应用程序的设计从一开始就不同,旨在占用更少的磁盘空间和更少的内存。但这是以它是一种严重依赖 Rust 的新技术为代价的 ——Rust 是一种相对较新的语言,其开发生态系统也相对较新。对 Tauri 的承诺需要分别对后端的 Rust 和前端的 JavaScript 做出承诺。
我的结论是:如果你已经掌握了 Rust 或计划对它做出承诺,并且如果可交付成果的大小及其内存占用很重要,那么 Tauri 是最好的选择。如果你已经非常了解 JavaScript,Electron 是最好的 —— 特别是如果你已经交付了其他基于 Electron 的应用程序,并希望利用这些知识 —— 并且 Electron 的内存消耗和二进制大小不是问题。