Awesome-omni-skill tauri2-react-rust
Guides development of cross-platform desktop apps with Tauri 2, TypeScript, React, and Rust. Use when building Tauri apps, implementing IPC, designing Rust backend or TypeScript/React frontend, when researching or cloning a website (open site, snapshot elements), when verifying local dev or built frontend in browser, or when the user mentions Tauri, Tauri 2, Rust backend, React frontend, desktop app architecture, invoke/commands, cross-platform, 调研网站, 验证效果, agent-browser.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/frontend/tauri2-react-rust" ~/.claude/skills/diegosouzapw-awesome-omni-skill-tauri2-react-rust-513340 && rm -rf "$T"
skills/frontend/tauri2-react-rust/SKILL.mdTauri 2 + React + Rust 跨平台开发
基于 Tauri 2、TypeScript、React、Rust 技术栈的跨平台桌面应用开发指引。整合架构、IPC、后端与前端最佳实践。
何时使用本 Skill
- 设计或实现 Tauri 应用架构、IPC 通信
- 编写 Rust 后端命令、状态、错误处理
- 编写 TypeScript/React 前端、类型与 invoke 封装
- 新建项目、实现功能、异步/复杂类型场景
- 配置安全(allowlist)、构建与调试
- 调研目标网站:克隆/仿站时,自动打开网站并查看页面元素、结构、交互,指导实现
- 验证开发效果:开发完成后,自动打开本地开发站点或打包前端,验证元素与交互是否按预期完成
开发流程建议
- 先设计后编码:brainstorming → 架构设计 → 实现
- 测试驱动:先写测试再写实现
- 类型一致:Rust 模型与 TypeScript 类型严格对应
- 异步优先:I/O 用 async/await;CPU 密集用
spawn_blocking - 安全第一:配置 allowlist、校验并规范化输入(如路径)
项目结构
project/ ├── src-tauri/ # Rust 后端 │ ├── src/ │ │ ├── main.rs # 入口,注册 commands、manage state │ │ ├── lib.rs # 模块导出 │ │ ├── commands/ # IPC 命令(按域拆分) │ │ ├── models/ # 与前端共享的数据结构 │ │ ├── db/ # 数据库访问(Repository 模式) │ │ ├── state.rs # AppState │ │ └── error.rs # 统一可序列化错误类型 │ ├── Cargo.toml │ └── tauri.conf.json ├── src/ # 前端 React + TypeScript │ ├── components/ # 原子化、职责单一 │ ├── hooks/ # React Query 等服务器状态 │ ├── services/ # 封装 invoke 的 API 层 │ ├── store/ # Zustand 等 UI 状态 │ ├── types/ # 与 Rust 模型一致的 TS 类型 │ └── App.tsx ├── package.json └── tsconfig.json
IPC 通信
前端 → 后端:Command
// src/services/xxx.ts import { invoke } from '@tauri-apps/api/core'; export async function getItems(): Promise<Item[]> { return await invoke<Item[]>('get_items'); }
// src-tauri/src/commands/xxx.rs #[tauri::command] pub async fn get_items(state: State<'_, AppState>) -> Result<Vec<Item>, AppError> { let db = state.db.lock().map_err(|_| AppError::Lock)?; Ok(repo::list(&db)?) }
后端 → 前端:Event
use tauri::Manager; app.emit_all("event-name", payload).ok();
import { listen } from '@tauri-apps/api/event'; const unlisten = await listen<T>('event-name', (e) => { ... }); // 组件卸载时 unlisten()
契约一致
- 所有跨边界数据结构在 Rust(
)与 TypeScript(models/
)中成对定义types/ - 使用
与 TS 接口一致命名与类型(如serde
↔ 前端可选 camelCase 转换)snake_case
后端 (Rust) 要点
- 状态:
在AppState
中main.rs
,命令内用manage()
注入State<'_, AppState> - 错误:统一错误类型实现
,便于前端展示;用serde::Serialize
+thiserror
收敛From - I/O:异步命令用
+async
;CPU 密集用tokiotokio::task::spawn_blocking - 路径/输入:校验类型与范围,必要时
并限制在允许目录内canonicalize
深层 Rust 能力(所有权、并发、性能、测试)参考:Rust 专家级实践(rust-pro、rust-async-patterns)。
前端 (React + TypeScript) 要点
- 服务层:
统一用src/services/
调用命令,返回类型与 Rust 一致invoke - 状态:UI 状态用 Zustand(
);服务端数据用 React Query(store/
)hooks/ - 错误:对
的 Promise 做 try/catch,将后端错误转为用户可读信息invoke - 类型:严格 TS 配置;泛型与工具类型保证与 Rust 契约一致
复杂类型与架构参考:TypeScript 专家级实践(typescript-pro)。
安全
- allowlist:在
中按需开启tauri.conf.json
、fs
等,并设置shellscope - 命令参数:校验类型、长度、业务规则;路径类参数做规范化与白名单校验
开发与构建
npm run tauri dev # 开发 npm run tauri build # 生产构建
测试
- Rust:单元测试放在
、commands/
等模块内;集成测试可放在db/src-tauri/tests/ - 前端:使用
的@tauri-apps/api/mocks
模拟命令返回值,再测组件与 hooksmockIPC - 调研与验证:见下一节 agent-browser 流程。
调研与验证:agent-browser
在调研和验证阶段用浏览器自动化(如 agent-browser)可显著提效:克隆网站时先打开目标站调研元素,开发完成后打开本地站点验证效果。
核心流程(通用)
- 打开页面:
agent-browser --cdp 9222 open <url> - 获取可交互元素:
→ 得到agent-browser --cdp 9222 snapshot -i
、@e1
等引用及类型/文案@e2 - 操作:用 refs 执行
、click
、fill
、select
等check - 页面变化后:再次
获取新 refs,再继续操作或断言snapshot -i
场景一:调研目标网站(克隆/仿站)
目标:了解要仿造的网站的 DOM 结构、可交互元素、文案与交互路径。
agent-browser --cdp 9222 open https://目标网站.com/页面 agent-browser --cdp 9222 snapshot -i # 根据输出识别:导航、列表、表单、按钮等对应 @e1 @e2 ... # 需要文案或结构时: agent-browser --cdp 9222 get text @e1 agent-browser --cdp 9222 get text body > page.txt # 可选:截图留档 agent-browser --cdp 9222 screenshot
据此确定组件划分、数据结构与 IPC 设计,再进入开发。
场景二:验证本地开发效果
目标:开发完成后,在浏览器中打开本地前端,确认元素存在、可点击、表单可填写、流程可走通。
# 先启动本地前端(另起终端):npm run dev 或 npm run tauri dev,记下 URL(如 http://localhost:1420 agent-browser --cdp 9222 open http://localhost:1420 agent-browser --cdp 9222 snapshot -i # 按设计逐项验证:点击侧栏、打开列表、新建任务、填写表单、提交等 agent-browser --cdp 9222 click @e1 agent-browser --cdp 9222 wait --load networkidle agent-browser --cdp 9222 snapshot -i agent-browser --cdp 9222 fill @e2 "测试任务" agent-browser --cdp 9222 click @e3 # 需要时截图或保存页面文本做回归 agent-browser --cdp 9222 screenshot
Tauri dev 为
http://localhost:1420 。
常用命令速查
| 用途 | 命令 |
|---|---|
| 打开页面 | |
| 可交互元素 | |
| 点击/填写 | 、 |
| 等待 | 、 |
| 取文案 | 、 |
| 截图 | 、 |
注意:页面跳转或 DOM 更新后必须重新
snapshot -i,否则旧 ref 会失效。完整命令与语义定位符见 agent-browser SKILL。
项目专用约定(本仓库)
- 前端:React 19、TypeScript、Tailwind CSS、Zustand、React Query
- 后端:Tauri 2、Rust、SQLite(如 rusqlite)
- 更多细节见项目根目录下的
.agent/rules/Tauri跨平台开发助手.md
参考资源
| 用途 | 参考 |
|---|---|
| Tauri 官方 | https://tauri.app/ 、Tauri 2 文档与 API |
| Rust 深度 | rust-pro、rust-async-patterns 等 skill |
| TypeScript 深度 | typescript-pro、typescript-advanced-types 等 skill |
| 流程与关键词 | 项目内或个人维护的 tauri-skills-quick-reference |
| 浏览器自动化 | agent-browser SKILL(完整命令、语义定位符、多会话等) |
常见场景速查
| 场景 | 侧重 |
|---|---|
| 新建项目 | 架构设计 → 目录与 tauri.conf → 第一个 command + 前端 invoke |
| 实现功能 | 先定 Rust 模型与 TS 类型 → 命令与 services → 组件与状态 |
| 调研仿站 | agent-browser --cdp 9222 open 目标站 → snapshot -i → get text / screenshot,再设计组件与数据 |
| 验证效果 | 启动本地前端 → agent-browser --cdp 9222 open localhost → snapshot -i → click/fill 逐项验证 |
| 异步操作 | Rust async + spawn_blocking 区分;前端 debounce/批量 |
| 复杂类型 | 泛型与 trait(Rust)+ 泛型与工具类型(TS)保持一致 |