Tauri 项目开发实战(1)
序言:动机
按我的个人习惯,每年除夕到春节这几天都会给自己的组员还有这一年打过交道的人写一段新年祝福。每个人的祝福都是根据今年的情况定制的,比如已经在工作的我会说祝工作顺利准时下班,还在读书的会说学业顺利,跑路的会祝他找到好下家,在考研的会祝上岸之类的。但是因为这几年认识的人或者受到过帮助的人越来越多,所以写祝福这件事就已经变成了一件特别耗时而且容易犯错的事情。大学的时候还能在看春晚期间顺手写完,今年直接在工位上从晚上八点被硬控到凌晨三点,总共发了三百多个人,打了一万六千多字。
但是忙中总会出错,点开项目群里一些进来不太说话的群友头像,总是需要一些时间回忆 ta 现在的身份是学生还是打工人,亦或是之前有没有说过要考研之类的话;一些两年前加入的群友现在不知道还在准备毕设亦或已经毕业;辛苦写完躺到床上一翻朋友圈发现还遗漏了一些重要的人,又要爬起来重新在记忆的海洋里开始大海捞针,还记错了个别人的对象名字祝别人和不存在的绯闻对象百年好合()
AI 已经足够强大,特别是最近几天的 DeepSeek R1 更是让我看到了将 LLM 作为私人秘书,借助 LLM 强大的记忆、整合和解构细化能力来管理个人生活和社交网络的可能性。于是我有了一个想法:开发一个跨平台应用,平日里借助多模态 LLM 的识图、语音转文字和总结细化功能整合联系人信息,到了特定日期(生日、节日……)时根据这些信息自动生成提醒或是祝福语,如果能一键跳转到对应联系人的 QQ 或是微信(QQ 还有点可能,微信还是趁早似了罢)就更好了。
我并不在意把这个点子放出来会不会被别人捷足先登,毕竟这个需求一定不止我一个人拥有,并且我也不需要靠这个赚钱。这个 idea 大厂不屑于做成独立应用,个人开发者做了也很难有市场,再考虑到隐私问题——毕竟你要把整个人际关系网络完全暴露给一个不可信的第三方——我认为这个需求存在,但是并不存在一个能够成功商业化的解决方案。如果没有人做,那我就自己做;如果有赛博菩萨做出来开源那太好了,我 tm 直接白嫖。
目前简单调研了一下最类似的应该是 WOLB,但是苹果派评论区里有太多人也指出了它的不足:需要花费大量时间维护,隐私问题难以保证,无用功能繁杂,核心功能匮乏——但最重要的是它是订阅制,我觉得我的关系维护需求不配花这一年 98 块钱。有这 98 块钱拿去充通义千问或者 DeepSeek 我觉得两年都不一定能用完。
我决定把这个应用命名为 Contact Lens,字面意思是“隐形眼镜”;Contact 本身又有“联系”和“接触”之意,而 Lens 自然不必多说,作为“透镜”,它能帮助用户更好地聚焦于联系人的需求与喜好。我希望整个应用就像隐形眼镜一样,成为用户“看清”联系人需求,但又不会给日常管理和维护造成太大负担的随身物品。同时它也许也能发挥出其他用途,比如商务助理和销售用来记录客户喜好和重要事件,老师用来记录学生进步情况,家长用来记录孩子成长之类的。
选择 Tauri
为什么选 Tauri?因为我是金牛座(不是)
其实我从试水 Tauri 开始就一直都是一个坚定的 Tauri 小黑子,它从 Electron 的历史错误中学到了教训,然后转头就创造了更多的历史错误。其中最让人绷不住的还是它按着所有开发者的头让大家用 rust 写后端,rust 可能跨平台,但 rust 跨平台不太可能。

但是回顾一下需求:我需要一个跨平台的应用,并且这个应用需要一定与系统交互的能力(发送通知、打开 QQ 或微信、写入和同步数据库,以及与系统层级的大模型 API 交互——我认为未来所有的系统更新一定会包含端侧模型交互能力)。因此 Electron 很遗憾地被我排除在外,不是因为它太大了,而是因为它在移动端上基本跑不动。
那么 Flutter 呢?Flutter 的跨平台能力是毋庸置疑的,但是 Flutter 最近的维护状况实在有些让人不敢恭维,总觉得不知道哪天就会静悄悄地死我电脑里。而 UniApp 和 Taro 就是懂的都懂了。
所以兜来转去,最后似乎我能想到的解决方案暂时只有这个平台间 API 不统一、Windows 安装程序本体 = WebView2 下载器、开发者不能控制 WebView 版本、后端要捏着鼻子写 rust 的 Tauri了。
基础配置
创建项目
Tauri 提供了一个完整的上手文档、整合了必要的前后端开发工具的模板启动器,以及一个 VS Code 插件。运行 pnpm create <app-name>
并跟随指引就可以在本地创建一个名为 app-name
的 Tauri 项目。项目会默认使用 Vite 作为前端开发框架(具体前端 UI 框架可以自行指定),但是不会自动安装 rust。
如果是在 Mac 上开发应用并且已经安装了 homebrew,可以通过 homebrew 安装 rust:
brew install rust
这个命令会打包安装 rust 以及 rust 的包管理工具 cargo,还有 cargo 的依赖追踪工具 gitlib2。
安装完成后便可在项目内的根文件夹内开始开发。
文件结构
Tauri 是前后端分离结构,前端代码在根目录的 src
文件夹中,后端代码在 src-tauri
文件夹中。特殊地,Tauri 有一个权限控制文件 src-tauri/capabilities/default.json
,这个文件定义了应用的权限,比如是否可以访问网络、是否可以访问系统剪贴板、是否可以访问系统通知、是否可以访问系统文件夹、是否可以访问系统摄像头、麦克风、扬声器、蓝牙、Wi-Fi 等等。
启动 dev 环境
Tauri 项目中有两个启动命令:
pnpm dev
只启动前端开发环境,在浏览器内调试;pnpm tauri dev
在 Tauri 开发环境内调试,可以同调前后端。
Tauri 不同于 Electron,每次通过 tauri dev
启动时,Tauri 都会重新编译后端 rust
代码。启动慢是一方面,另一方面是编译垃圾很快就会把硬盘塞满,这也是我不喜欢 Tauri 的原因之一。都说 node_modules 重,我看大伙是没见过占了接近四个 G 硬盘空间但是只能输出一个 hello world 的 src-tauri/target
文件夹。
至此,一个简单的 Tauri 项目和脚手架就创建完成了。我把配了基本前端开发环境的代码推送在了 mark9804/contact-lens 上,有兴趣的可以参考一下。