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 中,您可以使用自定义消息处理程序创建一个新通道
Channel::new 方法接受一个闭包,该闭包在数据从 JavaScript 发送到 Rust 时被调用。
来源
当 JavaScript 通道传递给 Tauri 命令时,它会自动转换为 Rust 的 Channel,您可以使用它来发送数据回去
来源
在 JavaScript 中,您可以使用 @tauri-apps/api 包创建通道
通道可以作为参数传递给 Tauri 命令
Channel API 包含用于处理大数据负载的性能优化
对小负载进行直接执行:小的 JSON 负载(<8KB)和原始数据(<1KB)会直接通过 WebView 的 eval 方法发送,以实现更快的传递。
对大负载使用 Fetch API:较大的负载会被排入 ChannelDataIpcQueue 并使用 fetch API 调用检索,这为大数据传输提供了更好的性能。
这些优化会根据负载大小自动应用。
来源
每个通道都通过原子计数器分配了一个唯一的标识符,确保了创建多个通道时的线程安全。这些标识符用于在 JavaScript 和 Rust 之间正确路由消息。
来源
通道使用 Tauri 的 IPC 序列化系统在 JavaScript 和 Rust 格式之间转换数据。通过通道发送的数据必须实现 IpcResponse trait,该 trait 定义了如何将其转换为可以通过 IPC 桥传输的形式。
来源
当 Rust 通道被丢弃时,它可以触发一个可选的回调函数来通知 JavaScript 端通道已终止。这允许双方进行适当的清理。
来源
通道可用于建立与特定 Webview 的通信
来源
Channel<TSend> 结构是泛型的,可以发送数据类型,从而实现类型安全的通信
Tauri 插件系统通常使用通道提供流式 API
Channel API 提供了一个强大的机制,用于在 Tauri 应用程序的 JavaScript 和 Rust 之间进行双向流式通信。通过建立具有高效数据传输优化的持久连接,通道能够实现响应式和数据密集型应用程序,而无需重复调用命令的开销。
有关 Tauri 中其他 IPC 机制的更多信息,请参阅 Command System 和 Event System 文档。