Tauri
Tauri 适合放在“想做桌面端,但又不太想把一整套浏览器引擎都打进安装包”的那条线上看。它和 Electron 一样可以用 Web 技术写界面,但底层路线完全不同。
如果 Electron 的思路是“自己把 Chromium 带进去”,Tauri 的思路更像是“尽量借用系统已有的 WebView,再把系统能力和安全边界收紧”。
一句话先讲清楚
Tauri 是一个用 Web 前端加 Rust 后端来构建桌面端和移动端应用的框架。
官方 What is Tauri? 页面给出的说法很直接:
- 可以接入任何能编译成 HTML、JavaScript、CSS 的前端框架
- 后端逻辑可以用 Rust,也能扩展到 Swift、Kotlin 等语言
- 面向主流桌面和移动平台
这几个点基本决定了它的气质:
- 前端层很自由
- 后端能力很强
- 安全边界抓得比较紧
- 体积通常比 Electron 小很多
适合什么场景
- 希望继续用现有前端技术栈做桌面端
- 对安装包体积和资源占用比较敏感
- 需要系统能力,但希望权限和暴露面更可控
- 团队愿意接受一点 Rust 学习成本
不太适合什么场景
- 团队完全不想碰 Rust
- 更重视桌面生态成熟度和历史资料积累
- 项目需要非常多的现成桌面端生态方案,且希望“开箱就有”
Tauri 的核心结构
可以先把它理解成三层:
- 前端层:React、Vue、Svelte、Solid 等都可以
- Tauri 核心层:窗口、事件、命令、插件、权限体系
- Rust 系统层:真正的本地逻辑和系统调用
官方文档里对这点说得很明确:几乎任何前端框架都能和 Tauri 兼容,前端与 Rust 之间的绑定主要通过 invoke 来完成。
Tauri 为什么会显得更轻
因为它默认不打包 Chromium。
官方 What is Tauri? 页面把这一 点归纳成“smaller app size”。它直接利用用户系统已有的 WebView,所以一个最小 Tauri 应用可以非常小。
这也是 Tauri 最吸引人的地方之一:
- 包体积更小
- 资源占用通常更克制
- 桌面端交付时不需要再把整套 Chromium 搬进去
但这个优势也伴随着现实约束:系统 WebView 的具体表现,会受到目标平台环境影响。
Tauri 项目通常长什么样
最常见的结构通常是:
src/
components/
pages/
lib/
src-tauri/
src/
lib.rs
main.rs
tauri.conf.json
capabilities/
可以把它理解成:
src/:前端项目src-tauri/:Tauri 与 Rust 后端capabilities/:权限和能力声明
前端和 Rust 怎么通信
这是 Tauri 的主线之一。
官方开发文档里给出的核心机制是 command 系统。前端通过 invoke() 调用 Rust 里的命令函数,命令可以接收参数、返回数据,也可以返回错误。
#[tauri::command]
fn greet(name: String) -> String {
format!("Hello, {}!", name)
}
import { invoke } from '@tauri-apps/api/core'
const message = await invoke<string>('greet', { name: 'Torli' })
console.log(message)
如果前端团队以前做过“页面层调本地能力”的事情,会很快意识到:这其实就是 Tauri 版本的前后端边界。
Capabilities 为什么值得单独讲
Tauri 2 里很关键的一点,就是权限和能力控制明显比很多桌面框架更细。
官方 Capabilities 文档的核心意思是:
- capability 用来决定哪些 window / webview 拥有哪些权限
- capability 文件通常放在
src-tauri/capabilities目录下 - 可以按窗口、平台、插件权限去拆
这意味着 Tauri 不只是“能调系统 API”,而是更强调“哪些地方能调、哪些地方不能调”。
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"windows": ["main"],
"permissions": [
"core:window:default",
"core:event:default",
"dialog:default"
]
}
这类配置一开始会显得比 Electron 麻烦一点,但项目一旦变大,这种约束往往不是负担,反而是保护。
Tauri 的优势到底在哪
1. 前端栈自由
官方文档明确写了,几乎任何前端框架都能接进来。对现有 Web 团队来说,这点非常重要。
- React 可以接
- Vue 可以接
- Svelte 可以接
- Vite 这类构建链也很好配
2. 体积和资源占 用通常更友好
这点就是 Tauri 最常被拿来和 Electron 比较的地方。
对下载体积、安装分发、内存占用比较敏感的项目,Tauri 很有吸引力。
3. 权限体系更清楚
Tauri 2 的 capability / permission 体系让“系统能力暴露多少”这件事不再只靠约定,而是有配置层约束。
4. Rust 侧能力很强
一旦项目需要:
- 本地文件处理
- 高性能计算
- 更稳定的本地服务
- 更细的系统交互
Rust 这一层会非常有价值。
Tauri 的代价也要讲清楚
1. 团队需要接受 Rust
哪怕前端层完全熟悉,只要开始写 command、插件、系统交互,Rust 就会进场。
这不是缺点,但确实是门槛。
2. 生态成熟度不如 Electron
Tauri 已经很成熟了,但如果和 Electron 这种跑了很多年的桌面生态相比,现成资料、历史案例、第三方工具链,还是会少一些。
3. 调试链路会更分层
项目通常会同时碰到:
- 前端构建问题
- Tauri 配置问题
- Rust 编译问题
- 平台打包和签名问题
这意味着问题定位会跨层,不只是前端单层的心智模型。
Tauri 项目里最值得先建立的边界
1. 前端只负责界面和交互
不要一开始就把大量系统逻辑堆到前端层。前端更适合做:
- 页面结构
- 表单交互
- 状态展示
- 命令调用入口
2. Rust 负责本地能力和重逻辑
适合放到 Rust 的通常是:
- 本地文件系统读写
- 复杂数据处理
- 长时间后台任务
- 系统级集成
3. 权限声明尽早收紧
capabilities 不要拖到最后再补。越晚补,越容易把权限开得过大。
Tauri 和 Electron 怎么选
这是最常见的问题。
一个很直接的判断是:
- 想要更成熟的桌面生态、资料更多、团队更容易马上上手:先看 Electron
- 更在意体积、资源占用、安全边界和 Rust 后端能力:先看 Tauri
再具体一点:
优先选 Tauri 的情况
- 体积和资源占用很重要
- 团队不排斥 Rust
- 希望系统能力有更细的权限控制
- 项目本身偏工具型、客户端型、本地能力明确
优先选 Electron 的情况
- 团队几乎纯前端,不准备进入 Rust
- 需要成熟资料和历史经验兜底
- 更重视快速交付一套功能完整的桌面应用
我的看法
Tauri 最有意思的地方,不只是“小”,而是它把桌面端这件事重新做了一次取舍。
它没有沿着“把浏览器全带上”的方向继续堆,而是把体积、安全和系统边界这些问题拉回了框架中心。对于很多现代桌面工具来说,这个取舍是成立的。
如果团队能接受前端加 Rust 这条路,Tauri 很值得认真看。尤其是在 Electron 已经显得有点重的时候,Tauri 往往会变成非常现实的候选项。