菜单

命令系统

相关源文件

Tauri 中的命令系统提供了一个健壮的 IPC(进程间通信)机制,允许前端的 JavaScript 代码调用后端的 Rust 函数。本文档记录了命令系统的架构、实现和用法。有关相关的双向通信事件系统的信息,请参阅 事件系统

架构概述

命令系统通过一个明确定义的 IPC 协议连接 JavaScript 前端和 Rust 后端。这使得 Web 应用程序能够在通过权限模型保持安全性的同时访问系统功能。

命令系统架构

来源

JavaScript API

前端主要通过 Tauri API 提供的 invoke 函数与命令系统进行交互。

Invoke 函数

invoke 函数是调用 JavaScript 命令的主要入口点

使用示例

来源

Rust 中的命令注册

命令使用 #[command] 属性在 Rust 中定义,并注册到应用程序中。

创建命令

命令是使用 #[command] 属性装饰的 Rust 函数

命令函数的关键特性

  • 可以接受各种参数类型,包括复杂的 Rust 结构体
  • 可以返回被序列化回 JavaScript 的值
  • 可以是异步或同步的
  • 可以通过参数访问应用程序状态
  • 可以限定到特定的权限

来源

命令注册

命令必须使用 invoke_handlergenerate_handler! 宏注册到 Tauri 应用程序中

generate_handler! 宏创建一个调度函数,该函数将命令调用路由到相应的处理函数。

来源

命令调用流程

下图说明了从 JavaScript 到 Rust 再返回的完整命令调用流程

来源

序列化

命令参数和返回值在跨越 JavaScript-Rust 边界时进行序列化/反序列化。

JavaScript 到 Rust

从 JavaScript 发送数据到 Rust 时

  1. 数组和类型化数组作为二进制数据传输
  2. 其他 JavaScript 对象被 JSON 序列化
  3. 可以使用 SERIALIZE_TO_IPC_FN symbol 进行自定义序列化

Rust 到 JavaScript

从 Rust 发送数据到 JavaScript 时

  1. Rust 值使用 Serde 进行序列化
  2. 值被反序列化为相应的 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:webviewWebview 操作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-version
  • core:window:deny-close

来源

实现细节

命令注册宏

命令注册系统使用 Rust 宏来

  1. 生成序列化/反序列化代码
  2. 创建权限检查逻辑
  3. 设置命令调度程序

#[command] 属性宏将 Rust 函数转换为可从 JavaScript 调用的类型化命令处理程序。

来源

IPC 协议

IPC 协议结合使用了

  • 用于异步结果的回调函数
  • 用于复杂类型的自定义序列化
  • 用于结构化数据的 JSON
  • 用于原始数据的二进制传输

__TAURI_IPC__ 协议由 JavaScript 运行时实现,并与 Tauri 窗口管理系统集成。

来源

插件命令系统集成

Tauri 插件可以定义自己的命令,这些命令与命令系统集成。插件命令通常使用命名空间模式,如 plugin:<name>|<command>

插件命令示例

应用程序插件定义和注册命令的方式如下

来源

总结

Tauri 命令系统提供了 JavaScript 和 Rust 代码之间安全、类型安全的消息传递桥梁。它允许 Web 应用程序通过具有权限控制的结构化 API 访问系统功能。该系统处理序列化、调用、错误处理和权限检查,同时为 JavaScript 和 Rust 开发人员提供简单的 API。