成都商报app
73.15MB · 2025-10-27
Tauri写桌面端应用太香了,我用Tauri仿写了微信,因为很多API都可以用JavaScript来写,所以我的整个项目95%都是用JavaScript来写各种API的,对前端同学非常友好。
项目地址:gitee.com/ruirui-stud…
Naive UI:写界面的UI库JavaScript:写Tauri的API,占比大不得不说,Tauri的资源占用真的好,我引入了好几百kb的图片文件,Naive UI全部引入,还有很多svg图片,就是这样的情况下,打包后的安装包也才2.57M,我当时就惊了!
写桌面端的都是细节怪,如果是单一窗口也还好,可以像写网页一样一直写下去……
但是桌面端还要考虑多窗口,托盘图标、托盘菜单、窗口通信、底层权限、原生通知、进程管理等,随便拿出一个来都够研究半天的了。
我为了高度还原桌面微信,也是把细节拉满了
其实,大部分的API都可以用纯前端JavaScript的方式来完成,但是有些内容还是要用rust写的,尤其是需要用到跨窗口状态的。
比如登录窗口,登陆成功后一般是在pinia中设置一个变量isLogin默认值为false,然后把isLogin改为true,然后其他地方引用isLogin,但是如果是跨窗口的话,你只有在登录窗口的isLogin值为true,其他窗口的isLogin值还是默认的false。
同样地,你也不能用localStorage等方法,虽然这会在跨窗口中获取同样的缓存值,但是当应用退出程序后,再次打开应用时的isLogin还是缓存的true值,但是默认打开的是登录页,你可能会说,我在退出应用的时候清空缓存值不就好了吗,但是有时候用户不是通过退出按钮来退出的,有的直接关电脑或断电了呢,那么你该怎么监听?
所以说,还是得用到rust,直接在rust全局中记录登录的状态值,前端页面直接invoke这个变量即可,不管你是哪个窗口获取的值都一样,下次重启应用时,rust中初始化的isLogin值又变为false了,这就很符合我们的预期了。
未登录不显示托盘,已登录才显示托盘。
这是一个很常见的需求,如果你没有跨窗口的说法,那么用纯JavaScript写也是OK的,但是如果你有跨窗口的情况,那么就需要用到rust了,因为托盘用到的是一个实例,你在主窗口main显示时创建托盘,托盘实例为trayInstance,你在退出登录后,销毁主窗口main,创建登录窗口login,但是只要你销毁主窗口main,那么托盘实例trayInstance也就没有,也就无法销毁了。
可能你会说,我在销毁主窗口main之前的trayInstance实例还在的,我先销毁trayInstance实例不就行了吗?你可以试试看……