浅聊Tauri与Electron
技术细节
1. 技术栈对比
框架能力
都可以概括为WebView + Native扩展 + 窗口管理。
技术栈及依赖
Electorn依赖 Chromium + Node.js,分别用于页面渲染和运行App逻辑(JS代码)。
- 页面可以使用完整Chrome能力。
- App逻辑则可以使用完整的Node.js运行时及其扩展
- 核心App逻辑使用JS
- Node.js扩展使用C++/C/OC/Rust等native语言开发
Tauri
- Tauri渲染逻辑由tauri-apps/WRY库实现依赖系统Webview,用于页面渲染。具体的,在最新的Tauri 2.0版本上在不同平台下的具体WebView实现分别是:
- Windows:Webview2(由微软开发源于Edge浏览器,基于Chromium内核)
- macOS/iOS:WKWebkit(系统的Safari浏览器内核)
- Linux:webkitgtk (GNOME组织移植的WebKit内核)
- Android:系统 Webview API
- App逻辑层面:
- tauri使用Rust作为开发语言
- 独立App默认使用rust
- 当然基于rust生态能力,可以创建 C++ API binding并由C++作为主要开发语言。
- plugin当前仅基于支持rust API开发
- 同上,可以创建C++ binding以支持C++开发
- 理论上甚至可以实现n-api以兼容node addon
进程模型
两个框架都采用多进程模型(见上图),都是收到了Chrome浏览器的影响。核心原因是WebView本身是一个极其复杂的组件,为了避免互相影响进行逻辑隔离。此外WebView也因为其复杂度的原因也容易由安全漏洞,多进程模型下,渲染进程(Webview)具备最小权限,所有Native API调用均需要IPC到主进程执行。
前端页面
本质上都是H5,且内核基于主流3大浏览器中的两个(Chrome和WebKit),对前端能力支持很到位,可以选择任意的前端框架开发。
Electron下只会用到Chrome内核,Tauri下根据平台不同会用到Chrome和WebKit内核。因此Tauri需要额外考虑浏览器兼容性。
2. 性能对比
因为笔者暂未有项目使用过两个框架,因此对比主要来自:理论层面,hello world Demo,及其他参考资料。
安装包体积
Tauri因为不需要打包Chrome,理论上来说安装包体积会非常小,只需包含实际的业务逻辑;而Electorn则需要需要在此基础上再加一个Chrome。
从参考资料的对比:Electorn 85M,Tauri 2.5M(这里是安装包的对比,实际安装体积会更大)
另外从一个对比方式,从实际的Electron应用解包来看,总大小-Electrom.framework=业务逻辑体积 ≈ Tauri体积
| 总大小 | Electron框架 | 业务逻辑(预估Tauri) | Electron占比 | |
|---|---|---|---|---|
| Notion | 249M | 240M | 9M | 96% |
| Slack | 482M | 430M | 52M | 89% |
| VSCode | 364M | 224M | 140M | 62% |
| Kim | 412M | 172M | 240M | 42% |
可见主流App,不管业务复杂度多少,Electron框架的占比都很高。业务逻辑越简单,占比越高。
运行时性能(内存、流畅度)
理论上来说,不管哪个框架其主要的业务逻辑都在WebView中承载。因此这里运行时性能的主要差别在于不同的浏览器内核。
相比之下,Tauri由于使用系统WebView,因此会和系统有一定数量的资源共享,如可执行文件(exe/dll)内存共享等。这会带来一定层面(量级可能不大)的内存消耗,启动速度方面的优化。
因此从原理角度来看,Tauri可能有些微优势,但两者差异不大。
参考资料中的数据来源于Windows平台,那么Electron使用Chromium内核,Tauri使用Webview2(即系统Edge浏览器的内核)。测试结果是:
- 启动速度:Electorn 4S,Tauri 2S
- 内存占用:Electron 120M,Tauri 80M
该结果于笔者的分析相违背,同时Microsoft Team团队从Electron迁移到Webview2时获得了巨大的内存优化。因此内存占用需要进一步的细致分析对比。
3. 开发生态及成熟度
毫无疑问诞生于13年的Electron历史更悠久,且我们看到大量基于Electorn的成熟商业应用和开源生态,更是有VSCode这样的案例。Electorn由Github创建,跟随者微软的收购,目前也由微软维护。
而Tauri于22年发布1.0版本,24年10月刚发布2.0版本,仍然处于快速发展阶段。Tauri官方的Roadmap有支持其他语言的binding计划,但是目前看也暂未开展。在笔者的视野内暂未看到成熟商业应用的案例,尽管如此Tauri能力已经比较完善,在面对以前端技术为主的应用场景,可以很好的发挥作用。尤其是类似Notion、Slack等需要把Web端体验迁移到桌面端的场景,笔者认为Tauri是具备极大优势的。
话外聊一句:由于Notion桌面端App体积过大而功能与Web相差很小,笔者实际上使用Chrome的“Install Page as App”功能,一直在使用Web端页面。
一些案例:
- VSCode官方有不少issue讨论迁移到Tauri,但官方由于历史组件兼容性等其他考虑暂未有此计划。详见链接
- Teams 2.0 Moves Away from Electron to Embrace Edge WebView2
- 在Microsoft Teams迁移到Webview2之后,Electron团队也发了一篇讨论文章