Tauri 对比 Electron 有哪些优点?如何使用?

如果您是一位前端开发人员,应该了解 Electron,它使用 JavaScript 开发跨平台桌面应用程序。但您听说过Tauri吗?

Tauri 是什么?

Tauri 官方给出的定义为:

Tauri 是一个为所有主流桌面平台构建小型、快速二进制文件的框架。开发人员可以集成任何编译成 HTML、 JS 和 CSS 的前端框架来构建他们的用户界面。应用程序的后端是一个 Rust 二进制文件,具有前端可以与之交互的 API。

结合官方的主要文献我们很容易概括出 Tauri 的特点:

  • 通过 Tauri 构建的桌面应用程序体积极小 (通常只有 Electron 的十分之一,甚至更小)
  • 优秀的性能
  • 二进制文件
  • 跨平台
  • 用户界面可使用广泛的 Web 前端技术栈
  • 程序后端使用 Rust

看起来很不错!那么 Tauri 对比 Electron 会有哪些优势呢?能够取代 Electron 么?

Tauri vs. Electron

从上面 Tauri 与 Electron 的对比图中你可以看到,Tauri 相比 Electron 存在一些明显的优势,例如打包体积和启动时间。另外,它还具有 Electron 不支持的一些功能。

或许你不信,但以上对比列表最吸引我的居然是 Rust。近年来,Rust 经常出现在前端开发圈子里,SWC、Deno等都在使用它。它是一种静态类型安全的语言,没有运行时以及垃圾回收机制,面向高性能、可靠性的生产场景。编译器足够严格,可以保证内存安全和线程安全。

在 Tauri 中,Rust 被用作后端绑定和底层引擎。我将在下面与 Electron 的比较中详细描述它是如何工作的。

接下来,我将从几个角度对 Tauri 和 Electron 进行比较:开发、构建、自动更新和架构。

开发

要创建 Tauri 应用程序,您必须首先在本地计算机上安装好 Rust 和Node.js 开发环境。您可以访问他们的官方网站,并按照步骤安装它们。

这里我们就以 MacOS 为例安装 Rust 及 Node.js 开发环境。

首先,如果你的 Mac 电脑尚未安装 homebrew 请在终端执行以下命令进行安装:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

成功安装 homebrew 后,接下来需要安装 GCC 编译器。请在 Mac 终端中执行以下命令:

brew install gcc

请确保已安装 xcode:

xcode-select --install

然后,我们开始安装 Nodejs 运行环境 以及 包管理工具 yarn:

brew install yarn && brew install nodejs

安装 Rust 编译器 rustc:

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

接下来,让我们重点谈谈如何创建 Rust 项目。

请在终端执行以下命令:

yarn create tauri-app

或者

npx create-tauri-app

Tauri 内置了许多模板,我们可以自由的选择它们:

我在这里选择了 Vite + react-ts,这是生成的目录:

如果您选择其他模板,则整体项目结构大致相同。主要变化是前端项目结构。

让我们看看默认生成的package.json

太棒了!Tauri 已经为我们准备好了一切。我们现在就可以使用命令 yarn tauri dev 来进行开发,并使用 yarn tauri build 命令来打包最终产品。

Web前端命令可以在 src-tauri/tauri.conf.json 中自定义:

tauri.conf.json

Tauri 也可以选择集成到现有的前端项目中。相比之下,Electron 官方不提供模板创建功能。因此,您只能根据文档逐步进行手动配置。

经过对比,就开发经验而言,Tauri开箱即用,并为我们提供了清晰的项目配置,这绝对可以节省很多时间。

编译与构建

Rust 在现阶段因其编译时间而受到批评,这将直接导致 Tauri 打包时间过长。但好消息是,下个版本将使用缓存来减少编译时间。此外,最终产品将以二进制形式发布,为软件破解增加了一层安全性。

默认情况下,Electron 不会打包主进程代码,它甚至将巨大的 node_modules 也一并打包到最终可执行程序中。这进一步增加了最终发布的产品的体积。同时,这也导致源代码缺失加密机制。

即便在 Electron 中使用 asar 包装源代码,也很容易被破解。当然,如果我们可以使用构建工具来打包和混淆源代码,这显然既耗时又费力。

值得注意的是,Electron 可以跨平台进行编译和构建。比如您可以在Mac平台上为Windows平台构建应用程序。遗憾的是,Tauri 目前只能在相应平台进行。这对于自动打包和分发的系统来说,确实麻烦。

自动更新

Electron 需要通过安装第三方库(electron-builderelectron-packager)来支持三大主流操作系统上的自动更新。而 Tauri 原生支持。

架构

从架构角度来说,Tauri 不需要再塞入 Chromium。它使用了自主开发的 WRY 来连接三大主流平台的 Web 引擎,并提供统一的接口来渲染 WebView。

Tauri 针对每个平台的 Web 底层引擎:

  • Windows 平台上使用 Microsoft Edge Chromium 的 WebView2
  • Mac 上使用 WebKit
  • Linux 平台上则使用 WebKitGTK

这意味着 Tauri 与 Chromium 无关。也就是说,如果您在 Mac 平台上打开开发工具,您可以看到它的用户界面与 Safari 浏览器一致。而在 Windows 平台上打开 DevTools,您会发现其用户界面与 Microsoft Edge 一致。

也就是说 Tauri 只做了对应接口进行衔接,所以它的体积很小。

除此之外,Tauri 团队还开发了 TAO,这是一个用于跨平台应用程序窗口创建的库,并应用到 WRY 中来支持事件处理和创建窗口。

Electron 通过塞入 Chromium 的方式来对前端进行渲染,并启动一个独立的线程通过对 Node.js 中的 backend_fd 进行轮训来对事件进行处理。当有新事件出现时,对应事件会被转发到 Chromium 的事件处理(MessageLoop)。过程如下图:

通过上述方式,Electron 将 Node.js 的事件循环集成到 Chromium 的事件循环中,以确保应用程序的性能。

比较两者,不难看出:

  • Electron 更像是一种融合技术,它将 Nodejs 集成到了 Chromium 中。

  • Tauri 则更像是胶水,将 WebView 的渲染移交给每个平台的内置 Web 引擎,通过 WRY 和 TAO 对 GUI 顶层进行控制。

总结

通过以上对比,总体而言 Tauri 表现更好,它解决了 Electron 的许多现有问题,并带来了简单方便的开发体验。相信 Tauri 将迎来一个不错的发展前景。不足之处主要在于 Rust 的学习成本。

得益于 Nodejs 社区,Electron 当下已被广泛接受,拥有相对完善的生态环境。并且其前端及后端均使用 JavaScript,因此学习成本更低。

您更倾向于学习并使用 Tauri 还是 Electron ?