Tauri 入门教程

news2024/11/27 18:47:45

在这里插入图片描述

Tauri入门教程

  • 1 简介
  • 2 创建Tauri项目(页面基于Vue)
    • 2.1 环境准备
    • 2.2 创建工程
  • 3 Tauri 工程目录介绍
  • 4 页面调用rust方法
  • 5 事件系统
  • 6 HTTP请求
  • 7 文件系统
  • 8 对话框
  • 9 窗口配置
  • 10 打包

1 简介

Tauri:构建跨平台的快速、安全、前端隔离应用。Tauri 是一个相对较新的框架,允许您利用基本的 Web 技术和 Rust 编程语言快速创建跨平台应用程序。Tauri 基于 Rust 构建,在设计上具有安全性和高性能,与任何前端框架兼容,并允许您为所有主要桌面平台(包括 macOSWindowsLinux 操作系统)创建可执行应用程序。

每个 Tauri 应用程序都包含一个核心进程,作为应用程序的入口点,并且是唯一可以完全访问操作系统的组件。然而,核心进程并不呈现实际的应用程序界面;相反,它会启动使用操作系统提供的 WebView 库的子进程,从而可以使用 Web 技术构建 Tauri 应用程序。

Electron 不同,它使用 Chromium 引擎打包和呈现您的应用程序,而不管底层操作系统如何,Tauri 使用操作系统的 WebView 库。Tauri 方法的优点是 WebView 库不包含在最终的可执行文件中,而是在运行时动态链接,这大大降低了捆绑应用程序的大小和性能。

如前所述,Tauri 应用程序由于其 webview 方法而比 Electron 应用程序轻得多。事实上,使用 Electron 构建的重量超过 52MB 的示例应用程序在使用 Tauri 构建时会轻得多,大约 3MB。

Tauri 框架的其他一些主要优势包括:

  • 更好的性能:Tauri 应用程序在性能、启动时间和内存消耗方面也优于 Electron 应用程序
  • 自更新器:Tauri 包含一个自更新器功能,您可以在不依赖任何第三方库的情况下快速将其集成到您的应用程序中
  • 跨平台:当然,您可以为所有主要桌面操作系统生成可执行文件

2 创建Tauri项目(页面基于Vue)

2.1 环境准备

大家需要根据自己的开发环境预先准备下,操作参考官网文档:预先准备

2.2 创建工程

控制台执行:

npm create tauri-app

然后输入项目名称,会自动生成目录,选择包管理工具,选择UI模板,这里我选择Vue,还可以选择react 等前端模板框架:
在这里插入图片描述
创建完成后,进入到对应目录,安装依赖,再运行tarui

npm install
npm run tauri dev

经过编译后就自动弹出程序的窗口,里面的页面就是Vue构建的页面:
在这里插入图片描述

3 Tauri 工程目录介绍

在这里插入图片描述
整个目录结构其实跟vue项目目录很像,只是多了一个src-tauri目录,这个目录是 Tauri 项目配置目录,里面包含了程序的图标 、rust源码、构建后的文件、tauri配置文件。我们在写软件的过程中,有遇到前端不能解决的问题,一般是通过调用rust程序来解决。所以在做一些高级功能的时候我们需要会一点rust知识。

4 页面调用rust方法

src-tauri/src/main.rs 中加入前端要调用的方法:

#[tauri::command]
fn my_custom_command() {
  println!("I was invoked from JS!");
}

// Also in main.rs
fn main() {
  tauri::Builder::default()
    // This is where you pass in your commands
    .invoke_handler(tauri::generate_handler![my_custom_command])
    .run(tauri::generate_context!())
    .expect("failed to run app");
}

前端调用,可以写在前端的某个事件调用方法里:

// When using the Tauri API npm package:
import { invoke } from '@tauri-apps/api/tauri'

// Invoke the command
invoke('my_custom_command')

传参数和返回参数:

#[tauri::command]
fn my_custom_command(invoke_message: String) -> String {
  println!("I was invoked from JS, with this message: {}", invoke_message);
  invoke_message
}

注意:rust定义参数的时候使用下划线,js调用的时候使用驼峰命名。

invoke('my_custom_command', { invokeMessage: 'Hello!' }).then((message) => console.log(message))

invoke返回的是Promise ,可以使用 async/await 用同步的方式写。

5 事件系统

前端触发并监听方法:

import { invoke } from "@tauri-apps/api/tauri";
import { listen } from '@tauri-apps/api/event'

const unlisten = async () => {
  await invoke('init_process'); // 调用rust任务
  await listen('my-event', event => { // 监听事件
    console.log(event)
  })
}
</script>
<template>
  <button @click="unlisten">开启事件监听</button>
</template>

rust 发送事件方法:

use tauri::Window;
use std::{thread, time};

#[derive(Clone, serde::Serialize)]
struct Payload {
  message: String,
}

#[tauri::command]
fn init_process(window: Window) {
  std::thread::spawn(move || {
    loop { // 循环触发
      window.emit("my-event", Payload { message: "Tauri is awesome!".into() }).unwrap(); // 前端自动解析为对象
      thread::sleep(time::Duration::from_millis(1000)); // 每隔一秒执行
    }
  });
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![init_process])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

6 HTTP请求

使用 tauri 访问HTTP请求需要在tauri.conf.json设置白名单:

{
  "tauri": {
    "allowlist": {
      "http": {
        "all": true, // enable all http APIs
        "request": true // enable HTTP request API
      }
    }
  }
}

但是这样写不安全,建议仅将您使用的 API 列入白名单,以获得最佳的安装包大小和安全性。

{
  "tauri": {
    "allowlist": {
      "http": {
        "scope": ["https://api.github.com/repos/tauri-apps/*"]
      }
    }
  }
}

前端使用:

import { fetch } from '@tauri-apps/api/http';
const response = await fetch('http://localhost:3003/users/2', {
  method: 'GET',
  timeout: 30,
  responseType: 2  // 1-JSON 2-Text 3-Binary
});

7 文件系统

{
  "tauri": {
    "allowlist": {
      "fs": {
        "scope": ["$APPDATA/databases/*"]
      }
    }
  }
}

此作用域配置仅允许访问 $APPDATA 目录的数据库文件夹中的文件,注意 $APPDATA 变量的使用。该值在运行时注入,解析为应用程序数据目录。可用的变量是:

  • $APPCONFIG => C:\Users\15114\AppData\Roaming\com.tauri.dev\
  • $APPDATA => C:\Users\15114\AppData\Roaming\com.tauri.dev\
  • $APPLOCALDATA => C:\Users\15114\AppData\Local\com.tauri.dev\
  • $APPCACHE => C:\Users\15114\AppData\Local\com.tauri.dev\
  • $APPLOG => C:\Users\15114\AppData\Roaming\com.tauri.dev\logs\
  • $AUDIO => C:\Users\15114\Music\
  • $CACHE => C:\Users\15114\AppData\Local\
  • $CONFIG => C:\Users\15114\AppData\Roaming\
  • $DATA => C:\Users\15114\AppData\Roaming\
  • $LOCALDATA => C:\Users\15114\AppData\Local\
  • $DESKTOP => C:\Users\15114\Desktop\
  • $DOCUMENT => C:\Users\15114\Documents\
  • $DOWNLOAD => C:\Users\15114\Downloads\
  • $EXE,
  • $FONT,
  • $HOME => C:\Users\15114\
  • $PICTURE => C:\Users\15114\Pictures\
  • $PUBLIC => C:\Users\Public\
  • $RUNTIME,
  • $TEMPLATE => C:\Users\15114\AppData\Roaming\Microsoft\Windows\Templates\
  • $VIDEO => C:\Users\15114\Videos\
  • $RESOURCE => \?\F:\project\demo\rust\tauri-demo\src-tauri\target\debug\
  • $APP, 即将弃用
  • $LOG, 即将弃用
  • $TEMP
import { copyFile,createDir, BaseDirectory } from '@tauri-apps/api/fs';

// Copy the `$APPCONFIG/app.conf` file to `$APPCONFIG/app.conf.bk`
await copyFile('app.conf', 'app.conf.bk', { dir: BaseDirectory.AppConfig });
// Create the `$APPDATA/users` directory
await createDir('users', { dir: BaseDirectory.AppData, recursive: true });

8 对话框

添加 tauri.allowlist.dialogtauri.conf.json

{
  "tauri": {
    "allowlist": {
      "dialog": {
        "all": true, // enable all dialog APIs
        "open": true, // enable file open API
        "save": true // enable file save API
      }
    }
  }
}
import { ask } from '@tauri-apps/api/dialog';
const yes = await ask('Are you sure?', 'Tauri');
const yes2 = await ask('This action cannot be reverted. Are you sure?', { title: 'Tauri', type: 'warning' });

9 窗口配置

tauri.config.json 中关于窗口的主要配置:

{
  "tauri": {
    "windows": [
      {
      	"center": true, // 窗口显示在屏幕中间
      	"x": 100, // 窗口显示x坐标
      	"y": 100, // 窗口显示y坐标
        "fullscreen": false, // 是否全屏
        "height": 600, // 窗口高度
        "width": 800, // 窗口宽度
        "resizable": true, // 是否可以resize
        "title": "Tauri App", // 窗口标题
        "decorations": true // 是否显示边框和状态栏
      }
    ]
  }
}

10 打包

修改 tauri.config.jsontauri.bundle.identifier ,这是一个唯一标识,可以为软件的名称。
控制台执行命令:

npm run tauri build

这个命令会先编译前端项目,相当于先执行 npm run build 编译出前端静态文件到 dist 目录:
在这里插入图片描述
然后回编译 rust 组件,最后生成一个 msi 安装文件:
在这里插入图片描述
这个文件在windows系统可以直接双击安装,最后显示界面和开发界面是一样的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apollo 应用与源码分析:Monitor监控-硬件监控-CAN监控

目录 基本概念 CAN Card CAN - 原始套接字 ESD CAN 监控分析 Socket Can监控分析 基本概念 CAN Card 首先需要直到CAN的一些基本的概念。 CAN 是Controller Area Network 的缩写&#xff08;以下称为CAN&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。在汽车产…

Elastic Stack 环境配置与框架简介

目录 简介 什么是Elastic Stack Elasticasearch Logstash Kibana Beats 框架图 下载 配置 一、安装java环境 启动 Elasticsearch Kibana FileBeat Logstash 测验 简介 什么是Elastic Stack Elastic Stack缩写为elk&#xff0c;它由三个软件组成&#xff1a;E…

唯品会:高利润,慢增长?

配图来自Canva可画 近日&#xff0c;阿里、京东等互联网大厂纷纷发布了新一季度的财报&#xff0c;从其财报不难看出&#xff0c;国内头部电商平台已经告别了一路狂奔的时代&#xff0c;开始愈发稳健起来。唯品会虽然在体量和规模上都还不能和这两家巨头相比&#xff0c;但自其…

36、Java——吃货联盟订餐系统(JDBC+MySQL+Apache DBUtils)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

关于物联网你需要知道的一切

如果你想要一个更像 wiki &#xff08;维基百科&#xff09;的定义「什么是物联网&#xff1f;」&#xff0c;我们可以将其视为连接到 Internet 的全球对象网络&#xff0c;这些对象能够在没有人为干预的情况下&#xff0c;相互交互和交换数据。符合这一的一般定义的解决方案&a…

Java项目:基于jsp+sevlet+mysql日记系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目主要功能有&#xff1a; 写日记 查看日记 日记删除 日记修改 日记类别添加 日记类别修改 日记类别删除 个人信息查看 个人信息修改 分页…

java刷题day 05

一. 单选题&#xff1a; 解析&#xff1a; 5 >> 2 相当于 5除于2两次&#xff0c;等于1>>> 表示无符号右移&#xff0c;高位用 0 填充&#xff0c;0001右移两位 0000&#xff0c;所以选A解析&#xff1a;作对这道题的关键是要理解Java的值传递&#xff0c;关于值…

婚纱租赁系统毕业设计,婚纱租赁管理系统设计与实现,论文毕设作品参考

功能清单 【后台管理员功能】 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 资讯分类&#xff1a;录入、修改、查看、删除资讯分类 录入…

【Milvus的以文搜图】

0. 介绍 以文搜图指的是&#xff0c;根据文本描述&#xff0c;从图像数据库中检索与文本内容相似的图像数据并返回。通过在CSDN中搜索以文搜图&#xff0c;找到了如下两篇文章&#xff1a; 从零到一&#xff0c;教你搭建「以文搜图」搜索服务&#xff08;一&#xff09;_Zill…

Linux “挂载” 的概念

0、前言 截至到写这个稿子&#xff0c;始终对挂载的概念有点模糊&#xff0c;到底是硬盘挂载到目录&#xff1f;还是目录挂载到硬盘呢&#xff1f;今天终于从《鸟哥的Linux私房菜》中推断出了答案&#xff0c;而且也恍然大悟地理解了之前书中一句晦涩难懂的话。 1、挂载的概念…

基于Web的Markdown编辑器HedgeDoc

什么是 HedgeDoc &#xff1f; HedgeDoc 是一个开源的、基于 web 的、自托管的、协作的markdown编辑器。您可以使用它轻松地在笔记、图形甚至演示文稿上进行实时协作。用户需要做的就是将你的笔记链接分享给同事&#xff0c;他们就可以开始使用了。 不想自己搭建可以试试官方的…

基于有偏距离权值双线性插值原理(Weighted bilinear with warping)的图像超分辨重构研究-附Matlab程序

⭕⭕ 目 录 ⭕⭕✳️ 一、图像超分辨率重构原理✳️ 二、双线性插值重构理论与实验分析✳️ 2.1 双线性插值理论与实验验证✳️ 2.2 有偏距离双线性插值重构理论与实验验证✳️ 2.3 权重双线性插值理论与实验验证✳️ 2.4 有偏距离权值双线性插值理论与实验验证✳️ 三、参考文…

frps内网穿透

1 原理讲解 frp工作原理 服务端运行&#xff0c;监听一个主端口&#xff0c;等待客户端的连接&#xff1b; 客户端连接到服务端的主端口&#xff0c;同时告诉服务端要监听的端口和转发类型&#xff1b;服务端fork新的进程监听客户端指定的端口&#xff1b; 外网用户连接到客户…

2012-2020中国地区银行多指标数据

1、数据来源&#xff1a;bankscope 2、时间跨度&#xff1a;2012-2020-3季度 3、区域范围&#xff1a;中国 4、指标说明&#xff1a; 包含以下数据&#xff1a; 资产负债表&#xff0c;利润表&#xff0c;流动性表&#xff0c;资本充足率表&#xff0c;财务比率 global s…

java 高级面试题(借鉴)

谈谈ConcurrentHashMap的扩容机制 1.7版本 1. 1.7版本的ConcurrentHashMap是基于Segment分段实现的 2. 每个Segment相对于⼀个⼩型的HashMap 3. 每个Segment内部会进⾏扩容&#xff0c;和HashMap的扩容逻辑类似 4. 先⽣成新的数组&#xff0c;然后转移元素到新数组中 5. 扩容的…

vue3 antd项目实战——table表格(一文带你快速实现后台管理系统最常用的table表格)

零基础filter实现最简单的table表格知识调用核心干货下期预告关键字模糊查找&#xff08;纯前端&#xff09;关键字模糊查找&#xff08;前后交互&#xff09;知识调用 功能实现可能要用到的知识&#xff1a;vue3ant design vuets实战【ant-design-vue组件库引入】vue3项目实战…

超纯水如何除硼,除硼树脂技术分析

硼在超纯水中对晶圆厂的产品良品率的影响&#xff0c;那超纯水深度除硼的方式有哪些呢&#xff0c;在现今新型的微电子、太阳能等行业中&#xff0c;对超纯水的要求越来越高&#xff0c;对超纯水设备中PPb的硼和硅要求达到PPb级。但硼和硅属于弱电离元素&#xff0c;在水中不易…

泛型类的认识 - (了解数据结构的基础)

文章目录前言1. 为什么使用泛型类&#xff1f;2. 泛型类介绍总结前言 本篇通过介绍为什么使用泛型类&#xff0c;什么是泛型类&#xff0c;进一步为以后数据结构的学习打下基础。如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff0…

【强化学习论文合集】IJCAI-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

户外运动耳机推荐、这几款性能超强的户外运动耳机不可错过

在户外跑步的时候&#xff0c;也有不少朋友会选择戴上耳机&#xff0c;用音乐来”调味“&#xff0c;让跑步的过程不那么枯燥乏味。凡事有利就有弊&#xff0c;跑步时听音乐也如此&#xff0c;它的弊端之一是可能会有安全隐患。如果跑步时耳机音量开得太大&#xff0c;可能会忽…