원클릭으로
tauri-events
Tauri 事件系统技能,实现前后端双向事件通信。 触发场景: - 需要从 Rust 向前端推送数据 - 需要实现实时数据更新 - 需要窗口间通信 - 需要监听系统事件 触发词: 事件、event、emit、listen、推送、实时更新、通知、窗口通信
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Tauri 事件系统技能,实现前后端双向事件通信。 触发场景: - 需要从 Rust 向前端推送数据 - 需要实现实时数据更新 - 需要窗口间通信 - 需要监听系统事件 触发词: 事件、event、emit、listen、推送、实时更新、通知、窗口通信
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Git 工作流与版本管理技能,规范分支策略、提交信息和发布流程。 触发场景: - 用户需要创建分支或合并代码 - 用户需要规范提交信息格式 - 用户需要管理版本发布流程 触发词:Git、分支、提交、合并、版本发布
发布 Tauri 桌面应用新版本,处理版本号同步、Git tag、GitHub Actions 构建、Release 仓库产物同步、Cloudflare R2 上传、update.json 生成、自动更新发布和文档站重建。 触发场景: - 需要发布新版本或 release - 需要打 tag、推送发布分支或触发 CI 构建 - 需要生成或更新 update.json - 需要处理 Tauri updater 签名产物 - 需要同步 R2 CDN、GitHub/Gitee release 仓库或发布安装包 触发词:发布、release、版本发布、推送、打Tag、update.json、签名构建、安装包、自动更新、R2、CDN
Git 工作流与版本管理技能,规范分支策略、提交信息和发布流程。 触发场景: - 用户需要创建分支或合并代码 - 用户需要规范提交信息格式 - 用户需要管理版本发布流程 触发词:Git、分支、提交、合并、版本发布
自主连续开发方法论(Codex 版)。把一个项目按「每轮一个最小可提交单元」的方式推进到完成: 每轮读真相源 → 选下一个未做项 → 做一个最小单元 → 过验证门 → 记录勾选 → 最小提交 → 报进度。 适用于"按需求/台账建功能、还原原型、修一批 bug、补测试、重构、迁移、清理"等需要反复同构推进的任务。 与 Claude Code 的关系:Claude Code 有内置 `/loop` 自动续期(`/loop /dev-loop`),Codex 没有—— 所以 Codex 端由你(或脚本 / cron)反复触发"继续下一轮",方法论本身一致。 触发场景: - 想让 Codex 把某个项目/某个意图"一轮轮推进到完成" - 还原原型图、修一批 warning、补单测、重构模块等同构重复任务 - 需要"每步可编译、可回退、可恢复"的稳健推进方式 触发词:自主开发、连续开发、循环开发、一轮一提交、还原原型、批量修复、autonomous dev、continuous dev
Tauri 打包与分发技能,指导桌面端(Windows/macOS/Linux)与移动端(Android/iOS)的构建、签名和分发。 触发场景: - 需要构建生产安装包(exe/dmg/deb/apk/aab/ipa) - 需要配置各平台打包参数 - 需要代码签名(Windows 证书 / Android keystore / iOS 描述文件) - 需要减小安装包体积 - 需要设置应用图标和元数据 - 需要打包 Android / iOS App 触发词: 打包、构建、build、发布、安装包、exe、dmg、deb、apk、aab、ipa、签名、分发、release、android build、ios build、移动端打包
排查已发生的问题、定位 Bug 原因。 触发场景: - 代码运行报错,需要定位原因 - 功能不正常,需要排查 - Tauri Command 返回错误,需要分析 - 日志分析、调试代码 触发词:Bug、报错、不工作、调试、排查、为什么、出问题、失败、不生效、无效、找不到原因、定位问题
| name | tauri-events |
| description | Tauri 事件系统技能,实现前后端双向事件通信。 触发场景: - 需要从 Rust 向前端推送数据 - 需要实现实时数据更新 - 需要窗口间通信 - 需要监听系统事件 触发词: 事件、event、emit、listen、推送、实时更新、通知、窗口通信 |
| 特性 | Command (invoke) | Event (emit/listen) |
|---|---|---|
| 方向 | 前端 → Rust | 双向(Rust ↔ 前端) |
| 模式 | 请求-响应 | 发布-订阅 |
| 场景 | 主动查询/操作 | 被动通知/推送 |
| 返回值 | 有 | 无(单向广播) |
use tauri::Emitter;
// 在 Command 中发送事件
#[tauri::command]
async fn start_monitoring(window: tauri::Window) -> Result<(), String> {
tokio::spawn(async move {
loop {
let cpu_usage = get_cpu_usage();
window.emit("system-stats", cpu_usage).unwrap();
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
});
Ok(())
}
// 在 setup 中发送事件
fn main() {
tauri::Builder::default()
.setup(|app| {
let handle = app.handle().clone();
std::thread::spawn(move || {
loop {
handle.emit("heartbeat", "alive").unwrap();
std::thread::sleep(std::time::Duration::from_secs(5));
}
});
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
import { listen } from "@tauri-apps/api/event";
import { useEffect, useState } from "react";
function SystemMonitor() {
const [cpuUsage, setCpuUsage] = useState(0);
useEffect(() => {
const setupListener = async () => {
const unlisten = await listen<number>("system-stats", (event) => {
setCpuUsage(event.payload);
});
// 清理监听器
return unlisten;
};
let cleanup: (() => void) | undefined;
setupListener().then(fn => { cleanup = fn; });
return () => { cleanup?.(); };
}, []);
return <div>CPU: {cpuUsage}%</div>;
}
import { emit } from "@tauri-apps/api/event";
// 前端发送
await emit("user-action", { action: "click", target: "button" });
use tauri::Listener;
// Rust 监听
fn main() {
tauri::Builder::default()
.setup(|app| {
app.listen("user-action", |event| {
println!("收到前端事件: {:?}", event.payload());
});
Ok(())
})
.run(tauri::generate_context!())
.expect("error");
}
// 窗口 A 发送
import { emit } from "@tauri-apps/api/event";
await emit("data-updated", { id: 1, name: "new" });
// 窗口 B 监听
import { listen } from "@tauri-apps/api/event";
const unlisten = await listen("data-updated", (event) => {
console.log("数据更新:", event.payload);
refreshData();
});
#[tauri::command]
async fn process_files(window: tauri::Window, paths: Vec<String>) -> Result<(), String> {
let total = paths.len();
for (i, path) in paths.iter().enumerate() {
// 处理文件...
process_file(path).map_err(|e| e.to_string())?;
// 回报进度
window.emit("progress", serde_json::json!({
"current": i + 1,
"total": total,
"file": path,
})).map_err(|e| e.to_string())?;
}
Ok(())
}
function FileProcessor() {
const [progress, setProgress] = useState({ current: 0, total: 0, file: "" });
async function startProcessing(paths: string[]) {
const unlisten = await listen<{ current: number; total: number; file: string }>(
"progress", (e) => setProgress(e.payload)
);
try {
await invoke("process_files", { paths });
} finally {
unlisten();
}
}
return (
<div>
<progress value={progress.current} max={progress.total} />
<p>{progress.current}/{progress.total} - {progress.file}</p>
</div>
);
}
| 错误做法 | 正确做法 |
|---|---|
| 不清理事件监听器 | 在 useEffect cleanup 中调用 unlisten |
| 用 Command 轮询数据 | 用事件从 Rust 推送数据 |
| 事件名拼写不一致 | 定义常量统一管理事件名 |
| 不处理事件 payload 类型 | 使用泛型 listen<T>() 声明类型 |