用 Tauri 写运维软件很好,但是? ——OxideTerm 开发小记

7 月 1 日
 soleilune

OxideTerm 是一款我开发的免费开源的运维软件,具备 SSH 、SFTP 、端口转发、文件编辑、serial 、telnet 等功能。

GPUI 是 Zed 编辑器团队开源的 Rust 原生 UI 框架,直接用 Rust 构建桌面界面,不依赖浏览器 WebView 。最近在做 OxideTerm 的 GPUI 版本,顺便回头看了一下之前用 Tauri 的过程。我们最早用 Tauri 起步,就是因为它真的很适合快速做桌面端:前端生态成熟,Rust 后端也好用,包体积小,看起来也比 Electron 清爽很多。But at what cost ?

Tauri 一开始真的很香。包小、Rust 后端、前端生态成熟,看起来像是 Electron 的完美替代品。 但 OxideTerm 做到后面,我越来越觉得:它解决了 Electron 最显眼的问题,却把很多复杂度转移到了更难受的地方。

包体积是小了,WebView 还在;后端是 Rust 了,状态却被切成前后端两份;你以为自己在写原生应用,最后还是在给 IPC 、WebView 、Linux WebKitGTK 兜底。

前后端分离,双份事实容易相互污染

举几个实际例子:连接在后端,但是断连又要前端抓,重连、断线、任务取消、错误恢复,最后很多任务都要跨 IPC 来回同步,做久了发现容易两边都不完整。

很多东西放 Rust 后端很怪,因为它需要知道前面在干什么;放前端也很怪,因为它本质上又是连接、协议、系统资源。最后就变成前端一份状态,后端一份状态,中间一堆事件、命令、回调、序列化、反序列化。搞不好就是两份事实相互污染。说难听点,复杂到一定程度,可能反而不如 Electron 那种“大家都在一个 JS 世界里”的感觉。

WebView 还在,可能省不了太多内存

Tauri 包体积小是真的,启动也不错。但运行时还是 WebView 。UI 一复杂,多标签、多会话、终端输出、编辑器这些堆上来,内存并不会因为用了 Tauri 就突然消失(就例如 xterm.js)。Rust 后端确实香,高并发、协议、文件、网络这些都很舒服。问题是它和前端中间还隔着 IPC ,也会不如纯血 rust 性能好。

普通控制信号没什么问题。但终端输出日志流、输入事件这些一高频,JSON 通信就开始碍事。我们后来有些地方就是靠 WebSocket 绕开默认 IPC 。绕到最后就会想:那我当初为什么要这样?

(图为 tauri 版本空载内存,所有进程相加约 350 MB )。

( GPUI 版本 几乎只剩下三分之一,原生软件恐怖如斯)

Linux WebView 的坑

Windows 和 macOS 还好,Linux 上会被发行版、桌面环境、WebKitGTK 版本、输入法、字体、GPU 等轮流教育。这不完全是 Tauri 的锅,底层 WebView 差异就在那。但用户不会管这些,最后还是应用自己兜底。

所以我现在的感觉如果是设置面板、小工具、轻量客户端,Tauri 很合适。但如果是比较厚重的东西,要么索性就 Electron 追求快速开发+功能迭代,要不就不如尝试原生 App 了。

这也是我们现在在做 OxideTerm GPUI 版本的原因。GPUI 生态早,组件少,很多东西想要舒服要自己写,文档也没 Web 生态丰富,但至少它性能好得多,也相对统一一点。

最后介绍一下 OxideTerm

我们不只想做一个单纯的 SSH 客户端,而是想做一个运维工作台。平时干活经常不只是连一台机器敲命令,更多是在终端、文件、端口转发、远程桌面、临时 TCP / UDP 调试、多台机器会话之间来回切。

现在 GPUI 版在做这些:SSH 、Telnet 、Serial ,SFTP 和远程文件编辑,端口转发,Raw TCP / Raw UDP 调试,RDP / VNC ,多会话、多标签、连接管理。还在快速打磨,肯定有不少不成熟的地方。但方向很明确:少一点 WebView ,多一点真正围绕运维工作流的原生体验,让内存和应用性能表现好一些。

项目地址: https://github.com/AnalyseDeCircuit/OxideTerm

GPUI 预览版本下载(还在持续更新): https://github.com/AnalyseDeCircuit/oxideterm/releases/tag/gpui-v2.0.0-gpui-preview.11

如果你觉得这个方向有意思,也欢迎顺手点个 Star 。开源项目真的很靠这个让更多人看见。

最后,也想听听大家做复杂桌面工具时最后是怎么选的:Tauri 、Electron 、GPUI 、Slint 、egui 、Qt 、Flutter 、Wails 、Dioxus ?

2774 次点击
所在节点    程序员
27 条回复
xxlsize
7 月 1 日
Tauri 已经够用了,Electron 太重了
soleilune
7 月 1 日
@xxlsize 很多场景 Tauri 确实够用了,我也不是想完全否定它。只是 OxideTerm 这种终端软件,我们很在乎输入延迟、输出吞吐等;如果终端核心还是 xterm.js 这类 Web 渲染链路,性能上限就摆在那里了。

另外 Tauri 复用系统 WebView 的路线,确实容易遇到各平台、各发行版 WebView 版本不一致的问题。之前我们就遇到过不少因为 WebView 差异导致的 issue 。如果为了统一体验像 Electron 一样再把 WebView 自己打进去,那 Tauri 在轻量和系统复用上的优势就会被削弱很多。
luckzk
7 月 1 日
考虑加入数据库吗
soleilune
7 月 1 日
@luckzk 可以考虑,数据库面比较大,我还得慢慢了解先
0x5c0f
7 月 1 日
不是 rust 才是写运维工具的么
wbrobot
7 月 1 日
怎么 windows 安装版 58.4M ,portable 版本 169M ??
做了什么?
soleilune
7 月 1 日
@0x5c0f 协议和后端这层确实很适合 Rust ,我主要纠结的是桌面 UI 这层。Tauri 虽然后端是 Rust ,但前端还是 WebView ; OxideTerm 这种终端、多会话、文件、端口转发都堆在一起的工具,做到后面会遇到状态同步和高频数据流的问题,所以才想试 GPUI 这种 Rust/native UI 。
soleilune
7 月 1 日
@wbrobot 主要是压缩方式差异。安装版是 NSIS ,压缩率高; portable 是完整应用目录打 zip ,包含主程序、resources 、helper/CLI 、LICENSE/NOTICE/README ,zip 压缩率差很多。实际解压/安装后的体积会接近。
lakernote
7 月 1 日
借楼打个广告,可以多个参考项,虽然可能一堆人喷🥶 O(∩_∩)O 哈哈~
https://github.com/lakernote/EasyPostman
iLoveSS
7 月 1 日
Avalonia 有机会吗? 踩过这个坑的佬说说
soleilune
7 月 1 日
@iLoveSS Avalonia 我没实际用过,我问 GPT ,GPT 说它在 .NET 跨平台 UI 里看起来挺成熟,做管理工具/业务客户端应该有机会。
ASHYWHISPER
7 月 1 日
不错,我非常喜欢 Zed ,也一直在找合适的运维工具。直接下载 GPUI 版本
soleilune
7 月 1 日
@ASHYWHISPER 感谢!
soleilune
7 月 1 日
@lakernote 哈哈欢迎参考,不过这楼主要还是聊 OxideTerm 和 Tauri / GPUI 这类桌面技术选型。EasyPostman 看起来是另一个方向的工具,有兴趣的朋友可以顺手看看。
soleilune
7 月 1 日
@wbrobot 改掉了,以后 win 便携版本用高压缩率的,就不会这样了。
github2020
7 月 1 日
Zed 速度很快,无脑使用 GPUI 版本,感谢 OP
prudence
7 月 2 日
为什么突然就刷到 2 个帖子讨论 Avalonia 和 Tauri ,我才花了十天时间把一个 Avalonia 改为了 Tauri
soleilune
7 月 2 日
@prudence 这也挺正常,说明没有十全十美的东西。Tauri 在很多业务型桌面工具里确实很好用,我这边主要是终端高频输入输出、多会话和远程连接这些场景,WebView/IPC 的成本比较容易被放大,所以才试 GPUI 。应用形态不同,最佳选择也会不一样。
kero991
7 月 2 日
electron 是臃肿,但前提是,你得比 electron 小,才有资格批评它臃肿。
electron 的普遍打包在 80-100m ,重型软件才有可能达到 150M 这个量级
我们不谈 tauri ,他确实小,但也比 electron 差了不少,功能上差很多的。
而你们的软件大小,压根就不该拿 tauri 来比。electron 做出来很可能比你这个还小点。
ninjaJ
7 月 2 日
我现在也想从 tauri 迁移到 gpui ,但是无奈 tauri 的跨平台 updater 太省事了,gpui 这边的 updater 有什么好思路吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1224224

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX