tauri #[tauri::command] 作用
【摘要】 #[tauri::command] 是 Rust 中用于标记 Tauri 框架命令(command)的属性宏(attribute macro)。它的作用是将一个普通的 Rust 函数暴露给前端(如 JavaScript),使其可以被前端调用。 作用暴露给前端:标记的函数可以通过 Tauri 的前端 API(如 JavaScript 的 invoke)调用。序列化/反序列化:自动处理参数和返回...
#[tauri::command]
是 Rust 中用于标记 Tauri 框架命令(command)的属性宏(attribute macro)。它的作用是将一个普通的 Rust 函数暴露给前端(如 JavaScript),使其可以被前端调用。
作用
- 暴露给前端:标记的函数可以通过 Tauri 的前端 API(如 JavaScript 的
invoke
)调用。 - 序列化/反序列化:自动处理参数和返回值的序列化(使用 Serde)。
- 跨语言通信:作为 Rust 后端和前端(如 JavaScript/TypeScript)之间的桥梁。
使用场景
在 Tauri 应用中,当需要从前端(如网页)调用 Rust 逻辑时(例如文件操作、加密、系统交互等),就用 #[tauri::command]
暴露函数。
简单示例
1. 添加依赖
确保 Cargo.toml
包含 Tauri 依赖:
[dependencies]
tauri = { version = "1.0", features = ["api-all"] }
serde = { version = "1.0", features = ["derive"] }
2. 定义命令
在 Rust 代码中标记函数:
// src/main.rs 或 src/commands.rs
use serde::{Deserialize, Serialize};
use tauri::command;
// 定义一个结构体(可选,用于复杂参数)
#[derive(Debug, Serialize, Deserialize)]
struct GreetInput {
name: String,
}
// 标记为 Tauri 命令
#[tauri::command]
fn greet(input: GreetInput) -> String {
format!("Hello, {}!", input.name)
}
// 另一个简单命令
#[tauri::command]
fn add(a: i32, b: i32) -> i32 {
a + b
}
3. 注册命令
在 Tauri 的 main
函数中注册命令:
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![greet, add]) // 注册命令
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
4. 前端调用(JavaScript/TypeScript)
在前端代码中(如 HTML 或 React/Vue 组件):
import { invoke } from "@tauri-apps/api";
// 调用 greet 命令
invoke("greet", { name: "Alice" })
.then((response) => console.log(response)) // 输出: "Hello, Alice!"
.catch((error) => console.error(error));
// 调用 add 命令
invoke("add", { a: 5, b: 3 })
.then((sum) => console.log(sum)); // 输出: 8
关键点
- 参数和返回值:必须实现
serde::Serialize
和serde::Deserialize
(基本类型如i32
、String
已自动实现)。 - 异步支持:如果需要异步,用
#[tauri::command] async fn foo() {}
,前端用await invoke("foo")
。 - 错误处理:返回
Result<T, String>
可以向前端传递错误信息。
完整项目结构
src/
├── main.rs # 注册命令和启动 Tauri
├── commands.rs # 可选:分离命令定义
└── ...
通过这种方式,你可以安全地将 Rust 的强大功能暴露给前端,同时保持类型安全和跨语言通信的简洁性。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)