Skip to content

桥梁:从 JavaScript 调用 Rust

Tauri 的真正强大之处在于它将 Web 便捷的 UI 开发与 Rust 的原生性能相结合。为此,我们使用 IPC (Inter-Process Communication,进程间通信)。在 Tauri 中,我们称之为命令(Command)系统。

命令本质上是一个用 #[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)
}

仅仅定义函数是不够的;你必须告知 Tauri 它的存在。我们通常在 lib.rs(针对 v2 移动兼容结构)或 main.rs 中的 tauri::Builder 的 invoke_handler 中注册命令。

src-tauri/src/lib.rs
#[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");
}

在 JavaScript 侧,我们使用 @tauri-apps/api 包提供的 invoke 函数。此函数返回一个 Promise,便于处理异步数据流。

首先,请确保你已安装了 API(如果未使用默认模板):

Terminal window
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!
}

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()
}