tauri #[tauri::command] 作用

举报
福州司马懿 发表于 2025/09/25 10:17:51 2025/09/25
【摘要】 #[tauri::command] 是 Rust 中用于标记 Tauri 框架命令(command)的属性宏(attribute macro)。它的作用是将一个普通的 Rust 函数暴露给前端(如 JavaScript),使其可以被前端调用。 作用暴露给前端:标记的函数可以通过 Tauri 的前端 API(如 JavaScript 的 invoke)调用。序列化/反序列化:自动处理参数和返回...

#[tauri::command] 是 Rust 中用于标记 Tauri 框架命令(command)的属性宏(attribute macro)。它的作用是将一个普通的 Rust 函数暴露给前端(如 JavaScript),使其可以被前端调用。

作用

  1. 暴露给前端:标记的函数可以通过 Tauri 的前端 API(如 JavaScript 的 invoke)调用。
  2. 序列化/反序列化:自动处理参数和返回值的序列化(使用 Serde)。
  3. 跨语言通信:作为 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

关键点

  1. 参数和返回值:必须实现 serde::Serializeserde::Deserialize(基本类型如 i32String 已自动实现)。
  2. 异步支持:如果需要异步,用 #[tauri::command] async fn foo() {},前端用 await invoke("foo")
  3. 错误处理:返回 Result<T, String> 可以向前端传递错误信息。

完整项目结构

src/
├── main.rs       # 注册命令和启动 Tauri
├── commands.rs   # 可选:分离命令定义
└── ...

通过这种方式,你可以安全地将 Rust 的强大功能暴露给前端,同时保持类型安全和跨语言通信的简洁性。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。