Rust Tauri:构建轻量高性能跨平台桌面应用

一、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 打包前置配置

  1. 替换 src\-tauri/icons 目录下的默认图标,支持 png/ico 格式

  2. 修改 tauri\.conf\.json 中的 productNameversionauthor 信息

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 插件开发、数据库集成、硬件设备调用、自动更新功能、多窗口管理、移动端适配编译等高级能力。

相关推荐
城市的稻草人VS1 小时前
rust【日志库】
前端·rust
Chase_______1 小时前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言
xwjalyf1 小时前
javascript数组 forEach,filter,some,every,map,find,reduce的用法与区别
开发语言·javascript·json·ecmascript
qq_2518364571 小时前
基于java Web 耗材购置与维修网络申报审批系统设计与实现
java·开发语言·前端
AI玫瑰助手1 小时前
Python函数:def定义函数与参数传递基础
android·开发语言·python
染翰1 小时前
Linux root用户安装配置Git
linux·git·后端
剑傲娇1 小时前
【计算机组成原理】 C与汇编的「对话」
服务器·开发语言·缓存
生活爱好者!1 小时前
用NAS进行漫画创作!一键部署Open WebUI
java·服务器·开发语言·安全·docker
charlie1145141911 小时前
现代C++特性指南(5)——RAII 深入理解:资源管理的基石
开发语言·c++·现代c++