Tauri 2 条目式速查字典。概念见《Tauri 是什么》,实战见《Tauri 2 架构入门》。
1. 三进程模型
描述
主进程(Rust 核心)+ WebView 进程(系统 WebView 跑前端)+ 可选辅助;不捆 Chromium。
| 平台 | WebView |
|---|---|
| Windows | WebView2(Edge 内核) |
| macOS | WKWebView |
| Linux | WebKitGTK 4.1(Tauri 2.x 起要求) |
2. tauri.conf.json 结构
描述
v2 用 app.windows 数组(v1 是 tauri.window 单对象);bundle 定打包目标。
语法和示例
{
"productName": "my-app",
"identifier": "com.example.app",
"build": { "frontendDist": "../dist", "devUrl": "http://localhost:5173" },
"app": {
"windows": [{ "title": "主窗口", "width": 960, "height": 640 }],
"security": { "csp": "default-src 'self'" }
},
"bundle": { "targets": ["dmg", "msi", "appimage"] }
}3. #[tauri::command]
描述
Rust 侧暴露给前端的函数;注册进 invoke_handler;支持 State/Result。
语法和示例
#[tauri::command]
fn greet(name: String) -> String { format!("你好, {name}!") }
#[tauri::command]
async fn load(state: tauri::State<AppState>) -> Result<Vec<Item>, String> {
state.fetch().await.map_err(|e| e.to_string())
}
tauri::Builder::default()
.manage(AppState::default())
.invoke_handler(tauri::generate_handler![greet, load])
.run(tauri::generate_context!())?;4. invoke 前端调用
描述
@tauri-apps/api/core 的 invoke;参数名对驼峰自动映射。
语法和示例
import { invoke } from '@tauri-apps/api/core';
const msg: string = await invoke('greet', { name: 'X' });
const items = await invoke<Item[]>('load'); // 泛型给返回类型5. emit / listen 事件
描述
双向事件;Rust 用 app.emit,前端 listen 返回 unlisten 需清理。
语法和示例
// Rust: app.emit("progress", json!({"pct": 10}))?;
import { emit, listen } from '@tauri-apps/api/event';
useEffect(() => {
let un: (() => void) | undefined;
listen<{pct:number}>('progress', (e) => setPct(e.payload.pct))
.then(fn => { un = fn; });
return () => un?.();
}, []);6. capabilities 权限模型
描述
v2 默认最小权限;插件能力必须在 capabilities/*.json 声明——报 not allowed 先查这里。
语法和示例
// src-tauri/capabilities/default.json
{
"identifier": "default",
"windows": ["main"],
"permissions": [
"core:default",
"dialog:default",
"fs:allow-read-text-file"
]
}7. 官方插件三步装
描述
Rust 依赖 + npm 包 + 权限声明,缺一不可。
语法和示例
cargo add tauri-plugin-dialog
npm i @tauri-apps/plugin-dialog
1. 再在 capabilities/default.json 加 "dialog:default"8. 窗口管理
描述
Rust 侧 WebviewWindowBuilder 建多窗;前端 getCurrentWindow 控制。
语法和示例
import { getCurrentWindow } from '@tauri-apps/api/window';
getCurrentWindow().setTitle('新标题');
getCurrentWindow().close();
// Rust: WebviewWindowBuilder::new(&app, "settings", WebviewUrl::App("settings".into()))9. 菜单与托盘
描述
macOS 必须显式建菜单否则无编辑菜单;托盘用 TrayIconBuilder。
语法和示例
tauri::Builder::default()
.menu(tauri::menu::Menu::default(&handle)?)
.on_menu_event(|app, e| match e.id().as_ref() {
"quit" => app.exit(0), _ => {}
})
.setup(|app| {
tauri::tray::TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.build(app)?;
Ok(())
})10. 自动更新(updater)
描述
签名密钥对 + latest.json 清单 + 权限;macOS 需 notarize。
| 事项 | 要点 |
|---|---|
| 生成密钥 | tauri signer generate(公钥进 conf,私钥进环境变量 |
| 清单 | latest.json:version/pub_date/signature/platforms.url |
| 权限 | capabilities 加 updater:default |
| macOS | 分发需 notarize,否则更新校验失败 |
11. IPC 大数据
描述
传 ArrayBuffer 走 tauri::ipc::Response,别 JSON 序列化大块。
语法和示例
#[tauri::command]
fn blob() -> tauri::ipc::Response {
tauri::ipc::Response::new(bytes) // 前端收 ArrayBuffer
}12. 调试速查
描述
DevTools 快捷键;release 默认禁 devtools 需开 feature。
- WebView DevTools:Ctrl+Shift+I(Linux/Win)
- Rust 日志:tauri-plugin-log 或 env_logger
- release 调试:Cargo.toml 加 devtools = [“tauri/devtools”]
- 展开宏看代码:cargo expand
13. 构建生命周期
描述
脚手架 → dev 热重载 → build 产物在 bundle 目录。
语法和示例
npm create tauri-app@latest
npm run tauri dev
npm run tauri build # 产物 src-tauri/target/release/bundle/