一、Tauri 框架核心概述
1.1 什么是 Tauri
Tauri 是一款基于 Rust 后端 + 前端 Web 技术的轻量级跨平台桌面应用开发框架,支持 Windows、macOS、Linux 三大主流桌面系统,同时兼容移动端编译。开发者可以使用 Vue、React、Svelte 等任意前端框架编写界面,通过 Rust 实现底层逻辑、系统调用、性能计算,最终打包生成体积极小、安全性极高的桌面客户端。
不同于传统 Electron 框架,Tauri 最大的核心优势是不内置浏览器内核,而是直接调用系统原生 WebView 渲染页面,彻底解决了 Electron 应用体积臃肿、内存占用高、启动速度慢的痛点。
1.2 Tauri vs Electron 核心对比
为了让大家直观理解 Tauri 的优势,这里整理了两款主流桌面框架的核心差异,也是目前开发者首选 Tauri 的核心原因:
安装包体积:Electron 空项目约 100MB+,Tauri 空项目仅 2-5MB,压缩后体积更小
内存占用:Electron 启动常驻内存 100MB+,Tauri 基础内存占用不足 20MB
安全性能:Tauri 基于 Rust 内存安全机制,默认权限隔离,可精细化控制系统调用;Electron 权限宽泛,漏洞风险更高
启动速度:Tauri 毫秒级启动,Electron 普遍存在数百毫秒启动延迟
底层性能:Tauri 核心逻辑由 Rust 编写,支持高性能并发、文件处理、硬件调用,远超 Node.js 底层的 Electron
1.3 适用开发场景
Tauri 并非替代所有桌面开发方案,其最佳适用场景如下:
需要轻量、快速启动的日常工具类桌面软件
需要底层高性能计算、文件批量处理、系统权限调用的应用
跨平台统一迭代,不想维护多端原生代码的项目
对软件安全性、内存占用有严格要求的企业级工具
二、全平台开发环境搭建
Tauri 开发依赖 Rust 编译环境、前端运行环境以及系统原生依赖,以下是 Windows、macOS、Linux 通用搭建流程,适配最新 Tauri 2.x 版本。
2.1 基础依赖安装
2.1.1 安装 Rust
Rust 是 Tauri 的核心底层依赖,必须优先安装,官方推荐使用 rustup 工具链:
Windows / macOS / Linux 统一安装命令:
curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shWindows 用户也可直接访问 Rust 官网 下载安装包。
安装完成后,执行以下命令验证是否安装成功,并切换稳定工具链:
rustc--versioncargo--versionrustup default stable2.1.2 安装前端环境
Tauri 依赖 Node.js 管理前端项目,推荐安装 Node.js 18.x 及以上 LTS 版本,安装完成后验证:
node-vnpm-v2.1.3 系统专属依赖
Windows:安装 Visual Studio 生成工具,勾选「桌面开发使用 C++」组件
macOS:安装 Xcode 命令行工具,执行
xcode\-select \-\-installLinux:执行
sudo apt install libwebkit2gtk\-4\.0\-dev build\-essential安装系统依赖
2.2 安装 Tauri 脚手架
通过 npm 全局安装 Tauri 官方脚手架,用于快速创建项目:
npminstall-g@tauri-apps/cli验证脚手架安装:
tauri--version三、创建第一个 Tauri 项目 & 目录解析
3.1 初始化项目
Tauri 支持搭配 Vue、React、Vanilla JS 等前端框架,本文以Vue3 + TypeScript为例(最主流企业级方案):
# 创建项目npmcreate tauri-app@latest tauri-demo# 按照提示选择配置# 1. 项目名称:默认即可# 2. 前端框架:Vue# 3. 语言:TypeScript# 4. 是否启用 ESLint:按需开启进入项目并安装依赖、启动开发环境:
cdtauri-demonpminstallnpmrun tauri dev执行成功后,会自动编译 Rust 后端、启动前端服务,最终弹出原生桌面窗口,第一个 Tauri 应用运行成功。
3.2 核心目录结构详解
Tauri 项目分为前端层和后端 Rust 层两大模块,核心目录如下:
tauri-demo/ ├── src/ # 前端 Vue 源码目录 ├── src-tauri/ # Tauri Rust 后端核心目录 │ ├── src/ │ │ ├── main.rs # 后端入口文件,应用初始化逻辑 │ │ └── lib.rs # 核心命令、功能逻辑编写处 │ ├── tauri.conf.json # Tauri 全局配置文件(权限、窗口、打包配置) │ └── Cargo.toml # Rust 依赖管理文件 ├── package.json # 前端脚本、依赖配置 └── vite.config.ts # 前端打包配置3.3 核心配置文件说明
tauri.conf.json是 Tauri 项目的核心配置文件,掌控应用所有核心能力,常用配置项:
productName:应用打包后的软件名称version:应用版本号windows:窗口尺寸、标题、无边框、置顶等配置allowlist:系统权限白名单(文件读写、弹窗、shell 调用等)bundle:打包配置(图标、安装包格式、权限声明)
四、核心核心:前后端双向通信(实战代码)
Tauri 开发的核心逻辑是前端负责界面展示,Rust 负责底层业务,两者通过「命令调用 + 事件监听」实现双向通信,这是 Tauri 开发的必备知识点。
4.1 前端调用 Rust 函数(核心:Tauri Command)
Rust 端通过\#\[tauri::command\]宏定义可被前端调用的函数,前端通过invokeAPI 异步调用,支持参数传递、返回值接收。
4.1.1 Rust 端编写命令
修改src\-tauri/src/lib\.rs,编写自定义业务命令,包含传参、返回值、错误处理:
// 引入核心依赖usetauri::command;useserde::Serialize;// 定义可序列化结构体,用于前后端结构化数据传输#[derive(Serialize)]#[serde(crate ="tauri::serde")]pubstructUserInfo{pubname:String,pubage:u32,pubmsg:String}/// 简单传参命令:问候函数#[command]pubfngreet(name:&str)->String{format!("Hello {}!欢迎使用 Tauri 开发",name)}/// 结构化数据返回命令#[command]pubfnget_user_info(name:String,age:u32)->UserInfo{UserInfo{name:name.clone(),age,msg:format!("用户 {} 信息加载成功",name)}}/// 带错误返回的命令(实战常用)#[command]pubfncalc_num(a:i32,b:i32)->Result<i32,String>{ifb==0{returnErr("除数不能为0".to_string());}Ok(a/b)}// 应用入口配置#[cfg_attr(mobile, tauri::mobile_entry_point)]pubfnrun(){tauri::Builder::default()// 注册所有自定义命令.invoke_handler(tauri::generate_handler![greet,get_user_info,calc_num]).run(tauri::generate_context!()).expect("tauri 应用启动失败");}4.1.2 前端调用 Rust 命令
修改前端src/App\.vue,通过 Tauri 官方 API 调用后端函数,处理返回结果与异常:
<template> <div class="demo"> <h3>Tauri 前后端通信实战</h3> <button @click="handleGreet">调用简单问候接口</button> <p>{{ greetText }}</p> <button @click="handleUserInfo">获取结构化用户数据</button> <p>{{ userText }}</p> <button @click="handleCalc">执行除法计算(异常测试)</button> <p>{{ calcText }}</p> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; // 引入 tauri 调用核心 API import { invoke } from '@tauri-apps/api/core'; // 定义响应式数据 const greetText = ref(''); const userText = ref(''); const calcText = ref(''); // 1. 调用简单传参 Rust 命令 const handleGreet = async () => { const res = await invoke<string>('greet', { name: 'Tauri 开发者' }); greetText.value = res; }; // 2. 获取结构化数据 const handleUserInfo = async () => { interface UserInfo { name: string; age: number; msg: string; } const res = await invoke<UserInfo>('get_user_info', { name: '张三', age: 25 }); userText.value = `${res.msg},姓名:${res.name},年龄:${res.age}`; }; // 3. 异常捕获实战 const handleCalc = async () => { try { // 故意传参触发除数为0错误 const res = await invoke<number>('calc_num', { a: 10, b: 0 }); calcText.value = `计算结果:${res}`; } catch (err) { calcText.value = `计算失败:${err}`; } }; </script>4.2 Rust 向前端推送事件(反向通信)
实际开发中,常需要 Rust 后端完成耗时操作后,主动向前端推送数据(如文件批量处理进度、后台任务状态),Tauri 提供事件监听机制实现该能力。
4.2.1 Rust 端发送事件
在lib\.rs中新增耗时任务命令,执行过程中向前端推送进度事件:
usestd::thread;usestd::time::Duration;usetauri::Window;/// 耗时任务,向前端推送进度#[command]pubfnlong_task(window:Window){// 模拟 5 步耗时任务foriin1..=5{// 向前端发送 progress 事件,携带进度数据window.emit("task_progress",Some(format!("当前进度:{}0%",i))).unwrap();// 模拟任务延迟thread::sleep(Duration::from_secs(1));}// 任务完成事件window.emit("task_finish",Some("任务执行完成!")).unwrap();}同时在generate\_handler中注册该命令:
.invoke_handler(tauri::generate_handler![greet,get_user_info,calc_num,long_task])4.2.2 前端监听后端事件
在App\.vue中添加事件监听逻辑,实时接收后端推送数据:
<template> <div class="demo"> <button @click="startLongTask">启动后端耗时任务</button> <p>{{ taskProgress }}</p> </div> </template> <script setup lang="ts"> import { ref, onMounted, onUnmounted } from 'vue'; import { invoke, listen } from '@tauri-apps/api/core'; const taskProgress = ref(''); // 存储事件监听器,组件销毁时取消监听(防止内存泄漏) let progressListener: Awaited<ReturnType<typeof listen>> | null = null; // 挂载时注册事件监听 onMounted(async () => { // 监听后端推送的进度事件 progressListener = await listen('task_progress', (event) => { taskProgress.value = event.payload as string; }); // 监听任务完成事件 await listen('task_finish', (event) => { taskProgress.value = event.payload as string; }); }); // 启动后端耗时任务 const startLongTask = async () => { taskProgress.value = '任务启动中...'; await invoke('long_task'); }; // 组件销毁时移除监听 onUnmounted(() => { progressListener?.unlisten(); }); </script>五、高频实战功能开发
本节讲解 Tauri 项目中最常用的系统功能,包含文件读写、系统弹窗、窗口自定义,全部为企业级可直接复用代码。
5.1 系统弹窗提示(确认框、消息框)
Tauri 提供原生系统弹窗插件,无需前端模拟,体验更接近原生应用。首先开启权限,修改tauri\.conf\.json:
{"tauri":{"allowlist":{"dialog":{"all":true}}}}前端调用弹窗 API:
import{message,confirm}from'@tauri-apps/api/dialog';// 消息提示弹窗constshowMsg=async()=>{awaitmessage('操作成功!','提示');};// 确认弹窗constshowConfirm=async()=>{constres=awaitconfirm('确定要执行该操作吗?','确认提示');if(res){awaitmessage('你点击了确定');}};5.2 本地文件读写功能
文件操作是桌面工具核心能力,Tauri 提供官方文件插件,支持跨平台文件读写、创建、删除。
第一步:修改src\-tauri/Cargo\.toml引入文件插件依赖:
tauri-plugin-fs = "2.0"第二步:在lib\.rs初始化插件:
pubfnrun(){tauri::Builder::default().plugin(tauri_plugin_fs::init())// 注册文件插件.invoke_handler(tauri::generate_handler![...]).run(tauri::generate_context!()).expect("应用启动失败");}第三步:前端实现文件写入与读取:
import{writeTextFile,readTextFile,BaseDirectory}from'@tauri-apps/api/fs';// 写入本地文件constwriteFile=async()=>{awaitwriteTextFile('test.txt','Hello Tauri 文件读写测试',{dir:BaseDirectory.Desktop}// 保存到桌面);awaitmessage('文件写入成功,已保存到桌面');};// 读取本地文件constreadFile=async()=>{constcontent=awaitreadTextFile('test.txt',{dir:BaseDirectory.Desktop});awaitmessage(`文件内容:${content}`);};5.3 自定义窗口样式(无边框、置顶、尺寸)
通过tauri\.conf\.json可快速配置窗口原生属性,实现自定义桌面窗口效果:
{"tauri":{"windows":[{"title":"Tauri 实战工具","width":800,"height":600,"resizable":true,"alwaysOnTop":false,"decorations":true,// 关闭则为无边框窗口"transparent":false}]}}六、项目打包与跨平台发布
Tauri 支持一键打包 Windows、macOS、Linux 安装包,打包前可自定义软件图标、版本、版权信息。
6.1 打包前置配置
替换
src\-tauri/icons目录下的默认图标,支持 png/ico 格式修改
tauri\.conf\.json中的productName、version、author信息
6.2 执行打包命令
# 开发环境调试打包npmrun tauri build--debug# 生产环境正式打包(压缩优化)npmrun tauri build打包完成后,安装包会生成在src\-tauri/target/release/bundle目录下,包含 exe 安装包、免安装绿色版、mac dmg、linux deb 等格式文件。
七、进阶优化与避坑拓展
7.1 权限精细化管理
Tauri 默认关闭所有系统权限,生产环境禁止开启 all:true 全局权限,需按需开启,提升软件安全性:
"allowlist":{"dialog":{"open":true,"message":true},"fs":{"readFile":true,"writeFile":true},"shell":{"open":false}}7.2 性能优化技巧
耗时任务后置 Rust:所有文件处理、循环计算、网络请求耗时逻辑全部放在 Rust 端,避免前端卡顿
事件防抖处理:高频推送的后端事件,前端增加防抖逻辑,避免页面频繁渲染
打包压缩优化:开启 Tauri 打包压缩,移除无用调试代码,进一步缩小包体积
7.3 常见问题避坑
开发环境报错:优先检查 Rust 工具链、Node 版本是否匹配,重新执行
npm install修复依赖前后端参数报错:确保 Rust 结构体添加
\#\[serde\]序列化宏,前后端参数类型严格对应打包失败:检查系统依赖是否完整,Windows 需确保安装 C++ 编译工具
权限失效:修改权限配置后,需重启
tauri dev环境才能生效
八、总结
本文完整讲解了 Tauri 框架从环境搭建、项目创建、前后端通信、常用功能开发到打包发布的全流程,通过可直接复用的实战代码,实现了轻量化跨平台桌面应用的基础开发能力。
相比传统桌面开发方案,Tauri 结合了 Web 快速开发的优势和 Rust 高性能、高安全的底层能力,是目前轻量级跨平台桌面工具开发的最优解之一。
后续进阶学习方向:Tauri 插件开发、数据库集成、硬件设备调用、自动更新功能、多窗口管理、移动端适配编译等高级能力。