Tauri 1.0 发布,它是Electron的杀手锏吗?
作为一个前端开发者,相信你应该知道 Electron,它使用 JavaScript 开发跨平台的桌面应用程序。但你听说过 Tauri 吗?
Tauri官网:https://tauri.app/
Tauri 是一个UI框架,用于为所有主要桌面平台构建微小、极快的二进制文件。开发人员可以集成任何可编译为 HTML、JS 和 CSS 的前端框架来构建他们的用户界面。应用程序的后端是一个来自 Rust 的二进制文件,带有一个前端可以与之交互的 API。
以上介绍来自官方Github 仓库。接着我们概括一下 Tauri 的特点:
体积小
较好的用户体验
二进制文件编译
跨平台
用户界面可以使用Web开发技术栈
后端使用 Rust
看起来非常好。那么它会成为Electron的杀手锏吗?
Tauri 与 Electron 的对比
Detail | Tauri | Electron |
---|---|---|
Installer Size Linux | 3.1 MB | 52.1 MB |
Memory Consumption Linux | 180 MB | 462 MB |
Launch Time Linux | 0.39s | 0.80s |
Interface Service Provider | WRY | Chromium |
Backend Binding | Rust | Node.js (ECMAScript) |
Underlying Engine | Rust | V8 (C/C++) |
FLOSS | Yes | No |
Multithreading | Yes | Yes |
Bytecode Delivery | Yes | No |
Multiple Windows | Yes | Yes |
Auto Updater | Yes | Yes1 |
Custom App Icon | Yes | Yes |
Windows Binary | Yes | Yes |
macOS Binary | Yes | Yes |
Linux Binary | Yes | Yes |
iOS Binary | Soon | No |
Android Binary | Soon | No |
Desktop Tray | Yes | Yes |
Sidecar Binaries | Yes | No |
以上是 Tauri 和 Electron 现在的技术性能对比图。
我们可以看到Tauri 比 Electron 存在一些优势。比如打包大小、内存占用和启动时间。它还有一些 Electron 现在不支持的特性。
但是,Rust 是最引起我注意的地方。
近年来,Rust 频频出现在前端技术圈,SWC、Deno等都在用它。Rust 是一种静态类型安全的语言,没有运行时和垃圾收集机制。它特别擅长高性能、可靠性和生产力。并且编译器足够严格,以保证内存安全和线程安全。
在Taurui 中,Rust 被用作后端绑定和底层引擎。我们将在下面与 Electron 的比较中描述它是如何工作的。
接下来将从开发、构建、自动更新和架构这几个角度对两者进行比较。
开发
要创建 Tauri APP,首先要在本地计算机上准备好Rust 环境和Node.js 环境。
你可以访问他们的官方网站并按照步骤安装它们。接下来,我们专注于如何创建 Tauri 项目。
yarn create tauri-app
#OR npx
create-tauri-app
Tauri 内置了很多模板,开发者可以自由选择:
我在这里选择了 Vite + react-ts,这里是生成的目录:
可以看到项目结构非常清晰。如果选择其它的模板,整体项目结构大致相同,主要变化是前端项目目录结构。
我们来看看默认生成的package.json。代码如下:
非常好!Tauri 已经为我们做了一切。我们可以使用:yarn tauri dev 开发,使用yarn tauri build打包完整版软件产品。
Web 前端命令可以自定义,可以查看和修改 src-tauri/tauri.conf.json:
Tauri 也可以选择集成到现有的前端项目中。相比之下,Electron 官方并没有提供模板创建功能,只能按照其文档一步一步配置。
所以在开发体验方面,Tauri 做到了开箱即用,给开发者清晰的项目配置,绝对为我们节省不少时间。
构建与编译
Rust 现阶段因其编译时间而饱受诟病,这是 Tauri 打包时间过长的直接结果。但好消息是下一次编译会使用缓存来减少时间。此外,最终产品将以二进制形式存在,为破解增加了一层安全性。
默认情况下,Electron 不打包主进程代码,它甚至将巨大的代码打包node_modules到最终程序中。这进一步增加了构建产品的尺寸。这也导致源代码没有加密机制。即使将源代码包装在 asar 中,也很容易被破解。
当然,我们可以使用构建工具对源代码进行打包和混淆,这显然是费时费力的。
还值得注意的是,Electron 可以跨平台构建。例如,它可以在 Mac 平台上为 Windows 平台构建包。而Tauri目前只能搭建在相应的平台上。这对于自动打包和分发的系统来说是一个麻烦。
自动更新
为了支持三大桌面平台的自动更新,Electron 需要第三方库,例如electron-builder或electron-packager. Tauri 可以原生支持它。
架构
在架构上,Tauri 没有包含 Chromium。它使用自研的WRY连接各个平台的Web引擎,并提供统一的接口来渲染WebView。
它使用的每个平台的底层 Web 引擎为:
在 Windows 平台上使用来自 Microsoft Edge Chromium 的 WebView2;
在Mac 平台上为 WebKit;
在 Linux 平台上使用 WebKitGTK。
这意味着,它与 Chromium 无关。如果在 Mac 平台上打开 DevTools,可以看到它的内部 UI 和 Safari 是一致的。如果你在 Windows 平台上打开 DevTools,你会发现它的内部 UI 和 Microsoft Edge 是一致的。
也就是说,它只做粘合剂层,所以它生成应用的体积会很小。
除此之外,Tauri 还开发了跨平台应用程序窗口创建库TAO ,并将其重新导出到 WRY 中,用于事件循环和窗口创建。
而 Electron 封装了整个 Chromium 用于前端渲染。在事件循环中,它启动了一个单独的线程,该线程不断地在 Node.js 中轮询来自libuvbackend_fd的新事件。当发现新事件时,它们会被转发到 Chromium 的事件循环(MessageLoop)。详情请见下图。
通过上述方式,Electron 将 Node.js 的事件循环集成到 Chromium 的事件循环中,以保证应用程序的性能。
比较两者,我的感性认知是:
Electron 更像是一种融合技术,将 Node.js 集成到 Chromium 中。
Tauri 更像是胶水,将 WebView 的渲染交给各个平台内置的 Web 引擎。Tauri 是顶层,可以通过 WRY 和 TAO 控制 GUI。
结论
Tauri表现不错,前景看好。它解决了 Electron 现有的讲多问题,带来了轻巧、简单、便捷的开发体验。但是它还有一些问题需要改进,Rust的学习曲线比较大,对于初学者有一定的学习成本。
Electron 今天发展得很好。并且它依赖于蓬勃发展的 Node.js 社区,其周边生态非常好。它在前后端使用JavaScript,因此学习成本更小。
那么,各位怎么看Tauri?
作者:洛逸
推荐阅读:
跨平台:Electron 16.0 可连接到实验性 WebHID-API
Deno 新推出 Fresh 框架:从编辑器到边缘计算,无需构建