桥梁:从 JavaScript 调用 Rust
桥梁:从 JavaScript 调用 Rust
Section titled “桥梁:从 JavaScript 调用 Rust”Tauri 的真正强大之处在于它将 Web 便捷的 UI 开发与 Rust 的原生性能相结合。为此,我们使用 IPC (Inter-Process Communication,进程间通信)。在 Tauri 中,我们称之为命令(Command)系统。
步骤 1:创建 Rust 命令
Section titled “步骤 1:创建 Rust 命令”命令本质上是一个用 #[tauri::command] 宏标注的 Rust 函数。这个宏会自动处理数据的序列化。
// src-tauri/src/lib.rs 或 main.rs
#[tauri::command]fn greet(name: &str) -> String { format!("Hello, {}! You've been greeted from Rust!", name)}步骤 2:注册命令
Section titled “步骤 2:注册命令”仅仅定义函数是不够的;你必须告知 Tauri 它的存在。我们通常在 lib.rs(针对 v2 移动兼容结构)或 main.rs 中的 tauri::Builder 的 invoke_handler 中注册命令。
#[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() { tauri::Builder::default() // 在这里注册命令 .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) .expect("error while running tauri application");}步骤 3:从前端调用
Section titled “步骤 3:从前端调用”在 JavaScript 侧,我们使用 @tauri-apps/api 包提供的 invoke 函数。此函数返回一个 Promise,便于处理异步数据流。
首先,请确保你已安装了 API(如果未使用默认模板):
npm install @tauri-apps/api然后,调用该命令:
import { invoke } from '@tauri-apps/api/core';
async function callGreet() { // 第一个参数是命令名称(Rust 中的函数名) // 第二个参数是与 Rust 参数匹配的对象 const message = await invoke('greet', { name: 'World' }); console.log(message); // 输出:Hello, World! You've been greeted from Rust!}处理异步操作
Section titled “处理异步操作”Rust 命令从前端调用时本质上是异步的。这对于繁重计算(如图像处理或数据库查询)非常有利,因为它确保了你的 UI 在等待后端响应时不会卡顿。
你也可以将你的 Rust 函数定义为 async fn,Tauri 将在桥接层无缝处理 await 逻辑。
#[tauri::command]async fn perform_heavy_task() -> String { // 模拟工作 std::thread::sleep(std::time::Duration::from_secs(2)); "Task Complete".to_string()}