Tauri 的整体架构像一座精心设计的桥梁:上层是 Web 技术驱动的用户界面,底层是 Rust 支撑的原生能力,中间通过一个极简核心层完成连接与安全控制。理解这四层结构,能帮你更好地规划功能边界和代码组织方式。
前端 WebView 层:纯 Web 开发体验
这一层就是你的 React、Vue、Svelte 或纯 HTML 页面,运行在操作系统自带的 WebView 中。对开发者来说,和开发一个普通的前端 SPA 几乎没区别,你依然可以使用 Vite、Webpack、Tailwind CSS 等所有前端生态工具。唯一的不同是:这个页面不是跑在浏览器里,而是跑在 Tauri 打开的系统窗口里,并且可以通过 @tauri-apps/api 包调用 Rust 后端暴露的命令。
- 前端代码最终被编译为静态文件(HTML/JS/CSS),嵌入到应用资源中。
- 你可以通过
window.TAURI访问 IPC 调用能力,例如打开文件对话框、读取系统信息。 - 这一层天然被隔离在 WebView 沙箱中,安全边界清晰。
Tauri Core 核心层:连接一切的调度中心
这是 Tauri 框架自身用 Rust 编写的最小化内核,负责处理所有“框架级”的事务,是前后端通信的总线。开发者通常不需要修改这一层,但理解它的职责很重要:
- 窗口管理:创建、关闭、最大化/最小化窗口,管理多个 WebView 实例。
- IPC 通信:接收前端发来的命令调用,序列化参数,转交给你的 Rust 业务代码,并将结果返回前端。
- 权限与安全:在 IPC 调用到达你的命令处理函数之前,先根据配置文件检查该命令是否被允许,实现白名单控制。
- 资源加载:处理静态文件服务、自定义协议(如
tauri://)的拦截与响应。 - 生命周期与事件:管理应用启动、退出、系统托盘、全局快捷键等系统级事件。
用一句话概括:Core 层确保框架“跑起来”,并保证所有跨边界调用都是被授权和安全的。
Rust 原生层:业务逻辑的真正载体
这一层是你自己编写的 Rust 代码,属于应用的核心。你在这里定义 #[tauri::command] 函数,实现文件处理、加密解密、网络请求(可通过 Rust 生态库如 reqwest)、数据库操作、系统调用等所有会直接触碰操作系统能力的工作。
- 命令暴露:通过
#[tauri::command]将一个普通 Rust 函数标记为可被前端调用的命令,然后在main函数中注册。前端即可用invoke('command_name', { args })调用。 - 状态共享:你可以通过
tauri::State在多个命令之间共享数据库连接池、配置对象等,完全由 Rust 的所有权系统保证线程安全。 - 错误处理:Rust 的
Result类型可以优雅地转化为前端可识别的成功/失败响应,不会让 panicking 击穿到 UI 层。
实际开发中,这一层写起来就像在写一个轻量的本地后端服务,只不过它直接编译进了应用,没有网络消耗,错误率更低。
插件生态层:复用官方与社区的现成能力
Tauri 官方和社区提供了大量插件,把常用功能封装成了“即插即用”的模块,减少重复造轮子。插件通常由两部分组成:Rust 端(提供底层实现)和 JS 端(提供简洁的前端调用 API),通过 Tauri Core 的 IPC 机制协作。
- 官方插件:如
tauri-plugin-fs(文件系统访问)、tauri-plugin-http(HTTP 客户端)、tauri-plugin-sql(SQLite 数据库)、tauri-plugin-dialog(系统对话框)、tauri-plugin-clipboard等。 - 用法简单:在
Cargo.toml中引入 Rust 依赖,在 JS 侧安装对应的 npm 包,再在main里注册插件,就可以直接调用高阶 API。例如,一句await request.get('https://example.com')就能发起 HTTP 请求,而无需手动编写 Rust 的 IPC 命令。 - 社区插件:覆盖了从 3D 渲染到串口通信等更 niche 的场景,帮助你在不离开前端生态的前提下调用复杂硬件能力。
插件生态层让 Tauri 的能力可以快速膨胀,同时保持内核的轻量——你只需要按需引入,不需要为用不到的功能买单。
这四层架构相互配合,形成了一条清晰的数据流:
前端触发 → Core 鉴权转发 → Rust 原生层执行业务逻辑 → 结果返回前端渲染。插件则像是预制好的“模组”,直接嵌入这个流程。这种分层设计既保留了 Web 开发的灵活性,又通过 Rust 保证了底层调用的安全与性能,是 Tauri 区别于其他方案的根本所在。