菜单

通道 API

相关源文件

Channel API 提供了一个强大的机制,用于在 Tauri 应用程序的 JavaScript 和 Rust 之间双向流式传输数据。与一次性命令调用不同,通道建立持久连接,允许前端和后端之间进行连续的数据交换。

概述

Channel API 是 Tauri IPC(进程间通信)系统的一部分,并作为命令系统和事件系统的补充通信方式。命令系统提供请求-响应模式,事件系统支持广播消息,而通道则创建用于连续数据交换的专用流。

来源

通道如何工作

通道通过一个唯一的标识符系统运行,该系统允许消息在 JavaScript 和 Rust 之间路由。当数据通过通道发送时,它会被序列化、排队并传递到另一端的相应处理程序。

来源

通道组件

Channel API 包含几个关键组件,它们协同工作以实现双向通信

组件描述
Channel<TSend>代表通信通道的主要结构,泛型化了它可以发送的数据类型
ChannelInner内部状态,包含通道 ID 和消息处理程序
ChannelDataIpcQueue用于存储需要从 Rust 发送到 JavaScript 的数据的队列
JavaScriptChannelId表示 JavaScript 端定义的通道 ID
OnMessageFn收到消息时执行的回调函数
OnDropFn通道被丢弃时执行的可选回调函数

来源

从 Rust 使用通道

创建通道

在 Rust 中,您可以使用自定义消息处理程序创建一个新通道

Channel::new 方法接受一个闭包,该闭包在数据从 JavaScript 发送到 Rust 时被调用。

来源

接收 JavaScript 通道

当 JavaScript 通道传递给 Tauri 命令时,它会自动转换为 Rust 的 Channel,您可以使用它来发送数据回去

来源

从 JavaScript 使用通道

创建通道

在 JavaScript 中,您可以使用 @tauri-apps/api 包创建通道

将通道传递给命令

通道可以作为参数传递给 Tauri 命令

通道性能优化

Channel API 包含用于处理大数据负载的性能优化

  1. 对小负载进行直接执行:小的 JSON 负载(<8KB)和原始数据(<1KB)会直接通过 WebView 的 eval 方法发送,以实现更快的传递。

  2. 对大负载使用 Fetch API:较大的负载会被排入 ChannelDataIpcQueue 并使用 fetch API 调用检索,这为大数据传输提供了更好的性能。

这些优化会根据负载大小自动应用。

来源

通道实现细节

通道标识符

每个通道都通过原子计数器分配了一个唯一的标识符,确保了创建多个通道时的线程安全。这些标识符用于在 JavaScript 和 Rust 之间正确路由消息。

来源

数据序列化

通道使用 Tauri 的 IPC 序列化系统在 JavaScript 和 Rust 格式之间转换数据。通过通道发送的数据必须实现 IpcResponse trait,该 trait 定义了如何将其转换为可以通过 IPC 桥传输的形式。

来源

通道终止

当 Rust 通道被丢弃时,它可以触发一个可选的回调函数来通知 JavaScript 端通道已终止。这允许双方进行适当的清理。

来源

高级用例

与 Webview 的通信

通道可用于建立与特定 Webview 的通信

来源

类型化通道

Channel<TSend> 结构是泛型的,可以发送数据类型,从而实现类型安全的通信

在 API 设计中使用通道

Tauri 插件系统通常使用通道提供流式 API

结论

Channel API 提供了一个强大的机制,用于在 Tauri 应用程序的 JavaScript 和 Rust 之间进行双向流式通信。通过建立具有高效数据传输优化的持久连接,通道能够实现响应式和数据密集型应用程序,而无需重复调用命令的开销。

有关 Tauri 中其他 IPC 机制的更多信息,请参阅 Command SystemEvent System 文档。