tauri学习(3)-前端调用Rust代码
接上节继续,今天研究tauri中,前端如何调用Rust代码。
一、无返回值&无传参
main.rs中加1个hello方法:
然后在main方法中,参考下图暴露hello1:
Rust代码准备好之后,前端(假设是react框架)就能调用了:
import { invoke } from "@tauri-apps/api/tauri"
先引入invoke方法,然后在需要的地方:
运行效果:
二、有传参
/**
* 可传参
*/
#[tauri::command]
fn hello2(msg: String) {
println!("hello-2 {}!", msg);
}
多个方法暴露,参考下图:
前端调用:
<button onClick={() => invoke('hello2', { msg: "jimmy" })}>hello2</button>
三、有传参&有返回值
/**
* 有传参,带返回值
*/
#[tauri::command]
fn hello3(msg: String) -> String {
format!("hello-3 {}", msg)
}
前端调用:
let hello3 = (message: String) => {
invoke("hello3", { msg: message }).then((message) => console.log(message))
}
四、返回复杂对象
use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize)]
struct Person {
name: String,
age: i32,
} /**
* 返回复杂对象
*/
#[tauri::command]
fn get_person(name: String, age: i32) -> Result<Person, String> {
Ok(Person { name, age })
}
前端调用:
let get_person = (name: String, age: Number) => {
invoke("get_person", { name, age }).then((person) => console.log(person))
}
五、性能测试
很多功能,既然原生js与rust都能实现,谁的性能更高?
还是用经典的fibonacci做为示例:
/**
* 测试性能
*/
#[tauri::command]
fn fibonacci(n: i32) -> i32 {
if n <= 1 {
1
} else {
fibonacci(n - 1) + fibonacci(n - 2)
}
}
前端:
// js原生版的fibonacci (by:菩提树下的杨过 http://yjmyzz.cnblogs.com)
function fibonacci_js(n: number): number {
if (n <= 1) {
return 1;
}
return fibonacci_js(n - 2) + fibonacci_js(n - 1);
} function App() { //js版fibonacci测试
let js_test = (n: number) => {
let begin = new Date().getTime();
let result = fibonacci_js(n);
let end = new Date().getTime();
console.log(`fibonacci_js(${n})\t= ${result},\t执行时间: ${end - begin} ms`);
} //rust版fibonacci测试
let tauri_test = (n: number) => {
let begin = new Date().getTime();
invoke('fibonacci', { n }).then((result) => {
let end = new Date().getTime();
console.log(`fibonacci_tauri(${n})\t= ${result},\t执行时间: ${end - begin} ms`);
});
} ... <button onClick={() => js_test(38)}>fibonacci_js</button>
<button onClick={() => tauri_test(38)}>fibonacci_tauri</button>
... }
从输出耗时看,同样的硬件条件情况下,rust的实现,性能高于原生js,但略逊于wasm版本(可参见react+rust+webAssembly(wasm)示例 )
六、异常处理
Rust代码:
/**
* 异常处理
*/
#[tauri::command]
fn is_valid_age(age: i32) -> Result<String, String> {
if age > 0 && age < 150 {
Ok("pass".into())
} else {
Err(format!("age:{} invalid", age))
}
}
前端调用:
let is_valid_age = (age: Number) => {
invoke("is_valid_age", { age })
.then((msg) => console.log(msg))
.catch((err) => console.error(err))
}
七、Rust异步处理
/**
* 异步方法
*/
#[tauri::command]
async fn method_1() -> String {
println!("method_1 is called");
//内部再调用另1个异步方法
let result = method_2();
//这里不会block,会继续执行下一句
println!("do another thing in method_1");
//这里会阻塞,直到method_2返回
let result = result.await;
println!("method_2 result:{} from method_1", result);
//返回method_2的结果
result
} async fn method_2() -> String {
println!("method_2 is called");
//刻意停3秒【注:必须先use std::{thread, time};】
thread::sleep(time::Duration::from_secs(3));
format!("method_2 result")
}
前端调用时,并无特别之处,仍按promise的套路处理:
let async_test = () => {
invoke("method_1").then((result) => {
console.log("result:", result
);
})
}
Rust终端输出结果:
method_1 is called
do another thing in method_1
method_2 is called
method_2 result:method_2 result from method_1
八、访问tauri应用的window对象
#[tauri::command]
async fn get_window_label(window: tauri::Window) {
println!(
"Window: {},is_fullscreen:{:?}",
window.label(), //获取应用窗口的label
window.is_fullscreen() //获取应用是否全屏
);
}
九、state管理
注:这里的state可不是react组件的state,而是指tauri应用内部的状态,比如应用查询数据库前,要先判断下db的连接状态是否正常,就可以用上这个
struct DatabaseState {
connnted: bool,
} fn connect_db() -> DatabaseState {
DatabaseState { connnted: true }
} #[tauri::command]
fn query_data(state: tauri::State<DatabaseState>) {
assert_eq!(state.connnted, true);
println!("query data success")
}
这里我们定义了一个DatabaseState,然后在connect_db方法里,模拟连接上db后,将connected状态置成true,然后在query_data方法中,先判断db是否连上了。
在main方法中,就可以管理状态:
参考文章:
https://tauri.app/v1/guides/features/command
tauri学习(3)-前端调用Rust代码的更多相关文章
- 六、Android学习笔记_JNI_c调用java代码
1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...
- Android学习笔记_JNI_c调用java代码
1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...
- WebApi的前端调用
WebApi前端调用 HTML代码: <!DOCTYPE html><html> <head> <meta charset="utf-8" ...
- 1.JAVA中使用JNI调用C++代码学习笔记
Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI? Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...
- 从零开始,学习web前端之HTML5开发
什么是HTML5 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定.是下一代 HTML 标准. 为什么要学习HTML5 HTML5定义了一系列新元素,如新语义标签 ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- 独家分享——大牛教你如何学习Web前端开发
2014-12-18 14:35:42 引语 自从2008年接触网站开发以来到现在已经有六个年头了,今天偶然整理电脑资料看到当时为参加系里面一个比赛而做的第一个网站时,勾起了在这网站开发道路上 ...
- PL/SQL程序中调用Java代码(转)
主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- 如何高效的学习WEB前端
IT 行业的变化快是众人皆知的,需要持续去学习新的知识内容.但是,往往我们工作之后,经常发现学习的东西很少了,学习效率非常低,感觉自己到了一个瓶颈期,久而久之,就演变成『一年工作经验,重复去用十年』的 ...
随机推荐
- 37.1K star!MCP爆火后,这个AI模型全能工具箱开源项目让智能体开发更简单!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "Awesome MCP Servers 是当前最全面的模型上下文协议服务器集合, ...
- 记一次ASP.NET CORE线上内存溢出问题与dotnet-dump的排查方法
前言 这周系统更新了一个版本,部署到线上. 客户反馈整个系统全部都卡顿,随即我们上服务器检查 发现整个服务器内存竟然达到了20-30G的占用..如图: 其中有一个订单服务,独自占用13-18G内存, ...
- C#结构体布局规则
以下两个结构体,虽然字段完全一模一样,但因为Pack方式不同,导致它们实际占用内存大小是不一样的! [StructLayout(LayoutKind.Sequential,Pack =1)]//无填充 ...
- odoo16跨域问题解决办法--适用app端、web端、跨系统接口
Odoo的跨域问题: 由于浏览器的同源策略所引起的.同源策略是一种安全策略,它限制了一个源(协议.域名.端口)的文档或脚本如何与另一个源的资源进行交互. 如果两个源不同,则无法进行跨域交互.因此,如果 ...
- 转-Spring Data JPA中对象属性自动更新数据库
摘要:使用Spring Data JPA获取的对象,其属性变更后自动更新数据库问题排查与解决方案. §问题描述 使用继承了JpaRepository的Dao从数据库中获取到某个对象,然后操作这个对 ...
- [Java/Python] Java 基于命令行调用 Python
需求描述 利用 Java 基于命令行调用 Python 实现步骤 安装 Python + PIP 环境 以基于 Ubuntu 24 的 Docker 环境为例 Dockerfile # OS: Ubu ...
- 抖音主播选品到复盘:8款增长工具提升直播ROI
随着短视频和直播电商的快速崛起,抖音直播成为品牌和主播们争相布局的风口.想要在激烈的直播竞争中脱颖而出,主播不仅需要精准选品,更要借助多样的增长工具,提升直播的观众转化和最终ROI(投资回报率).本文 ...
- kubernetes网络组件calico详解
一.Calico介绍 Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack.Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Inte ...
- kubernetes之RBAC介绍
一.RBAC简单说明 在kubernetes中,授权有6种模式: ABAC(基于属性的访问控制) RBAC(基于角色的访问控制) Webhook Node AlwaysDeny(一直拒绝) Alway ...
- Scratch之Android的Animation动画的四种动画效果——透明度渐变动画
废话不多说,先上图为敬 效果演示 编写的程序展示 讲话开始: 怎么想到的 在平时上课的时候,有一个学生拿着他好基友写的游戏程序给我看,最开始写的原型是叫虚像的积木块程序.通过一个局部变量开关控制虚像是 ...