1. Tauri 概念与架构

1.1 一句话定义

Tauri = Web UI + Rust 后端 + 系统原生WebView + 安全IPC + 插件生态

  • Web UI:用熟悉的React/Vue/Svelte等前端技术开发界面
  • Rust后端:处理系统调用、硬件通信、数据计算和业务逻辑
  • 系统WebView:使用操作系统自带的浏览器渲染引擎,不打包Chromium
  • 安全IPC:前后端通过异步消息通信,严格的权限控制
  • 插件生态:官方提供文件、串口、网络、数据库等常用能力

术语解释

  • 前端:用户直接看到和交互的界面部分,运行在浏览器环境中
  • 后端:处理逻辑、系统调用和硬件通信的部分,运行在操作系统层面
  • WebView:操作系统提供的浏览器组件,用于渲染HTML/CSS/JS
  • IPC:进程间通信,前端和后端是两个独立进程,通过IPC交换数据

1.2 核心架构:多进程模型

Tauri采用类似现代浏览器的多进程架构,将UI渲染和系统能力严格隔离,这是其安全性的基础。

Core进程(后端)

Core进程是Tauri应用的"主控板",也是唯一拥有完整操作系统访问权限的部分。它负责:

  • 创建和管理窗口、托盘、菜单
  • 处理文件读写、串口通信、网络请求
  • 管理数据库连接和全局状态
  • 执行系统命令和启动外部进程(如ROS2节点)
  • 接收前端的IPC请求并返回结果
WebView进程(前端)

WebView进程是Tauri应用的"显示屏"和"触摸屏",负责运行前端代码和渲染界面。它:

  • 只能执行HTML/CSS/JS代码
  • 不能直接访问任何系统资源(文件、串口、网络等)
  • 所有系统能力必须通过IPC向Core进程请求
  • 被严格的安全策略(CSP)保护
IPC通信

前后端通过异步消息传递进行通信,就像机器人的上位机和控制器之间的通信协议。常见模式:

  1. 前端→后端:前端发送指令(如"启动电机"),后端执行并返回结果
  2. 后端→前端:后端主动推送数据(如机器人实时位置、电池电量)
  3. 双向流:用于传输大量实时数据(如传感器数据流)

1.3 与Electron的对比

维度 Tauri Electron 对机器人开发的影响
渲染引擎 系统原生WebView 内置Chromium Tauri打包体积小(5-10MB),Electron通常>100MB
后端语言 Rust Node.js Tauri性能更高,内存占用更低,适合实时数据处理
系统能力 Rust插件 + 权限系统 Node.js原生API Tauri安全性更好,可精确控制每个能力的访问范围
前端环境 纯浏览器环境 Node.js + 浏览器 Tauri前端不能直接使用Node.js API,所有系统调用必须走IPC
跨平台支持 Windows/macOS/Linux/Android/iOS Windows/macOS/Linux Tauri支持移动端,可开发机器人平板控制端

为什么机器人开发者应该选择Tauri?

  • 轻量:打包后仅几MB,方便现场部署和分发
  • 安全:严格的权限系统,防止恶意代码控制机器人
  • 高性能:Rust后端适合处理传感器数据和实时控制
  • 生态:可无缝集成ROS2、OpenCV、TensorRT等机器人常用库
  • 开发效率:前端技术栈快速开发界面,Rust处理底层逻辑

2. Tauri 机器人开发适用场景

Tauri特别适合以下机器人开发场景:

机器人上位机控制台:控制机器人运动、显示状态、参数配置
离线调试工具:读取日志、回放数据、调试传感器和执行器
数据可视化平台:实时显示点云、图像、轨迹等数据
本地AI客户端:运行大模型、视觉检测算法,处理本地数据
嵌入式设备管理工具:配置和升级机器人嵌入式系统
工业现场监控系统:多机器人状态监控、报警通知、数据记录

不太适合的场景:
❌ 完全不想接触Rust,只想用JavaScript开发
❌ 极度依赖Node.js生态且无法迁移
❌ 需要完全一致的浏览器内核行为(如复杂3D渲染)


3. 快速开始:

3.1 环境准备

  1. 安装Rust:https://www.rust-lang.org/tools/install
  2. 安装Node.js:https://nodejs.org/(推荐LTS版本)
  3. 安装系统依赖:
    • Windows:Visual Studio Build Tools(勾选"Desktop development with C++")
    • macOS:Xcode Command Line Tools(xcode-select --install
    • Linux:sudo apt install libwebkit2gtk-4.0-dev build-essential libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev

术语解释

  • Rust:一种系统编程语言,强调安全、并发和性能
  • Node.js:JavaScript运行时,用于前端开发和构建工具
  • Cargo:Rust的包管理器和构建工具,类似Python的pip
  • npm:Node.js的包管理器,用于安装前端依赖

3.2 创建项目

npm create tauri-app@latest

按照提示选择:

  • 项目名称:如robot-console
  • 前端模板:推荐ReactVue(根据团队技术栈)
  • 包管理器:推荐npm

3.3 项目结构详解

一个典型的Tauri机器人项目结构如下:

robot-console/
├── package.json          # 前端依赖和脚本配置
├── index.html            # 前端入口HTML文件
├── src/                  # 前端源码目录
│   ├── App.tsx           # 主界面组件
│   ├── main.tsx          # 前端入口文件
│   └── api/              # 封装Tauri API调用
├── dist/                 # 前端构建产物(自动生成)
└── src-tauri/            # Rust后端目录
    ├── Cargo.toml        # Rust依赖配置
    ├── tauri.conf.json   # Tauri主配置文件
    ├── src/
    │   ├── lib.rs        # Rust入口文件
    │   ├── commands/     # 前端可调用的Rust命令
    │   ├── services/     # 业务逻辑服务(如机器人通信)
    │   └── state.rs      # 全局状态定义
    ├── capabilities/
    │   └── default.json  # 权限能力配置
    ├── icons/            # 应用图标
    └── target/           # Rust构建产物(自动生成)

关键文件说明

  • tauri.conf.json:Tauri应用的"总开关",配置应用名称、版本、窗口、打包、插件等
  • capabilities/default.json:权限配置文件,定义前端可以访问哪些能力
  • lib.rs:Rust后端入口,注册命令、插件和全局状态

3.4 开发与构建命令

# 启动开发模式(前端热重载 + 后端自动编译)
npm run tauri dev

# 构建生产版本(生成安装包)
npm run tauri build

# 移动端开发(需额外配置)
npm run tauri android dev
npm run tauri ios dev

4. 概念详解(结合机器人开发)

4.1 主配置文件:tauri.conf.json

这是Tauri应用最重要的配置文件,定义了应用的所有基本信息和行为。

机器人开发常用配置:

{
  "productName": "机器人控制台",
  "version": "1.0.0",
  "identifier": "com.yourcompany.robot-console",
  "build": {
    "beforeDevCommand": "npm run dev",
    "devUrl": "http://localhost:5173",
    "beforeBuildCommand": "npm run build",
    "frontendDist": "../dist"
  },
  "app": {
    "windows": [
      {
        "title": "机器人控制台",
        "width": 1280,
        "height": 720,
        "resizable": true
      }
    ],
    "security": {
      "csp": "default-src 'self'; script-src 'self' 'unsafe-inline'"
    }
  },
  "bundle": {
    "active": true,
    "targets": ["msi", "dmg", "deb"],
    "icon": ["icons/icon.png"]
  }
}

术语解释

  • Bundle IDidentifier字段,应用的唯一标识符,类似机器人的设备ID
  • CSP:内容安全策略,限制前端可以加载的资源和执行的代码,防止恶意注入
  • Bundle Targets:打包目标格式,Windows生成msi,macOS生成dmg,Linux生成deb

4.2 前端调用Rust:Command与invoke

这是Tauri最核心的能力,前端通过invoke函数调用Rust后端的命令。

机器人开发示例:前端点击"启动电机"按钮,Rust后端通过串口发送指令给机器人。

步骤1:在Rust中定义命令
// src-tauri/src/commands/robot.rs
use tauri::command;
use serialport::SerialPort;

#[command]
fn start_motor(speed: f64) -> Result<(), String> {
    // 打开串口
    let mut port = serialport::new("/dev/ttyUSB0", 115200)
        .open()
        .map_err(|e| format!("打开串口失败: {}", e))?;
    
    // 发送启动电机指令
    let cmd = format!("MOTOR START {}\n", speed);
    port.write_all(cmd.as_bytes())
        .map_err(|e| format!("发送指令失败: {}", e))?;
    
    Ok(())
}

// src-tauri/src/lib.rs
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        // 注册命令,让前端可以调用
        .invoke_handler(tauri::generate_handler![start_motor])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
步骤2:在前端调用命令
// src/api/robot.ts
import { invoke } from "@tauri-apps/api/core";

// 封装Rust命令调用
export async function startMotor(speed: number) {
  return await invoke<void>("start_motor", { speed });
}

// src/App.tsx
import { startMotor } from "./api/robot";

function App() {
  const handleStartMotor = async () => {
    try {
      await startMotor(50.0);
      alert("电机启动成功");
    } catch (err) {
      alert(`电机启动失败: ${err}`);
    }
  };

  return (
    <button onClick={handleStartMotor}>启动电机</button>
  );
}

最佳实践

  • 所有系统调用和硬件操作都放在Rust侧
  • 命令返回Result<T, E>类型,前端可以捕获错误
  • 前端封装API层,统一处理错误和参数校验

4.3 Rust向前端推送数据:事件系统

当Rust后端有实时数据需要推送给前端时(如机器人状态、传感器数据),使用事件系统。

机器人开发示例:Rust后端每秒读取机器人电池电量,推送给前端显示。

步骤1:Rust侧发送事件
// src-tauri/src/services/battery_monitor.rs
use tauri::{AppHandle, Emitter};
use std::thread;
use std::time::Duration;

pub fn start_battery_monitor(app: AppHandle) {
    thread::spawn(move || {
        loop {
            // 模拟读取电池电量
            let battery_level = read_battery_level();
            
            // 向前端发送事件
            let _ = app.emit("battery-update", battery_level);
            
            thread::sleep(Duration::from_secs(1));
        }
    });
}

fn read_battery_level() -> f64 {
    // 实际项目中这里通过串口或ROS2读取真实数据
    75.5
}

// src-tauri/src/lib.rs
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            // 应用启动时启动电池监控
            start_battery_monitor(app.handle());
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
步骤2:前端监听事件
// src/components/BatteryIndicator.tsx
import { useEffect, useState } from "react";
import { listen } from "@tauri-apps/api/event";

export function BatteryIndicator() {
  const [batteryLevel, setBatteryLevel] = useState(0);

  useEffect(() => {
    // 监听电池电量更新事件
    const unlisten = listen<number>("battery-update", (event) => {
      setBatteryLevel(event.payload);
    });

    // 组件卸载时取消监听,防止内存泄漏
    return () => {
      unlisten.then(f => f());
    };
  }, []);

  return (
    <div>电池电量: {batteryLevel.toFixed(1)}%</div>
  );
}

4.4 状态管理:共享机器人全局状态

机器人应用中有很多需要全局共享的状态,如当前连接的机器人IP、运行模式、坐标系等。Tauri推荐在Rust侧管理全局状态。

// src-tauri/src/state.rs
use std::sync::Mutex;
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RobotState {
    pub connected: bool,
    pub ip: String,
    pub mode: String, // "manual" | "auto" | "idle"
    pub position: (f64, f64, f64), // x, y, z
}

pub struct AppState {
    pub robot: Mutex<RobotState>,
}

// src-tauri/src/lib.rs
pub fn run() {
    tauri::Builder::default()
        // 注册全局状态
        .manage(AppState {
            robot: Mutex::new(RobotState {
                connected: false,
                ip: "192.168.1.100".to_string(),
                mode: "idle".to_string(),
                position: (0.0, 0.0, 0.0),
            }),
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

在命令中访问全局状态:

#[command]
fn get_robot_state(state: tauri::State<AppState>) -> RobotState {
    state.robot.lock().unwrap().clone()
}

#[command]
fn set_robot_mode(state: tauri::State<AppState>, mode: String) -> Result<(), String> {
    let mut robot = state.robot.lock().unwrap();
    robot.mode = mode;
    Ok(())
}

术语解释

  • Mutex:互斥锁,用于多线程环境下保护共享数据,防止同时读写导致的数据竞争
  • State:Tauri提供的状态管理工具,用于在命令之间共享数据

4.5 权限系统:Capabilities、Permissions、Scopes

Tauri 2.x的权限系统是其安全性的核心,默认拒绝所有系统能力,必须显式授权才能使用。这对于机器人应用至关重要,可以防止恶意代码控制机器人。

三个核心概念
  1. Capability(能力):定义哪些窗口可以获得哪些权限
  2. Permission(权限):定义可以使用哪些命令(如"读取文件"、“执行命令”)
  3. Scope(范围):定义权限的作用范围(如"只能读取$APPDATA/config.json")
机器人开发权限配置示例
// src-tauri/capabilities/default.json
{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "main-capability",
  "description": "主窗口权限",
  "windows": ["main"],
  "permissions": [
    // 基础权限
    "core:default",
    // 文件系统权限:只能读写应用配置目录
    "fs:allow-appconfig-read",
    "fs:allow-appconfig-write",
    // 对话框权限
    "dialog:default",
    // 通知权限
    "notification:default",
    // Shell权限:只能执行指定的ROS2命令
    {
      "identifier": "shell:allow-execute",
      "allow": [
        {
          "name": "ros2-launch",
          "cmd": "ros2",
          "args": ["launch", "robot_bringup", "robot.launch.py"]
        }
      ]
    }
  ]
}

安全警告

  • 永远不要使用"fs:default""shell:default"这样的全权限
  • Shell命令必须严格白名单化,禁止用户输入直接作为命令参数
  • 文件系统权限只授予必要的目录,不要开放整个Home目录

4.6 CSP与安全边界

CSP(内容安全策略)是浏览器提供的安全机制,用于限制前端可以加载的资源和执行的代码。Tauri默认启用严格的CSP。

机器人开发推荐CSP配置:

{
  "app": {
    "security": {
      "csp": "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' http://192.168.1.0/24"
    }
  }
}

这个配置允许:

  • 加载本地资源
  • 内联脚本和样式(前端框架通常需要)
  • 加载data:协议的图片
  • 连接本地局域网的机器人IP

5. 机器人开发必备插件

Tauri将系统能力封装为插件,官方提供了丰富的插件生态,满足机器人开发的大部分需求。

5.1 文件系统插件:fs

用于保存机器人配置、日志、数据文件等。

安装

npm run tauri add fs

使用示例

import { readTextFile, writeTextFile, BaseDirectory } from "@tauri-apps/plugin-fs";

// 保存机器人配置
async function saveConfig(config: object) {
  await writeTextFile("config.json", JSON.stringify(config), {
    baseDir: BaseDirectory.AppConfig,
  });
}

// 读取机器人配置
async function loadConfig() {
  const text = await readTextFile("config.json", {
    baseDir: BaseDirectory.AppConfig,
  });
  return JSON.parse(text);
}

常用目录

  • BaseDirectory.AppConfig:应用配置目录,适合保存配置文件
  • BaseDirectory.AppData:应用数据目录,适合保存用户数据
  • BaseDirectory.AppLog:应用日志目录,适合保存日志文件
  • BaseDirectory.Temp:临时目录,适合保存临时文件

5.2 对话框插件:dialog

用于文件选择、保存和消息提示。

安装

npm run tauri add dialog

使用示例

import { open, save, message } from "@tauri-apps/plugin-dialog";

// 选择机器人日志文件
async function selectLogFile() {
  const path = await open({
    filters: [{ name: "日志文件", extensions: ["log"] }],
  });
  return path;
}

// 显示错误消息
async function showError(msg: string) {
  await message(msg, { title: "错误", kind: "error" });
}

5.3 Shell插件:shell

用于执行系统命令和启动外部进程,如启动ROS2节点、运行Python脚本等。

安装

npm run tauri add shell

使用示例

import { Command } from "@tauri-apps/plugin-shell";

// 启动ROS2机器人节点
async function startRobot() {
  const result = await Command.create(
    "ros2-launch",
    ["launch", "robot_bringup", "robot.launch.py"]
  ).execute();

  if (result.code === 0) {
    console.log("机器人启动成功");
  } else {
    console.error("机器人启动失败:", result.stderr);
  }
}

安全警告

  • 永远不要执行用户输入的任意命令
  • 所有命令和参数必须在权限配置中白名单化
  • 避免使用sh -c拼接命令,防止命令注入攻击

5.4 HTTP客户端插件:http

用于与机器人后端服务通信,如获取任务列表、上传数据等。

安装

npm run tauri add http

使用示例

import { fetch } from "@tauri-apps/plugin-http";

async function getRobotTasks() {
  const response = await fetch("http://192.168.1.100:8000/api/tasks");
  const tasks = await response.json();
  return tasks;
}

5.5 本地持久化:Store、SQLite、文件

根据数据类型选择合适的持久化方式:

Store插件:键值存储

适合保存小型配置和用户偏好。

安装

npm run tauri add store

使用示例

import { LazyStore } from "@tauri-apps/plugin-store";

const store = new LazyStore("settings.json");

// 保存主题设置
await store.set("theme", "dark");
await store.save();

// 读取主题设置
const theme = await store.get<string>("theme");
SQL插件:SQLite数据库

适合保存结构化数据,如历史任务、传感器数据、日志等。

安装

npm run tauri add sql
cargo add tauri-plugin-sql --features sqlite

使用示例

import Database from "@tauri-apps/plugin-sql";

// 打开数据库
const db = await Database.load("sqlite:robot.db");

// 创建任务表
await db.execute(`
  CREATE TABLE IF NOT EXISTS tasks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    status TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  )
`);

// 插入任务
await db.execute(
  "INSERT INTO tasks (name, status) VALUES (?, ?)",
  ["焊接任务1", "pending"]
);

// 查询任务
const tasks = await db.select("SELECT * FROM tasks");

5.6 系统能力插件

通知插件:notification

用于发送系统通知,如机器人报警、任务完成提醒等。

安装

npm run tauri add notification

使用示例

import { sendNotification } from "@tauri-apps/plugin-notification";

// 发送低电量报警
sendNotification({
  title: "低电量警告",
  body: "机器人电量低于20%,请及时充电",
});
全局快捷键插件:global-shortcut

用于注册全局快捷键,如紧急停止快捷键。

安装

npm run tauri add global-shortcut

使用示例

import { register } from "@tauri-apps/plugin-global-shortcut";

// 注册紧急停止快捷键 Ctrl+Shift+E
await register("CommandOrControl+Shift+E", () => {
  console.log("紧急停止");
  // 调用Rust命令停止机器人
  invoke("emergency_stop");
});
单实例插件:single-instance

确保应用只能运行一个实例,防止多个上位机同时控制机器人。

安装

npm run tauri add single-instance

配置

// src-tauri/src/lib.rs
pub fn run() {
  tauri::Builder::default()
    .setup(|app| {
      #[cfg(desktop)]
      app.handle().plugin(tauri_plugin_single_instance::init(|app, _, _| {
        // 当新实例启动时,聚焦已有窗口
        let _ = app.get_webview_window("main").unwrap().set_focus();
      }));
      Ok(())
    })
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

5.7 自动更新插件:updater

用于现场机器人上位机的自动升级。

安装

npm run tauri add updater

使用示例

import { check } from "@tauri-apps/plugin-updater";
import { relaunch } from "@tauri-apps/plugin-process";

async function checkUpdate() {
  const update = await check();
  if (update) {
    console.log(`发现新版本: ${update.version}`);
    await update.downloadAndInstall();
    await relaunch();
  }
}

6. 打包、分发与签名

Tauri可以一键构建跨平台安装包,支持Windows、macOS和Linux。

6.1 构建生产版本

npm run tauri build

构建产物位于:

  • Windows:src-tauri/target/release/bundle/msi/
  • macOS:src-tauri/target/release/bundle/dmg/
  • Linux:src-tauri/target/release/bundle/deb/

6.2 代码签名

代码签名是分发桌面应用的必要步骤,可以防止安装包被篡改,避免系统安全警告。

Windows代码签名

需要购买OV或EV代码签名证书,配置tauri.conf.json

{
  "bundle": {
    "windows": {
      "certificateThumbprint": "证书指纹",
      "digestAlgorithm": "sha256",
      "timestampUrl": "http://timestamp.comodoca.com"
    }
  }
}
macOS代码签名

需要Apple开发者账号,配置Xcode自动签名或手动签名。

6.3 打包额外资源

如果应用需要内置模型文件、配置模板、语言包等,可以在tauri.conf.json中配置:

{
  "bundle": {
    "resources": [
      "resources/models/yolov8n.onnx",
      "resources/default_config.json"
    ]
  }
}

在Rust中读取资源文件:

use tauri::{Manager, path::BaseDirectory};

fn load_default_config(app: &tauri::AppHandle) -> Result<String, String> {
  let path = app
    .path()
    .resolve("resources/default_config.json", BaseDirectory::Resource)
    .map_err(|e| e.to_string())?;
  
  std::fs::read_to_string(path).map_err(|e| e.to_string())
}

7. 调试与日志

7.1 前端调试

在开发模式下,使用以下快捷键打开开发者工具:

  • Windows/Linux:Ctrl + Shift + I
  • macOS:Cmd + Option + I

7.2 Rust后端调试

使用println!宏打印日志到终端:

println!("机器人连接成功: {}", ip);

7.3 日志插件

生产环境使用日志插件记录日志,方便问题排查。

安装

npm run tauri add log

使用示例

// Rust侧
log::info!("机器人启动");
log::error!("串口连接失败: {}", e);
// 前端侧
import { info, error } from "@tauri-apps/plugin-log";

info("用户点击了启动按钮");
error("加载配置失败", err);

8. 性能优化与

8.1 IPC优化

  • 批处理:避免频繁调用IPC,将多个小请求合并为一个大请求
  • 流式传输:大量实时数据使用事件流传输,而不是轮询
  • 避免大对象:不要通过IPC传输大文件或大数组,通过文件路径传递

错误示例

// 不要这样做:每秒调用10次IPC
setInterval(async () => {
  const position = await invoke("get_robot_position");
  const speed = await invoke("get_robot_speed");
  const battery = await invoke("get_battery_level");
}, 100);

正确示例

// 这样做:Rust侧每秒推送一次所有状态
useEffect(() => {
  const unlisten = listen("robot-state-update", (event) => {
    const { position, speed, battery } = event.payload;
    // 更新UI
  });
  return () => unlisten.then(f => f());
}, []);

8.2 Rust层优化

  • CPU密集型任务放在Rust侧处理
  • IO操作使用异步
  • 数据库使用连接池
  • 共享状态使用细粒度锁

8.3 二进制体积优化

src-tauri/Cargo.toml中添加以下配置,可以显著减小二进制体积:

[profile.release]
panic = "abort"
codegen-units = 1
lto = true
opt-level = "s"
strip = true

9. 机器人上位机工程架构推荐

一个中大型机器人上位机项目推荐采用以下架构:

src/
  ├── app/                # 应用入口
  ├── pages/              # 页面组件
  │   ├── Dashboard.tsx   # 仪表盘页面
  │   ├── Control.tsx     # 控制页面
  │   ├── Logs.tsx        # 日志页面
  │   └── Settings.tsx    # 设置页面
  ├── components/         # 通用组件
  ├── api/                # Tauri API封装
  │   ├── robot.ts        # 机器人相关API
  │   ├── config.ts       # 配置相关API
  │   └── log.ts          # 日志相关API
  ├── stores/             # 前端状态管理
  └── types/              # TypeScript类型定义

src-tauri/
  ├── src/
  │   ├── lib.rs          # 应用入口
  │   ├── commands/       # 前端可调用的命令
  │   │   ├── mod.rs
  │   │   ├── robot.rs
  │   │   ├── config.rs
  │   │   └── log.rs
  │   ├── services/       # 业务逻辑服务
  │   │   ├── mod.rs
  │   │   ├── robot_service.rs  # 机器人通信服务
  │   │   ├── serial_service.rs # 串口通信服务
  │   │   └── log_service.rs    # 日志服务
  │   ├── state.rs        # 全局状态定义
  │   ├── error.rs        # 统一错误类型
  │   └── events.rs       # 事件定义
  ├── capabilities/       # 权限配置
  ├── migrations/         # 数据库迁移文件
  └── resources/          # 资源文件

核心原则

  • 前端只负责UI展示和用户交互
  • 所有业务逻辑和系统调用都放在Rust侧
  • 前后端通过清晰的API接口通信
  • 统一错误处理和日志记录

10. 避坑指南

坑1:把前端当成Node.js环境

Tauri前端是纯浏览器环境,不能使用Node.js API如fsprocess等。所有系统能力必须通过Tauri插件或Rust命令访问。

坑2:权限没配导致API不工作

Tauri 2.x所有插件默认不可用,必须在capabilities/default.json中显式授权。如果API调用没有反应,首先检查权限配置。

坑3:跨平台路径写死

不要在代码中写死绝对路径,使用Tauri提供的路径API:

// 错误
let config_path = "/home/user/.config/robot-console/config.json";

// 正确
let config_path = app.path().app_config_dir()?.join("config.json");

坑4:Shell参数注入攻击

永远不要将用户输入直接作为Shell命令参数:

// 错误:存在命令注入风险
Command::new("sh").args(["-c", &user_input]).execute();

// 正确:使用参数列表
Command::new("ros2").args(["launch", "robot_bringup", &launch_file]).execute();

坑5:过度使用IPC

避免在循环中频繁调用IPC,这会导致性能问题和UI卡顿。尽量批处理或使用事件推送。


总结

Tauri 2.x 为机器人开发者提供了一个跨平台应用开发方案。它结合了Web前端的开发效率和Rust的高性能、安全性,让可以快速构建轻量、可靠、安全的机器人上位机和工具。

对于机器人开发来说,Tauri的优势尤为明显:

  • 轻量:打包后仅几MB,方便现场部署
  • 安全:严格的权限系统,保护机器人不受恶意攻击
  • 高性能:Rust后端适合处理实时数据和硬件通信
  • 生态:可无缝集成ROS2、OpenCV、TensorRT等机器人常用库
  • 跨平台:一套代码运行在Windows、macOS、Linux和移动端

参考资料

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐