进程间通信(Inter‑Process Communication, IPC)
Tauri 使用 进程间通信(IPC) 来连接:
- WebView(前端 UI)
- Rust 核心(后端逻辑)
IPC 是 Web 前端与 Rust 之间唯一的通信桥。 它采用消息传递机制,提供结构化且安全的调用方式。 (v2.tauri.app)
什么是 IPC?
IPC 指从 Web 前端环境(WebView) 到 Rust 核心 发送消息的方式。
前端无法直接调用 Rust 函数,而是通过 IPC 调用 Rust “命令(Commands)”,后者在 Rust 端注册并处理对应行为。
Rust 执行完毕后,可以将结果或事件发送回前端。 (v2.tauri.app)
Web → Rust
注册命令(Register Commands)
要让 Rust 成为可被调用的 IPC 端点,需要在 Rust 端定义命令:
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
命令必须使用:
#[tauri::command]
这个宏会让 Tauri 在编译时生成必要的处理程序。
然后需要将命令添加到构建器:
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
执行后,Rust 就暴露了 greet 命令供前端调用。 (v2.tauri.app)
调用命令(Invoke Commands)
前端通过 Tauri 提供的 JavaScript API 调用 Rust 命令:
import { invoke } from '@tauri-apps/api/tauri';
await invoke('greet', { name: 'Alice' });
调用说明:
- 第一个参数是命令名称(字符串)
- 第二个参数是命令参数对象
→ 对应命令函数的参数名(这里是
name)
调用后会返回 Rust 函数的返回值。 (v2.tauri.app)
Rust → Web
Rust 也可以主动向 Web 前端发送事件。
发送事件(Emit Events)
Rust 使用 emit_all 或 emit 将事件发送到前端:
window
.emit_all("status-updated", "ready")
.unwrap();
在这个示例中:
- 事件名称是
"status‑updated" - 数据是
"ready"→ 类型可以是任何可以序列化的数据(例如对象、数组、数字等)。 (v2.tauri.app)
前端监听事件(Listening Events)
前端可以使用 JavaScript API 监听这些事件:
import { listen } from '@tauri-apps/api/event';
const unlisten = await listen('status-updated', event => {
console.log(`Status: ${event.payload}`);
});
调用说明:
listen会返回一个“取消监听(unlisten)函数”- 你可以在任意时候调用它来移除监听器。 (v2.tauri.app)
错误处理(Error Handling)
当前端调用命令出错时:
invoke()会返回一个 rejected Promise- 错误信息可以在
.catch()中捕获
示例:
import { invoke } from '@tauri-apps/api/tauri';
invoke('greet', { name: null })
.catch(e => {
console.error('调用错误:', e);
});
说明:
- 参数类型错误
- 命令未注册
- 命令内部 panic 都将导致调用失败并抛出错误。 (v2.tauri.app)
安全性提示(Security Considerations)
为了保证应用高安全性:
🔒 最小权限原则(Least Privilege)
只注册并暴露真正需要的命令,避免一口气开启大量命令接口。
这不仅减少攻击面,还能:
- 限制不必要的系统访问
- 减少暴露风险
🔒 验证参数(Validate Inputs)
在 Rust 命令中严格检查前端传入的参数:
#[tauri::command]
fn set_age(age: u8) -> String {
if age < 0 || age > 120 {
return "无效年龄".into();
}
format!("设置年龄: {}", age)
}
不要信任来自前端的任何数据。 所有逻辑必须在 Rust 侧进行验证与解析。 (v2.tauri.app)
事件与命令区别总结(Events vs Commands)
| 交互方式 | 方向 | 说明 |
|---|---|---|
| 命令(Commands) | Web → Rust | 用于调用 Rust 函数并返回结果 |
| 事件(Events) | Rust → Web | Rust 主动通知前端发生的状态变更 |
总结(Summary)
- IPC 是前端与后端通信唯一机制
- 定义 Rust 命令来接收前端调用
- 前端使用
invoke()调用命令并等返回结果 - Rust 可以 emit 事件,前端可监听
- 做好错误处理与安全检查
