Tauri:跨平台探索之旅

news2024/12/26 11:38:37

一、简介

  Tauri 是一个跨平台 GUI 框架,与 Electron 的思想基本类似。都是属于跨平台技术的解决方案

1737f4e90d0a8c1c27a9be2d19f64210.png

优缺点快速分析

  我们一般会把tauri作为 Electron 的替代方案,electron优点咱们不看,这里就提两个electron比较明显的问题:

  1. 安装包大小。Electron 应用程序需要内置 Chromium 渲染引擎和 Node.js 环境,导致项目安装包很大。

  2. 资源占用。Electron 占用较高的 CPU 和内存资源,作为小型的工具类项目应用,用户体验会不太友好。

  3. 启动时间稍显长。

  Tauri 作为一种使用 Rust 和 Web 技术栈构建跨平台桌面应用的框架。这里也分析一下它的几个优点和缺点:

  • 优点

  1. 高性能:Tauri 使用 Rust 语言编写底层代码,具有内存安全、高性能和并发性等优点。

  2. 跨平台支持:Tauri 支持多个平台,如 Windows、macOS 和 Linux,可以帮助开发者轻松地构建跨平台的应用。

  3. 小安装包:由于 Tauri 应用程序使用原生控件和 Web 技术结合的方式,因此安装包相对较小。

  4. 启用时间较短。

  5. 安全性:使用操作系统的原生 GUI 控件来创建应用程序界面,从而提高了应用程序的可访问性和安全性。

  • 缺点

  1. 学习成本:由于 Tauri 使用 Rust 和 Web 技术进行开发,因此需要具备一定的 Rust 和 Web 开发经验,对于新手开发者来说可能需要一定的学习成本。

  2. 社区规模:相比于其他框架,Tauri 的社区规模还相对较小,可能需要开发者自行解决一些问题。

  3. 可维护性:Tauri 尚处于快速发展阶段,可能存在 API 变动和不稳定的情况。以及webview也会有一些本身自带的兼容性问题等等。

cac4b40d94c6a2b8852fadfc817d257b.png
对比Tauri和Electron

  总的来说,Tauri 是一种非常有潜力的框架,它可以帮助开发者快速构建高性能、跨平台的桌面应用。但是,它也存在一些学习成本和可维护性等方面的问题,需要开发者在选型的时候有更多的思考。

二、使用教程

2.1 环境准备(以mac环境为例)

  其他环境的可以参考官方教学文档,在此不做赘述

  1. 安装 CLang 和 macOS 开发依赖项

xcode-select --install
  1. 安装Rust

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

2.2 构建项目

  使用 pnpm 创建项目

pnpm create tauri-app
fe49f26756db1def80d5e5aba7d4bb4e.png

  选择完你熟悉的项目配置后,执行提示的内容,运行项目,会自动在桌面弹出初始化的窗口

92b4bbda96182a8fc451b02be2e4ae13.png

2.3 项目构成

b607bfcc2756d5e24ec001fd1a8eb86a.png
  • dist:web项目打包编译目录

  • src:vue前端页面代码(渲染进程)

  • src-tauri:rust相关(主进程)

2.4 完善项目配置

  完成项目内容后,我们可以在 tauri.conf.json 文件中配置 Webview 的选项,包括 Webview 库的版本、窗口大小、窗口样式、窗口标题、用户代理字符串等。182bb52db39b235474fa61cf36150995.png

2.5 打包

pnpm tauri build

  直接执行打包会直接报个错18284f8b2c04ca23d2d8f1f67b533bd3.png  将tauri.conf.js的默认配置修改为build

9ed2a68e137be7973bd7d14443b8aeb6.png  再次执行打包就好了,然后直接安装使用

ebb1b06bb60556c96982c07c3516e05d.png

  到此为止,我们体验了一把使用 Tauri 开发桌面端应用的流程。可以感知到,它对前端开发者是比较友好的,但是如果想深入掌握它,需要学习 Rust。

三、整体构成

  Tauri主要基于以下几个关键技术:

  1. Rust

  2. Web技术

  3. Webview

  整体结构大致长这样👇🏻ab90c724fea2a1197ad6201eb28e41b0.png

  • 在 Tauri 架构中,Rust 应用程序是整个系统的核心,它提供了 Tauri API 的实现。通过tauri api让 Rust 应用程序与 WebView 和 Web 内容进行交互。

  • WebView 是一个通用的 Web 容器,通常基于底层平台的内置 Web 技术实现,例如:macOS 上的 WKWebView 和 Windows 上的 Edge WebView。WebView 用于加载 Web 内容,使其可以显示在原生桌面应用程序中。

  • Web 内容是在 WebView 中加载的 HTML、CSS 和 JavaScript 代码。Tauri 可以加载远程 Web 内容,也可以加载本地 Web 内容,例如打包在原生应用程序中的 Web 资源。

  通过这个架构,Tauri 提供了一种快速创建跨平台原生桌面应用程序的方法,充分利用了 Rust 的性能和 Web 技术的灵活性。那么,接下来简单讲一下这三块都有哪些内容。

3.1  Rust

  1. 语言

      Tauri的核心是使用 Rust 语言编写的。在 Tauri 中,Rust 代码用于调用本地操作系统的 API,实现应用的后端逻辑,并与前端 Web 技术进行交互。Rust的一些主要特性包括:

  • 内存安全:Rust 的所有权系统可以有效避免内存泄漏和空指针等问题,确保程序在运行时不会发生崩溃。

  • 线程安全:Rust 的并发模型允许开发者编写线程安全的代码,可以在多核处理器上并行执行,提高应用的性能。

  • 高性能:Rust 的编译器会在编译时进行优化,生成的二进制文件具有很好的性能表现。

  • 易于与其他语言交互:Rust 支持与其他语言进行交互,例如与 JavaScript 进行交互,这在 Tauri 中非常重要。

  • 除了上述特性,Rust 还有其他很多特性和优点,如代码可读性、错误处理、模式匹配等,这些特性在 Tauri 中也会得到充分的发挥。

  总之,Tauri 的 Rust 代码是实现其核心功能的关键,使用 Rust 可以有效避免一些常见的安全漏洞,并且可以保证应用具有高性能、可靠性和扩展性。

  1. 库的使用

  Tauri 使用了多个 Rust 库,主要包括以下几个方面:

  • 底层平台库:Tauri 使用了多个底层平台库,包括 winapi(Windows 平台)、cocoa(macOS 平台)、gtk(Linux 平台)等,这些库提供了与操作系统交互的接口,使得 Tauri 可以在不同的平台上实现一致的行为,达到抹平差异的目的。

  • Webview 库:Tauri 使用了多个 Webview 库,包括 webview, wry, cef, tao, nwjs 等,不同的平台使用不同的 Webview 库。这些库提供了在 Rust 代码中嵌入 Webview 的能力,使得 Tauri 可以在桌面应用中集成 Web 技术。

  • 异步编程库:Tauri 使用了 async-std 库来实现异步编程。这个库提供了基于 async/await 的异步编程模型,使得 Tauri 可以使用 Rust 的强类型和安全性,同时又能够处理异步操作。

  • 序列化和反序列化库:Tauri 使用了 serde 库来进行数据的序列化和反序列化。这个库提供了基于属性宏的序列化和反序列化方式,使得 Tauri 可以方便地在 JavaScript 和 Rust 之间传递数据。

  • 日志库:Tauri 使用了 env_logger 库来进行日志记录。这个库提供了一种灵活的日志记录方式,使得 Tauri 可以在开发和调试时方便地记录日志。

  • 其他库:除了上述库之外,Tauri 还使用了其他一些 Rust 库,包括 lazy_static(懒加载静态变量库)、serde_json(JSON 序列化和反序列化库)、walkdir(遍历目录和文件库)等,这些库提供了丰富的功能,使得 Tauri 可以实现更加复杂的功能。

3.2  Web

  在Tauri中,Web技术主要用于两个方面:一是创建应用程序的UI界面,二是通过Webview与Rust代码通信。

  先看看创建界面:我们可以使用HTML、CSS和JavaScript来创建应用程序的UI界面,也能够集成当前所有Web项目里头(包括React、Vue、Angular等等)。

2cf284454196e4aa8b72087725a24369.png

  接下来看看如何让Webview与Rust代码通信。

定义Tauri事件

  可以写在main.rs里

#[tauri::command]
fn hello(name: String) -> String {
  format!("Hello, {}!", name)
}

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

  在上面的代码中,我们定义了一个hello函数,并使用tauri::command宏将其注册为一个Tauri事件。该函数接受一个名为name的字符串参数,并返回一个格式化的问候语

在JavaScript代码中发送事件

  在JavaScript代码中,我们可以使用window.tauri.invoke方法来发送一个Tauri事件。例如,我们可以编写以下代码来调用Rust中的hello事件:

window.tauri.invoke('hello', { name: 'Alice' })
  .then(response => {
    console.log(response); // 输出 "Hello, Alice!"
  });

3.3  Webview

  在Tauri中,Webview是负责渲染应用程序UI的核心组件。具体来说,Webview是一个用于显示网页内容的窗口,类似于浏览器中的标签页。Tauri使用Webview作为应用程序的UI引擎,并使用Rust和JavaScript代码来控制UI的行为。

  Tauri使用了一些第三方的Webview引擎,例如:webview、wry 和 cocoa webview。这些Webview引擎为Tauri提供了不同的支持平台和不同的性能特征。

  另外,Tauri提供了一组Rust API,可以用于与Webview进行交互,例如:

  • tauri::window: 用于与当前窗口进行交互。

  • tauri::event: 用于发送事件到Webview。

  • tauri::menu: 用于在Webview中创建菜单。

  除了使用Rust API之外,我们还可以使用JavaScript代码与Webview进行交互。例如,我们可以使用以下代码在JavaScript代码中获取Webview的引用:

const webview = window.tauri.promisified({
  cmd: 'getWebview'
});

  当我们获取了Webview的引用之后,我们可以使用JavaScript API来控制Webview的行为,例如:

  • webview.addEventListener: 监听Webview事件。

  • webview.postMessage: 向Webview发送消息。

  • webview.executeJavaScript: 在Webview中执行JavaScript代码。

  通过使用这些API,我们可以实现高度自定义的UI界面,同时也可以方便地与Rust代码进行通信和交互。

四、资源 & 文档

  • Tauri官方文档 - https://tauri.app/

  • Awesome Tauri(精选的 Tauri 生态系统和社区中最好的东西,包含插件和应用,可以借鉴和学习) -  http://github.com/tauri-apps/awesome-tauri。

  • Tauri issues(Tauri问答)- http://github.com/tauri-apps/tauri/issues

  • Tauri discussions(Tauri讨论社区) - http://github.com/tauri-apps/tauri/discussions

  • Rust 编程语言基本语法学习- http://doc.rust-lang.org/book/

  • crates.io(Rust生态的包管理网站) - http://doc.rust-lang.org/book/

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

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

相关文章

高考志愿填报的个人看法,希望能对你有所启发

各省高考成绩已出,又到一年高考季。张雪峰提到:“普通家庭不要光谈理想,也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么? 作为一名过来人,今天就站在小部分群体的角度来聊聊&…

自动化测试常见的三大问题及解决方案

各位小伙伴们,大家好,今天给大家带来的是关于自动化测试常见的三大问题及解决方案,希望给遇到这三大问题的你一些帮助 一,就是我们定位元素的时候,定位不到或有时定位得到,有时定位不到。 特别是喜欢复制…

策略模式(Strategy)

定义 策略是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。 前言 1. 问题 你打算为游客们创建一款导游程序。该程序的核心功能是提供美观的地图,以帮助用户在任何城市…

数据结构 手撕顺序表(动态版)+代码详解

⭐️ 顺序表介绍 顺序表是线性表的一种。 🌠什么是线性表呢? 线性表是数据结构的一种,一个线性表是 n n n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列、字符串… 🌠什么是顺序表呢&…

Docker + Wasm = 王炸!!!

Docker 宣布推出与 WebAssembly 集成 (DockerWasm) 的首个技术预览版,并表示公司已加入字节码联盟 (Bytecode Alliance),成为投票成员。 Bytecode Alliance(字节码联盟)由 Mozilla、Fastly、Intel 与 Red Hat 联合成立&#xff0c…

Redis的优化(二)

Redis的高可用 一、主从复制优化主从复制的作用主从复制流程主从复制实验 二、Redis 哨兵模式哨兵模式的作用故障转移机制主节点的选举原则哨兵模式的实验 三、Redis群集模式集群的作用Redis集群的数据分片搭建Redis群集模式实验 ●主从复制:主从复制是高可用Redis的…

路由协议基本术语

文章目录 1、自治系统AS2、EGP和IGP3、度量标准和度量值4、管理距离5、路由协议与路由算法6、路由环路问题 1、自治系统AS Internet中,自治系统就是处于同一个管理机构(如一个ISP)控制下的路由器和网络群组 在同一个自治系统中的所有路由器…

Python3 标准库概览 | 菜鸟教程(十八)

目录 一、Python3 标准库中的模块 (一)os 模块 (二)sys 模块 (三)time 模块 (四)datetime 模块 (五)random 模块 (六)math 模块…

RabbitMQ笔记(持续更新中~)

1.消息队列 1.1 MQ的相关概念 1.1.1 什么是MQ MQ(message queue),从字面上看,本质是个队列,FIFO先进先出,只不过队列中存放的内容是消息而已,还是一种跨进程的通信机制,用于上下游…

Pandas之Series(一)

Hi😊😊~大家好呀~最近两天釉色酱在学习python中的数据分析的一个基本库——pandas。今天就先学习pandas中最基本的数据结构Series。下面我们一起进入Series的世界吧!😝 Pandas简介: Pandas是一种基于Python语言的快速…

sklearn.model_selection模块介绍

数据集划分方法 train_test_split train_test_split(*arrays, test_sizeNone, train_sizeNone, random_stateNone, shuffleTrue, stratifyNone)参数包括: test_size:可选参数,表示测试集的大小。可以是一个表示比例的浮点数(例…

Android:ViewPager2

简介 ViewPager2内部使用RecyclerView实现,并提供了增强功能 特性 支持水平、垂直方向布局 android:orientation “vertical” 支持从右到左 android:layoutDirection “rtl” 禁止滑动 setUserInputEnabled() 可修改Fragment集合 对可修改的Fragment集合进行分…

深入探究Bean生命周期的扩展点:Bean Post Processor

概要 在Spring框架中,Bean生命周期的管理是非常重要的一部分。在Bean的创建、初始化和销毁过程中,Spring提供了一系列的扩展点,使开发者能够在不破坏原有功能的基础上,对Bean的生命周期进行定制化操作。其中,Bean Post…

LLM记录202304-202306

RLHF RAFT RAFT: Reward rAnked FineTuning for Generative Foundation Model Alignment code RRHF RRHF: Rank Responses to Align Language Models with Human Feedback without tears code p i = ∑ t lo

English Learning - L3 作业打卡 Lesson7 Day53 2023.6.28 周三

English Learning - L3 作业打卡 Lesson7 Day53 2023.6.28 周三 引言🍉句1: It was this moment that I asked myself that life-defining question:成分划分同化连读爆破语调 🍉句2: If my life were a book and I were the author, how would I want t…

基于Web的小学学科数字教学资源管理系统

摘要 小学学科数字教学资源管理是一个典型的学习项目,从教学资源、教材信息的统计和分析,在过程中会产生大量的、各种各样的数据。本文以小学学科数字教学资源管理系统为目标,采用B/S模式,以Springboot为开发框架,java…

计算机网络面经之TCP三次握手和四次挥手的详解

常见问题 1.详细描述三次握手和四次挥手的过程。 2.三次握手可以变成两次握手吗? 3.简述 TCP 连接和关闭的状态转移。 4.简述TCP 四次挥手的 TIME_WAIT状态,以及为什么需要有这个状态 重要的字段定义与作用 (1)序号(sequence nu…

循环双链表

目录 双向循环链表结构体初始化函数添加数据头插删除数据显示函数示例程序一(简易版本):运行结果:示例程序二输出结果: 双向循环链表 结构图示: 结构体 typedef struct node {int data;struct node* pre; //指向前驱struct …

C++迭代器

目录 1.iterator 2.数组 1.iterator 迭代器就是个内置指针&#xff0c;可以 -- &#xff0c;可以解引用。 迭代器分两种类型 iterator 和const_iterator&#xff08;只读&#xff0c;不能修改&#xff09; 迭代器要用作用域限定类型 vector<int>::iterator it; 如果不限制…

Yarn的实现原理详解

概要 Yarn作为分布式集群的资源调度框架&#xff0c;它的出现伴随着Hadoop的发展&#xff0c;使Hadoop从一个单一的大数据计算引擎&#xff0c;成为一个集存储、计算、资源管理为一体的完整大数据平台&#xff0c;进而发展出自己的生态体系&#xff0c;成为大数据的代名词。 Ya…