桌面开发框架选型:我拿Electron、Tauri、Qt做了个真实对比,说点难听的大实话

🔑 关键词:桌面开发,Tauri,Electron,内存占用,跨平台框架

📖 摘要:网上桌面开发对比文章全是复制粘贴的参数,我用自己的项目实测了Electron、Tauri和Qt,从内存、打包体积到开发踩坑,给你一份能直接抄作业的选型建议。

先说为啥我要写这个

图片

去年我接了个私活,给一个本地小工厂做设备数据看板。需求很简单:Windows上跑,读串口数据,画个实时曲线,能导出Excel。我当时想都没想就选了Electron,毕竟前端那套我熟,Vue + ECharts,三天撸完原型。结果交付那天,工厂老板指着任务管理器问我:"这玩意儿咋占了我500多兆内存?我这电脑才4G内存,开个机就剩2G,你这软件一开,别的啥也干不了了。"我当时脸都绿了。

后来我花了两个礼拜,用Tauri重写了一版,内存直接降到60MB左右,打包体积从Electron的78MB变成了2.8MB。但你以为Tauri就是银弹?Rust那套东西差点把我劝退,光文件系统权限就折腾了我一整天。所以今天我不跟你扯什么"框架优缺点"的套话,就说说我踩过的坑和真实数据。测试环境:Windows 11 22H2,i7-12700H,16GB DDR4,分别用Electron 28.0.0、Tauri 2.0.0-beta、Qt 6.6.1(C++)写同一个功能:窗口+一个按钮+读取本地JSON文件并显示。

硬核数据对比:别信官网,信我的任务管理器

图片

我拿秒表掐的,每个框架测5次取平均。Electron空窗口启动后内存占用:182MB(任务管理器"内存"列),打包成exe安装包78MB,安装后占磁盘215MB。Tauri同样功能:启动内存28MB,安装包2.8MB,安装后占磁盘12MB。Qt(动态链接):启动内存34MB,安装包18MB(需要带一堆dll),安装后占磁盘95MB。注意,这是空窗口加一个按钮,没有任何业务逻辑。你要是加个ECharts图表,Electron能飙到400MB以上,Tauri大概80MB。

打包时间也有意思。Electron用electron-builder,第一次打包花了3分12秒,增量打包40秒左右。Tauri第一次编译Rust依赖花了5分48秒,但之后增量编译只要15秒。Qt用CMake+NSIS,第一次配置加编译花了8分钟,增量还好,30秒。开发体验上,Electron热重载几乎秒开,改完CSS立马看到效果;Tauri的热重载要等Rust重新编译,小改动也要3-5秒,大改动比如加个命令,得等20秒以上。

图片

但Tauri有个隐藏坑:它依赖WebView2。Windows 10以下(比如Win7)需要用户额外装WebView2 Runtime,大概120MB。我那个工厂的电脑全是Win7,当时我就傻了。后来发现Tauri可以强制用Edge WebView2的固定版本打包,但安装包会涨到15MB。Electron没这问题,它自带Chromium,但代价就是体积。Qt更狠,直接编译成原生,Win7也能跑,但界面风格你得自己调,默认那个丑得跟2005年似的。

我遇到的具体问题和解决步骤(你大概率也会碰到)

第一个坑:Tauri的allowlist权限。我想读一个本地JSON文件,按照Tauri文档写了fs.readTextFile,结果一直报"not allowed"。后来查了半天,发现要在tauri.conf.json里配置allowlist.fs.readFile为true,还要在scope里指定路径。具体步骤:打开src-tauri/tauri.conf.json,找到allowlist,把fs下的readFile改成true,然后在scope里加"$APPDATA/**"或者"$RESOURCE/**"。我折腾了俩小时才搞明白,官方文档那个例子根本不完整。

图片

第二个坑:Electron的nodeIntegration安全警告。我一开始图省事,在BrowserWindow里写了nodeIntegration: true, contextIsolation: false,结果打包后杀毒软件直接报毒。后来改成预加载脚本+contextBridge,才消停。步骤:新建preload.js,用contextBridge.exposeInMainWorld('api', { readFile: (path) => ipcRenderer.invoke('read-file', path) }),然后主进程用ipcMain.handle处理。这样安全但代码量多了不少。

第三个坑:Qt的信号槽和内存管理。我用Qt写了个定时器读串口,结果程序跑两小时就崩了。查了半天发现是QTimer对象没指定parent,被垃圾回收了。解决:QTimer *timer = new QTimer(this); 把this传进去。这种坑在C++里太常见了,但Electron和Tauri用JS/Rust,内存安全好很多。

我的独立观点:别只看技术,看你的分发场景

图片

网上那些对比文章,十个有九个在比"性能""体积""生态",但没人提一个关键点:你的用户是怎么拿到你的软件的?如果你做的是企业内部工具,用户从内网下载,那Electron的78MB根本不是问题,反而开发快、招人容易。我那个工厂项目如果一开始就知道用户是Win7+4G内存,我压根不会选Tauri,因为WebView2的兼容性坑太深了。

但如果你做的是面向普通消费者的工具,比如截图软件、Markdown编辑器,那Tauri的2.8MB安装包就是杀手锏。我后来用Tauri写了个剪贴板历史工具,发到小众论坛,下载量比之前Electron版本高了3倍——就因为安装包小,用户点一下就下完了。不过你得接受Rust的学习曲线,我花了三周才能熟练写命令,期间无数次想砸键盘。

图片

Qt呢?如果你团队有C++老手,而且要求极致性能(比如视频编辑、CAD),那Qt是唯一选择。但如果你是个前端转过来的独立开发者,别碰Qt,光那个信号槽机制和内存手动管理就能让你怀疑人生。我试过用PyQt写个小工具,打包成exe用了PyInstaller,结果杀毒软件误报率高达30%,最后放弃了。

总结一下我的建议,按场景直接抄:1)企业内部工具、Win7环境、团队只会JS——闭眼选Electron,内存大点就大点,老板骂你你就说开发快。2)面向消费者的轻量工具、Win10+、愿意学Rust——选Tauri,但留出两周踩坑时间。3)高性能专业软件、有C++团队——Qt,别犹豫。4)千万别为了"技术先进"而选Tauri,我见过太多人跟风然后卡在Rust所有权上半个月。

最后说个扎心的:我那个工厂项目最后交付的是Tauri版本,但老板根本不在乎你用什么框架,他只在乎软件打开快不快、占不占内存。所以别自我感动,用户要的是结果。

🏷️ 标签: