Tauri2學習筆記

教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from=333.788.player.switch&vd_source=707ec8983cc32e6e065d5496a7f79ee6
官方指引:https://tauri.app/zh-cn/start/

目前Tauri2的教程視頻不多,我按照Tauri1的教程來學習,轉成Tauri2


一、Tauri2 安裝

  1. 安裝win系統依賴,Microsoft C++

https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/

在這里插入圖片描述
2. 若沒有的,要安裝WebView2
下載并安裝“常青獨立安裝程序(Evergreen Bootstrapper)

https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?form=MA13LH#download

在這里插入圖片描述
3. 安裝Rust

https://www.rust-lang.org/zh-CN/tools/install

在這里插入圖片描述

打開,選擇1,進行默認安裝
安裝完成后,輸入 rustc --version和cargo --version來驗證
配置cargo環境變量
PATH里,加入%USERPROFILE%.cargo\bin

  1. 安裝nodejs

https://nodejs.org/zh-cn

驗證是否安裝成功:
node -v
npm -v

nodejs環境變量配置
Path中輸入nodejs的地址,比如C:\Program Files\nodejs\

  1. 安裝Android,若要導出Android App的話
    下載Android Studio

https://developer.android.com/studio?hl=zh-cn

確保安裝了以下內容
Android SDK Platform
Android SDK Platform-Tools
NDK (Side by side)
Android SDK Build-Tools
Android SDK Command-line Tools

配置 ANDROID_HOME 和 NDK_HOME 環境變量
Path中添加
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\tools\bin
%NDK_HOME%

輸入adb --version 驗證


二、建立工程

  1. 在文件夾下,放入.npmrc文件,幫助鏡像代理
registry=https://registry.npmmirror.com/
disturl=https://registry.npmmirror.com/-/binary/node
electron_mirror=https://npmmirror.com/mirrors/electron/
electron-builder-binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/
  1. 進入cmd,輸入
npm create tauri-app@latest
  1. 安裝配置過程
    在這里插入圖片描述
  • 填寫項目名,選擇前端代碼
    在這里插入圖片描述
  1. 下載完畢,用vscode打開
  • 拷貝.npmrc
  • 執行npm i 安裝插件
  • 執行npm run tauri dev
    在這里插入圖片描述

三、工程介紹

在這里插入圖片描述

  • 各目錄的說明
    tauri-app/
    ├── src/ # 前端源代碼(Vue/React/Svelte 等)
    ├── src-tauri/ # Tauri 后端(Rust 代碼)
    ├── public/ # 靜態資源(圖片、字體等)
    ├── node_modules/ # 前端依賴
    ├── target/ # Rust 編譯輸出(自動生成)
    ├── dist/ # 前端構建輸出(自動生成)
    ├── package.json # 前端項目配置
    ├── vite.config.js # Vite 配置
    └── index.html # 前端入口 HTML

  • tauri.conf.json,用于配置窗口信息


四、頁面調用rust方法

https://tauri.app/zh-cn/develop/calling-rust/

  1. 調用rust函數
  • 前端:
import { invoke } from "@tauri-apps/api/core"; //獲取接口函數 invoke// 通過異步的方式調用greet函數,并傳遞參數,參數以鍵值對傳遞
async function greet() {// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/greetMsg.value = await invoke("greet", { name: name.value });
}
  • Rust端:
#[tauri::command]
fn greet(name: &str) -> String {format!("Hello, {}! You've been greeted from Rust!", name)
}#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {tauri::Builder::default().plugin(tauri_plugin_opener::init()).invoke_handler(tauri::generate_handler![greet]) // 綁定greet函數.run(tauri::generate_context!()).expect("error while running tauri application");
}
  1. 同步的方式
  • 前端
invoke('login', { user: 'tauri', password: '0j4rijw8=' }).then((message) => console.log(message)).catch((error) => console.error(error));
  • rust端
#[tauri::command]
fn login(user: String, password: String) -> Result<String, String> {if user == "tauri" && password == "tauri" {// resolveOk("logged_in".to_string())} else {// rejectErr("invalid credentials".to_string())}
}

五、事件系統(雙工消息)

  1. 前端發送
  • 前端emit事件,是更簡單的通訊方式,沒有返回值;
import { emit } from '@tauri-apps/api/event';
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow';// emit(eventName, payload)
emit('file-selected', '/path/to/file'); //全局發送const appWebview = getCurrentWebviewWindow();
appWebview.emit('route-changed', { url: window.location.href }); //指定窗口發送
  • 觸發特定監聽事件的emitTo發送
import { emitTo } from '@tauri-apps/api/event';
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow';// emitTo(webviewLabel, eventName, payload)
emitTo('settings', 'settings-update-requested', {key: 'notification',value: 'all',
});const appWebview = getCurrentWebviewWindow();
appWebview.emitTo('editor', 'file-changed', {path: '/path/to/file',contents: 'file contents',
});
  1. Rust接收
  • 全局接收
use tauri::Manager;fn main() {tauri::Builder::default().setup(|app| {// 監聽全局事件app.listen_global("global-event", |event| {println!("Received global event: {:?}", event.payload());// 可解析數據(需 serde)if let Some(payload) = event.payload() {println!("Parsed payload: {}", payload);}});Ok(())}).run(tauri::generate_context!()).expect("Failed to run Tauri");
}
  • 特定窗口接收
use tauri::Window;fn main() {tauri::Builder::default().setup(|app| {// 獲取目標窗口(假設標簽為 "secondary")let secondary_window = app.get_window("secondary").unwrap();secondary_window.listen("window-specific-event", |event| {println!("Received window-specific event: {:?}", event.payload());});Ok(())}).run(tauri::generate_context!()).expect("Failed to run Tauri");
}

emit有全局發送與特定窗口發送,還有emitTo的寫法

  1. rust端發送
  • 全局事件
use tauri::Manager;fn main() {tauri::Builder::default().setup(|app| {// 發送全局事件(所有前端窗口都能接收)app.emit_all("rust-to-frontend", "Hello from Rust").unwrap();Ok(())}).run(tauri::generate_context!()).expect("Failed to run Tauri");
}
  • 定向窗口發送
use tauri::Window;fn main() {tauri::Builder::default().setup(|app| {// 獲取指定窗口(假設窗口標簽為 "main")let main_window = app.get_window("main").unwrap();// 發送到特定窗口main_window.emit("rust-to-specific-window", "Data for main window").unwrap();Ok(())}).run(tauri::generate_context!()).expect("Failed to run Tauri");
}
  • 發送復雜數據
use serde::Serialize;#[derive(Serialize)]
struct CustomData {message: String,count: i32,
}fn main() {tauri::Builder::default().setup(|app| {let data = CustomData {message: "Dynamic data".into(),count: 42,};app.emit_all("structured-event", &data).unwrap();Ok(())}).run(tauri::generate_context!()).expect("Failed to run Tauri");
}
  1. 前端監聽事件
  • 全局監聽
import { listen } from '@tauri-apps/api/event';
import { onMounted } from 'vue';onMounted(() => {// 監聽全局事件listen('rust-to-frontend', (event) => {console.log('Received:', event.payload); // 輸出: "Hello from Rust"});
});
  • 定向窗口監聽
import { getCurrent } from '@tauri-apps/api/window';
import { onMounted } from 'vue';const currentWindow = getCurrent();onMounted(() => {// 監聽當前窗口的事件currentWindow.listen('rust-to-specific-window', (event) => {console.log('Window-specific data:', event.payload);});
});
  • 監聽Json數據
import { listen } from '@tauri-apps/api/event';listen('structured-event', (event) => {console.log('Message:', event.payload.message); // "Dynamic data"console.log('Count:', event.payload.count);    // 42
});

六、Http請求

使用http請求,需要先配置tarui.conf.json,把能訪問的網址加入白名單
此舉讓軟件安全性提高很多,對比electron,就很有優勢
在這里插入圖片描述


七、文件操作

  • tauri需要先配置tarui.conf.json,包括文件的操作權限和操作目錄
  • 前端才能操作文件,但是前端沒有絕對目錄的操作能力;想操作絕對目錄,需要用rust編寫
    在這里插入圖片描述
  • 另外tarui要配置下資源目錄,這樣打包的時候,資源目錄才會打包在一起

在這里插入圖片描述

  • 通過引入
import { readBinaryFile, BaseDirectory } from '@tauri-apps/api/fs';

實現文件的操作
在這里插入圖片描述

在一代api里有相關資料,在二代的插件里也有相關資料
https://tauri.app/zh-cn/plugin/file-system/


八、本地文件的Url獲取

  • 需要進行安全策略配置,在tauri.conf.json中,配置安全策略的頭格式
    在這里插入圖片描述
  • 需要配置允許的目錄
    在這里插入圖片描述
  • 前端寫法
    在這里插入圖片描述
  • 獲取assetUrl的正確路徑
    在這里插入圖片描述
  • 最后把這個變量賦給img的src屬性就可以了

九、dialog對話框

  • 這里調用的是系統的對話框,有5種
    在這里插入圖片描述
  • 需要在tauri.conf.json里配置api開放,教程里設置了全部開發
  • 前端
    在這里插入圖片描述
  • 選擇文件夾
    在這里插入圖片描述

以上的一些API,可能需要進入到tauri1里面去看


十、自定義窗口的配置

https://tauri.app/zh-cn/learn/window-customization/

  • 上面的地址,可以在前端,通過css、html,模擬一個標題欄目

https://v1.tauri.app/v1/api/config#windowsconfig

  • 這個地址可以配置tauri.config.json來設置窗口的大小

十一、系統托盤

  • 通過配置,配置系統托盤
    在這里插入圖片描述

https://tauri.app/zh-cn/learn/system-tray/

  • 關于系統托盤的說明,制作托盤有Js前端定義,和Rust后端定義2種類型
  • 看我們的功能是在后端比較多,還是前端比較多

十二、開屏界面

https://tauri.app/zh-cn/learn/splashscreen/

  • 教程通過增加一個窗口,并把主窗口隱藏,在rust里寫了隱藏開屏窗口和打開主窗口的函數,通過前端,調用此函數來實現
  • 窗口的html文件,放在public里面
  • 窗口可以通過label來得到

十三、多窗口

在這里插入圖片描述

  • 可以通過前端,來新建,設置新窗口的各項屬性
  • 也可以在tarui.conf.json里把窗口先定義好,通過前端顯示此窗口
  • 教程提示,vue的路徑使用,可能需要加#好

十四、導出

  • 運行npm run tauri build,過程中出現需要下載的文件
  • 教程里會讓放在C:/用戶…/AppData 下面
  • 另外一種方式是通過注冊表
配置系統變量
TAURI_NSIS_DIR
D:\TauriSDK\NSIS配置系統變量
變量名:WIX
變量值:解壓目錄的路徑(例如:C:\wix)
同時,將解壓目錄中的bin文件夾添加到PATH環境變量中:
在系統變量中找到Path,點擊編輯。
添加一個新的條目:%WIX%\bin(或者直接寫絕對路徑,如C:\wix\bin)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84594.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL進階之旅 Day 26:分庫分表環境中的SQL策略

【SQL進階之旅 Day 26】分庫分表環境中的SQL策略 文章簡述 隨著業務規模的擴大&#xff0c;單一數據庫難以承載海量數據與高并發訪問。分庫分表成為解決這一問題的關鍵手段&#xff0c;但同時也帶來了 SQL 查詢復雜度的顯著提升。本文作為“SQL進階之旅”系列的第26天內容&…

linux之 內存管理(6)-arm64 內核虛擬地址空間變化

一、新內核變動 kernel變化的真快&#xff0c;之前我記得4.x的內核的內核空間的線性映射區位于內核空間的高地址處的128TB&#xff0c;且當前的博客和一些書籍也都還是這樣介紹。可翻了翻kernel的Documentation/arm64/memory.rst文檔&#xff0c;發現最新的kernel已將這128TB移…

循環神經網絡(RNN):從理論到翻譯

循環神經網絡&#xff08;RNN&#xff09;是一種專為處理序列數據設計的神經網絡&#xff0c;如時間序列、自然語言或語音。與傳統的全連接神經網絡不同&#xff0c;RNN具有"記憶"功能&#xff0c;通過循環傳遞信息&#xff0c;使其特別適合需要考慮上下文或順序的任…

window批處理文件(.bat),用來清理git的master分支

echo off chcp 65001 > nul setlocal enabledelayedexpansionecho 正在檢查Git倉庫... git rev-parse --is-inside-work-tree >nul 2>&1 if %errorlevel% neq 0 (echo 錯誤&#xff1a;當前目錄不是Git倉庫&#xff01;pauseexit /b 1 )echo 警告&#xff1a;這將…

C#中的CLR屬性、依賴屬性與附加屬性

CLR屬性的主要特征 封裝性&#xff1a; 隱藏字段的實現細節 提供對字段的受控訪問 訪問控制&#xff1a; 可單獨設置get/set訪問器的可見性 可創建只讀或只寫屬性 計算屬性&#xff1a; 可以在getter中執行計算邏輯 不需要直接對應一個字段 驗證邏輯&#xff1a; 可以…

【mysql】聯合索引和單列索引的區別

區別核心&#xff1a;聯合索引可加速多個字段組合查詢&#xff0c;單列索引只能加速一個字段。 &#x1f539;聯合索引&#xff08;復合索引&#xff09; INDEX(col1, col2, col3)適用范圍&#xff1a; WHERE col1 ... ? WHERE col1 ... AND col2 ... ? WHERE col1 ..…

如何用 HTML 展示計算機代碼

原文&#xff1a;如何用 HTML 展示計算機代碼 | w3cschool筆記 &#xff08;請勿將文章標記為付費&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 在編程學習和文檔編寫過程中&#xff0c;清晰地展示代碼是一項關鍵技能。HTML 作為網頁開發的基礎語言&#x…

大模型筆記_模型微調

1. 大模型微調的概念 大模型微調&#xff08;Fine-tuning&#xff09;是指在預訓練大語言模型&#xff08;如GPT、BERT、LLaMA等&#xff09;的基礎上&#xff0c;針對特定任務或領域&#xff0c;使用小量的目標領域數據對模型進行進一步訓練&#xff0c;使其更好地適配具體應…

React Native UI 框架與動畫系統:打造專業移動應用界面

React Native UI 框架與動畫系統&#xff1a;打造專業移動應用界面 關鍵要點 UI 框架加速開發&#xff1a;NativeBase、React Native Paper、UI Kitten 和 Tailwind-RN 提供預構建組件&#xff0c;幫助開發者快速創建美觀、一致的界面。動畫提升體驗&#xff1a;React Native…

在QT中使用OpenGL

參考資料&#xff1a; 主頁 - LearnOpenGL CN https://blog.csdn.net/qq_40120946/category_12566573.html 由于OpenGL的大多數實現都是由顯卡廠商編寫的&#xff0c;當產生一個bug時通常可以通過升級顯卡驅動來解決。 OpenGL中的名詞解釋 OpenGL 上下文&#xff08;Conte…

Qt::QueuedConnection詳解

在多線程編程中&#xff0c;線程間的通信是一個關鍵問題。Qt框架提供了強大的信號和槽機制來處理線程通信&#xff0c;其中Qt::QueuedConnection是一種非常有用的連接類型。本文將深入探討Qt::QueuedConnection的原理、使用場景及注意事項。 一、基本概念 Qt::QueuedConnecti…

X86 OpenHarmony5.1.0系統移植與安裝

近期在研究X86鴻蒙,通過一段時間的研究終于成功了,在X86機器上成功啟動了openharmony系統了.下面做個總結和分享 1. 下載源碼 獲取OpenHarmony標準系統源碼 repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v5.1.0-Release --no-repo-ve…

如何診斷服務器硬盤故障?出現硬盤故障如何處理比較好?

當服務器硬盤出現故障時&#xff0c;及時診斷問題并采取正確的處理方法至關重要。硬盤故障可能導致數據丟失和系統不穩定&#xff0c;影響服務器的正常運行。以下是診斷服務器硬盤故障并處理的最佳實踐&#xff1a; 診斷服務器硬盤故障的步驟 1. 監控警報 硬盤監控工具&#…

vue3提供的hook和通常的函數有什么區別

Vue 3 提供的 hook&#xff08;組合式函數&#xff09; 和普通函數在使用場景、功能和設計目的上有明顯區別&#xff0c;它們是 Vue 3 組合式 API 的核心概念。下面從幾個關鍵維度分析它們的差異&#xff1a; 1. 設計目的不同 Hook&#xff08;組合式函數&#xff09; 專為 Vu…

Spark提交流程

bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn ./examples/jars/spark-examples_2.12-3.3.1.jar 10 這一句命令實際上是 啟動一個Java程序 java org.apache.spark.deploy.SparkSubmit 并將命令行參數解析到這個類的對應屬性上 因為master給…

Microsoft Copilot Studio - 嘗試一下Agent

1.簡單介紹 Microsoft Copilot Studio以前的名字是Power Virtual Agent(簡稱PVA)。Power Virutal Agent是2019年出現的&#xff0c;是低代碼平臺Power Platform的一部分。當時Generative AI還沒有出現&#xff0c;但是基于已有的Conversation AI技術&#xff0c;即Microsoft L…

【源碼剖析】2-搭建kafka源碼環境

在上篇文章kafka核心概念中&#xff0c;解釋了kafka的核心概念&#xff0c;下面開始進行kafka源碼編譯。為什么學習源碼需要進行源碼編譯呢&#xff0c;我認為主要有兩點&#xff1a; 可以進行debug&#xff0c;跟蹤代碼執行邏輯可以對源碼改動&#xff0c;強化學習學習效果 …

小紅書視頻圖文提取:采集+CV的實戰手記

項目說明&#xff1a;這波視頻&#xff0c;值不值得采&#xff1f; 你有沒有遇到過這樣的場景&#xff1f;老板說&#xff1a;“我們得看看最近小紅書上關于‘旅行’的視頻都說了些什么。”團隊做數據分析的&#xff0c;立馬傻眼&#xff1a;官網打不開、接口抓不著、視頻不能…

Cloudflare 從 Nginx 到 Pingora:性能、效率與安全的全面升級

在互聯網的快速發展中&#xff0c;高性能、高效率和高安全性的網絡服務成為了各大互聯網基礎設施提供商的核心追求。Cloudflare 作為全球領先的互聯網安全和基礎設施公司&#xff0c;近期做出了一個重大技術決策&#xff1a;棄用長期使用的 Nginx&#xff0c;轉而采用其內部開發…

從編輯到安全設置: 如何滿足專業文檔PDF處理需求

隨著數字化辦公的發展&#xff0c;PDF 已成為跨平臺文檔交互的標準格式。無論是在日常辦公、學術研究&#xff0c;還是項目協作中&#xff0c;對 PDF 文件進行高效編輯與管理的需求日益增長。功能全面、操作流暢且無額外負擔的 PDF 編輯工具&#xff0c;它是一款在功能上可與 A…