Tauri 中的命令系统提供了一个健壮的 IPC(进程间通信)机制,允许前端的 JavaScript 代码调用后端的 Rust 函数。本文档记录了命令系统的架构、实现和用法。有关相关的双向通信事件系统的信息,请参阅 事件系统。
命令系统通过一个明确定义的 IPC 协议连接 JavaScript 前端和 Rust 后端。这使得 Web 应用程序能够在通过权限模型保持安全性的同时访问系统功能。
命令系统架构
来源
前端主要通过 Tauri API 提供的 invoke 函数与命令系统进行交互。
invoke 函数是调用 JavaScript 命令的主要入口点
使用示例
来源
命令使用 #[command] 属性在 Rust 中定义,并注册到应用程序中。
命令是使用 #[command] 属性装饰的 Rust 函数
命令函数的关键特性
来源
命令必须使用 invoke_handler 和 generate_handler! 宏注册到 Tauri 应用程序中
generate_handler! 宏创建一个调度函数,该函数将命令调用路由到相应的处理函数。
来源
下图说明了从 JavaScript 到 Rust 再返回的完整命令调用流程
来源
命令参数和返回值在跨越 JavaScript-Rust 边界时进行序列化/反序列化。
从 JavaScript 发送数据到 Rust 时
SERIALIZE_TO_IPC_FN symbol 进行自定义序列化从 Rust 发送数据到 JavaScript 时
SERIALIZE_TO_IPC_FN symbol 允许自定义 JavaScript 对象的序列化
来源
Tauri 实现了一个权限系统来控制对命令的访问。每个命令都可以配置特定的权限要求。
权限在能力文件中定义,例如 API 示例应用中的这个例子
权限可以是
来源
Tauri 定义了几个内置插件,它们有自己的命令,每个插件都有自己的权限标识符
| 插件 | 描述 | 示例命令 |
|---|---|---|
| core:path | 文件路径操作 | resolve_directory, join, normalize |
| core:event | 事件系统操作 | listen, emit, emit_to |
| core:window | 窗口管理 | create, show, close, set_title |
| core:webview | Webview 操作 | create_webview, set_webview_size |
| core:app | 应用程序元数据 | version, name, identifier |
| core:image | 图像处理 | new, from_bytes, rgba |
| core:menu | 菜单操作 | new, append, popup |
| core:tray | 系统托盘操作 | new, set_icon, set_menu |
每个命令都有相应的允许/拒绝权限,例如
core:app:allow-versioncore:window:deny-close来源
命令注册系统使用 Rust 宏来
#[command] 属性宏将 Rust 函数转换为可从 JavaScript 调用的类型化命令处理程序。
来源
IPC 协议结合使用了
__TAURI_IPC__ 协议由 JavaScript 运行时实现,并与 Tauri 窗口管理系统集成。
来源
Tauri 插件可以定义自己的命令,这些命令与命令系统集成。插件命令通常使用命名空间模式,如 plugin:<name>|<command>。
应用程序插件定义和注册命令的方式如下
来源
Tauri 命令系统提供了 JavaScript 和 Rust 代码之间安全、类型安全的消息传递桥梁。它允许 Web 应用程序通过具有权限控制的结构化 API 访问系统功能。该系统处理序列化、调用、错误处理和权限检查,同时为 JavaScript 和 Rust 开发人员提供简单的 API。