一、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 统一安装命令:
bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Windows 用户也可直接访问 Rust 官网 下载安装包。
安装完成后,执行以下命令验证是否安装成功,并切换稳定工具链:
bash
rustc --version
cargo --version
rustup default stable
2.1.2 安装前端环境
Tauri 依赖 Node.js 管理前端项目,推荐安装 Node.js 18.x 及以上 LTS 版本,安装完成后验证:
bash
node -v
npm -v
2.1.3 系统专属依赖
-
Windows:安装 Visual Studio 生成工具,勾选「桌面开发使用 C++」组件
-
macOS :安装 Xcode 命令行工具,执行
xcode\-select \-\-install -
Linux :执行
sudo apt install libwebkit2gtk\-4\.0\-dev build\-essential安装系统依赖
2.2 安装 Tauri 脚手架
通过 npm 全局安装 Tauri 官方脚手架,用于快速创建项目:
bash
npm install -g @tauri-apps/cli
验证脚手架安装:
bash
tauri --version
三、创建第一个 Tauri 项目 & 目录解析
3.1 初始化项目
Tauri 支持搭配 Vue、React、Vanilla JS 等前端框架,本文以Vue3 + TypeScript 为例(最主流企业级方案):
bash
# 创建项目
npm create tauri-app@latest tauri-demo
# 按照提示选择配置
# 1. 项目名称:默认即可
# 2. 前端框架:Vue
# 3. 语言:TypeScript
# 4. 是否启用 ESLint:按需开启
进入项目并安装依赖、启动开发环境:
bash
cd tauri-demo
npm install
npm run tauri dev
执行成功后,会自动编译 Rust 后端、启动前端服务,最终弹出原生桌面窗口,第一个 Tauri 应用运行成功。
3.2 核心目录结构详解
Tauri 项目分为前端层 和后端 Rust 层两大模块,核心目录如下:
plain
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\]宏定义可被前端调用的函数,前端通过 invoke API 异步调用,支持参数传递、返回值接收。
4.1.1 Rust 端编写命令
修改 src\-tauri/src/lib\.rs,编写自定义业务命令,包含传参、返回值、错误处理:
rust
// 引入核心依赖
use tauri::command;
use serde::Serialize;
// 定义可序列化结构体,用于前后端结构化数据传输
#[derive(Serialize)]
#[serde(crate = "tauri::serde")]
pub struct UserInfo {
pub name: String,
pub age: u32,
pub msg: String
}
/// 简单传参命令:问候函数
#[command]
pub fn greet(name: &str) -> String {
format!("Hello {}!欢迎使用 Tauri 开发", name)
}
/// 结构化数据返回命令
#[command]
pub fn get_user_info(name: String, age: u32) -> UserInfo {
UserInfo {
name: name.clone(),
age,
msg: format!("用户 {} 信息加载成功", name)
}
}
/// 带错误返回的命令(实战常用)
#[command]
pub fn calc_num(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err("除数不能为0".to_string());
}
Ok(a / b)
}
// 应用入口配置
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
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 调用后端函数,处理返回结果与异常:
vue
<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 中新增耗时任务命令,执行过程中向前端推送进度事件:
rust
use std::thread;
use std::time::Duration;
use tauri::Window;
/// 耗时任务,向前端推送进度
#[command]
pub fn long_task(window: Window) {
// 模拟 5 步耗时任务
for i in 1..=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 中注册该命令:
rust
.invoke_handler(tauri::generate_handler![greet, get_user_info, calc_num, long_task])
4.2.2 前端监听后端事件
在 App\.vue 中添加事件监听逻辑,实时接收后端推送数据:
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:
json
{
"tauri": {
"allowlist": {
"dialog": {
"all": true
}
}
}
}
前端调用弹窗 API:
ts
import { message, confirm } from '@tauri-apps/api/dialog';
// 消息提示弹窗
const showMsg = async () => {
await message('操作成功!', '提示');
};
// 确认弹窗
const showConfirm = async () => {
const res = await confirm('确定要执行该操作吗?', '确认提示');
if (res) {
await message('你点击了确定');
}
};
5.2 本地文件读写功能
文件操作是桌面工具核心能力,Tauri 提供官方文件插件,支持跨平台文件读写、创建、删除。
第一步:修改 src\-tauri/Cargo\.toml 引入文件插件依赖:
toml
tauri-plugin-fs = "2.0"
第二步:在 lib\.rs 初始化插件:
rust
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_fs::init()) // 注册文件插件
.invoke_handler(tauri::generate_handler![...])
.run(tauri::generate_context!())
.expect("应用启动失败");
}
第三步:前端实现文件写入与读取:
ts
import { writeTextFile, readTextFile, BaseDirectory } from '@tauri-apps/api/fs';
// 写入本地文件
const writeFile = async () => {
await writeTextFile(
'test.txt',
'Hello Tauri 文件读写测试',
{ dir: BaseDirectory.Desktop } // 保存到桌面
);
await message('文件写入成功,已保存到桌面');
};
// 读取本地文件
const readFile = async () => {
const content = await readTextFile('test.txt', { dir: BaseDirectory.Desktop });
await message(`文件内容:${content}`);
};
5.3 自定义窗口样式(无边框、置顶、尺寸)
通过 tauri\.conf\.json 可快速配置窗口原生属性,实现自定义桌面窗口效果:
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 执行打包命令
bash
# 开发环境调试打包
npm run tauri build --debug
# 生产环境正式打包(压缩优化)
npm run tauri build
打包完成后,安装包会生成在 src\-tauri/target/release/bundle 目录下,包含 exe 安装包、免安装绿色版、mac dmg、linux deb 等格式文件。
七、进阶优化与避坑拓展
7.1 权限精细化管理
Tauri 默认关闭所有系统权限,生产环境禁止开启 all:true 全局权限,需按需开启,提升软件安全性:
json
"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 插件开发、数据库集成、硬件设备调用、自动更新功能、多窗口管理、移动端适配编译等高级能力。