Tauri 与 Electron 对比:性能、包大小及实际权衡

原文链接:Tauri vs. Electron: performance, bundle size, and the real trade-offs,2025.04.09,by Costa Alexoglou。

在跨平台应用开发中选择 Tauri 还是 Electron?本文通过实际对比和基准测试数据,深入剖析两者的差异。

引言

最近我们公司在开发一款跨平台远程控制应用程序,既能实现低延迟的远程结对编程体验,又能为用户提供最佳体验。

开发初期,我们面临着使用 Tauri 还是 Electron 来构建应用程序的决策。选择这两个框架中的任何一个,都有望避免为每个平台(Windows、macOS、Linux)编写原生代码,当然也要求我们需要慎重考虑这个选择。

Tauri 和 Electron 都是强大的框架,但它们存在着根本差异。我们必须仔细权衡这些差异,来确定哪个框架能为Hopp的长期发展提供最佳支持。

如果你目前也在为自己的项目权衡选择 Tauri 还是 Electron,希望这篇文章能给你带来一些帮助。

本文涵盖内容

  • Tauri 和 Electron 底层的核心差异。
  • 每个框架的优势和局限性。
  • 关于应用程序大小、启动时间和内存使用情况的基准测试。
  • 我们选择 Tauri 的原因。

Tauri 与 Electron 的主要差异

开发者在初次研究 Tauri 时,经常会看到一些文章将其描述为"更轻量的 Electron",或者强调需要"学习 Rust 语言"。虽然这些说法有一定道理,但并没有全面地展现两者的差异。这两个领先的跨平台框架在架构上存在差异,这些差异会对开发过程和性能产生影响。

让我们深入了解一下 Tauri 和 Electron 在幕后是如何运作的。

Electron 的运行模式

Electron 的主进程作为一个 NodeJS 进程运行的。这种架构要求在应用程序中附带一个 Node.js 运行时,来确保它能在任何用户的机器上正确运行。

因此,应用程序的事件处理依赖于 Node.js 的事件循环。对于高性能任务或更深入的操作系统级交互,通常必须生成一个单独的进程,并通过进程间通信(IPC)或其他协议(如 Unix 套接字)来建立通信。

Electron 的渲染进程

Electron 的渲染进程可以看作是由主进程生成的单个浏览器标签页。实际上,在 Electron 应用程序中打开的每个窗口都会创建一个新的渲染进程。

这表示当打开多个窗口的应用程序时会同时运行多个渲染进程。开发者必须考虑这些进程累积的内存和 CPU 使用情况,这就好比在后台运行多个小型 Chromium 实例。

Electron 团队给出了一个很形象的比喻:

Tauri 的运行模式

Tauri 的后端使用 Rust 语言。其一个关键优势在于,Rust 可以编译成本地二进制文件**,无需在应用程序中捆绑运行时(如 Node.js)**,这就让应用程序更加轻量,不过后面也会讨论到这其中存在的权衡。

Tauri 没有捆绑整个 Chromium 引擎,而是使用操作系统的原生 WebView 组件来渲染用户界面。这个组件通常比完整的浏览器引擎要轻量。目前,Tauri 在不同操作系统上的使用情况如下:

  • 在 Windows 上使用 WebView2(基于微软 Edge/Chromium)
  • 在 macOS 上使用 WKWebView(基于 Safari/WebKit)
  • 在 Linux 上使用 WebKitGTK

通过依赖系统的 WebView,Tauri 生成的应用程序包更小,但这也有一定代价。

使用 Tauri 的开发者可能会面临跨平台用户界面一致性的挑战。可能会出现特定浏览器的怪异问题,比如在 Safari 中出现但 Chrome 中没有的问题,或者 Firefox 在不同操作系统上表现不同。由于 Tauri 在每个操作系统上使用不同的底层 Web 引擎,这些平台差异在应用程序开发过程中成为开发者必须处理的因素。

功能对比

以下是一个对比表格,突出了 Tauri 和 Electron 的关键方面,其中略微侧重了对我们来说比较重要的因素。在表格之后,我将详细介绍关于应用程序大小、启动时间和内存使用情况的简单基准测试。

功能 **Tauri **🦀 **Electron **⚛️
启动时间 🏎️ 快速 🏎️ 快速
内存使用(基准测试) 172MB 409MB
浏览器技术 WebView Chromium
后端语言 Rust JavaScript
构建时间(首次) 🐢 缓慢 🏎️ 快速
包大小(基准测试) 8.6MiB 244MiB

应用基准测试

为了说明实际差异,本次基准测试对比了分别使用这两个框架构建的两个应用程序。它们的功能如下:

  • 显示一个主窗口,窗口中有一个按钮,用于打开新窗口。
  • 同时打开 6 个窗口,观察资源使用情况。

创建这两个应用程序的命令如下:

bash 复制代码
# 创建 Electron 应用
npx create-electron-app@latest electron-demo-app --template=vite-typescript
# 创建 Tauri 应用(选择 TypeScript、Vite 和 React)
yarn create tauri-app

最终生成的应用程序界面如下:

🚧声明:这是在我的 MacBook Pro 上进行的一次基本基准测试(N=1)。请谨慎对待以下数据。

构建时间

Tauri 的首次构建时间明显更长,这主要是因为 Rust 编译步骤。不过后续构建通常会快很多。

bash 复制代码
# Electron
❯ time yarn make
...[LOGS]...
yarn make  13.23s user 1.55s system 93% cpu 15.818 total
bash 复制代码
# Tauri
❯ time yarn tauri build
...[LOGS]....
yarn tauri build  380.11s user 28.37s system 504% cpu 1:20.94 total

包大小

正如架构差异所预期的那样,Tauri 生成的应用程序包更小。这是因为:

  • Tauri 不捆绑 JavaScript 运行时(Node.js)。
  • Tauri 使用系统的 WebView,而不是捆绑 Chromium。

两者差异十分明显,Tauri 的包大小为 8.6MiB,而 Electron 的包大小为 244MiB

bash 复制代码
❯ du -h -d 1.
8.6M    ./tauri-demo-app.app
244M    ./electron-demo-app.app

内存使用

这方面凸显了 Tauri"更轻量"的特点。差异主要源于两个方面:

  • Electron 的主进程:Node.js 运行时本身会消耗内存。
  • 渲染进程:在 macOS 上,Electron 基于 Chromium 的渲染进程在相同窗口数量下,消耗的内存大约是 Tauri 的 WKWebView 进程的两倍。

在两个应用程序中都打开6个窗口后,测量得到的大致内存使用情况如下:

  • Tauri:约 172 MB
  • Electron:约 409 MB

启动时间

启动时间是另一个常见的考量因素。在这个简单的基准测试中,两者的差异可以忽略不计。说实话,对于大多数应用程序而言,仅仅基于不到 1500 毫秒的启动时间差异来决定选择哪个框架,可能有些多虑了。

如需了解各框架更详细的基准数据,请查看这里的 Web 到桌面框架比较资料库

我们选择 Tauri 的原因

上述对比展示了 Tauri 和 Electron 之间的权衡。我们选择 Tauri 主要基于以下几个关键原因:

后端性能

我们公司的应用依赖定制版的 WebRTC 来实现超低延迟的屏幕共享功能。应用程序需要从后端进程直接传输视频流,而不是使用浏览器的标准屏幕共享应用程序编程接口(screen-sharing Application Programming Interfaces)。

Rust 的性能非常适合这项高强度的任务。如果在 Electron 中实现,就需要为视频流管理一个单独的进程,这会使架构变得复杂。

边车支持

虽然 Tauri 的主进程使用 Rust,但我们需要一个单独的进程(即"Sidecar support")来处理屏幕流和远程控制输入(点击、打字)。这样可以将这个组件与应用程序的其他部分分开进行开发和测试。

Tauri 内置的边车概念简化了对这个外部二进制文件生命周期的管理。而在 Electron 中实现同样的功能,则需要手动生成、监控并与外部进程进行通信,这会增加复杂性。

需要注意的是,Tauri 的边车在概念上与 Kubernetes 模式有所不同,但目的都是管理一个伴随进程。

我们还利用边车进程来绘制控制器的光标。未来,我们可能会切换使用 Tauri egui

功能可用性

尽管 Tauri 比 Electron 出现得晚,但它发展迅速。特别是 Tauri v2,缩小了功能差距,将内置更新器等重要功能作为核心特性。这个项目的发展势头以及对性能和安全性的关注与我们的需求相契合。

结论

希望这篇对比文章能为你带来启发,尤其是当你正在为下一个项目在 Tauri 和 Electron 之间做选择的时候。

并没有绝对"正确"的答案。最佳选择取决于你的具体用例、团队专业知识和项目需求。这两个框架都能构建强大的桌面应用程序,它们各自都有独特的优势和局限性。

相关推荐
kite01212 小时前
浏览器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何变成页面的
javascript·css·html
крон2 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
coding随想4 小时前
JavaScript ES6 解构:优雅提取数据的艺术
前端·javascript·es6
年老体衰按不动键盘4 小时前
快速部署和启动Vue3项目
java·javascript·vue
灵感__idea4 小时前
JavaScript高级程序设计(第5版):无处不在的集合
前端·javascript·程序员
星辰引路-Lefan5 小时前
深入理解React Hooks的原理与实践
前端·javascript·react.js
江城开朗的豌豆5 小时前
JavaScript篇:函数间的悄悄话:callee和caller的那些事儿
javascript·面试
江城开朗的豌豆5 小时前
JavaScript篇:回调地狱退散!6年老前端教你写出优雅异步代码
前端·javascript·面试
TE-茶叶蛋6 小时前
Vue Fragment vs React Fragment
javascript·vue.js·react.js
Carlos_sam7 小时前
Opnelayers:封装Popup
前端·javascript