前端一键调用 Rust:tauri-nextjs-template 中 Tauri Command + invoke 跨语言通信完全指南
【免费下载链接】tauri-nextjs-templateA Tauri 2.0 + Next.js (SSG) template, with TailwindCSS, opinionated linting, and GitHub Actions preconfigured项目地址: https://gitcode.com/gh_mirrors/ta/tauri-nextjs-template
tauri-nextjs-template是一个基于 Tauri 2.0 + Next.js(SSG)+ TailwindCSS 的桌面应用模板。本文用一条完整的调用链路,带你看懂Tauri Command + invoke 跨语言通信的全部机制——前端点一下按钮,直接调用 Rust 函数,无需任何胶水代码 🚀
一、跨语言通信如何工作:Tauri Command 与 invoke 的分工
Tauri 的跨语言通信可以概括为两个角色:
- Rust 端(后端):用
#[tauri::command]宏把普通 Rust 函数标记为"可被前端调用",这就是 Tauri Command - JS/TS 端(前端):通过
@tauri-apps/api/core提供的invoke("命令名")发起调用
调用流程一条线就能看懂:
React 按钮点击 → invoke("greet") → Tauri 核心转发 → Rust greet() → 返回值自动序列化 → 更新 React 状态参数和返回值由 Tauri 自动做 JSON 序列化/反序列化,前端拿到的是标准 JS 类型,对新手非常友好。
二、项目结构:前后端代码分别在哪里
| 路径 | 作用 |
|---|---|
src/ | Next.js 前端源码(App Router +"use client"组件) |
| src-tauri/src/lib.rs | Rust 应用入口,Tauri Command 定义在这里 |
| src-tauri/tauri.conf.json | 窗口尺寸、开发服务器地址、打包配置 |
| src-tauri/capabilities/default.json | 主窗口权限能力(capabilities)配置 |
| README.md | 模板特性、常见坑位说明 |
三、三步读懂完整调用链路(模板已内置示例)
第 1 步:在 Rust 中定义 Tauri Command
打开 src-tauri/src/lib.rs,模板自带一个greet示例命令:
#[tauri::command] fn greet() -> String { let now = SystemTime::now(); let epoch_ms = now.duration_since(UNIX_EPOCH).unwrap().as_millis(); format!("Hello world from Rust! Current epoch: {epoch_ms}") }#[tauri::command]是跨语言通信的"注册标识",函数参数会自动从 JS 侧的 JSON 反序列化。
第 2 步:把命令注册进 invoke handler
同一个文件的 run() 入口 中:
.invoke_handler(tauri::generate_handler![greet])generate_handler!相当于 Tauri 的"电话簿"——注册后,前端的invoke("greet")才能找到这个 Rust 函数。
第 3 步:前端一键 invoke 调用
在 src/app/page.tsx 中,前端只需几行代码:
import { invoke } from "@tauri-apps/api/core"; const greet = useCallback((): void => { invoke<string>("greet").then((s) => setGreeted(s)); }, []);按钮组件 RoundedButton 绑定这个回调,点击后页面上即刻显示 Rust 返回的Hello world from Rust! Current epoch: ...,与文章开头的截图一致。
四、新手最常见的坑:window is not defined ⚠️
这是 Next.js + Tauri 组合里最容易踩的坑:
- Next.js 开发服务器默认带 SSR 上下文,Node.js 环境里没有
window/navigator,直接在服务端组件里import { invoke }就会报ReferenceError - 解决思路:确保 Tauri 相关代码只运行在浏览器上下文——组件顶部声明
"use client",或按需使用懒加载延迟导入 - 模板的 README Caveats 章节 对这一点有详细说明,值得通读
另外两个模板层面的注意点:
- Tauri 前端只支持SSG(静态导出),不支持 SSR,因此
next/image已配置为unoptimized - 首次 clone 后请把 tauri.conf.json 中的
identifier改成自己的应用标识,否则 release 模式打包会被拦截
五、一键启动:从 clone 到打包发布
git clone https://gitcode.com/gh_mirrors/ta/tauri-nextjs-template pnpm install pnpm tauri devpnpm tauri dev会同时启动 Next.js 开发服务器(localhost:3000)并在 Tauri 窗口中加载页面,热更新即改即见。
开发完成后,一条命令完成 SSG 导出 + Rust 编译打包:
pnpm tauri build模板还预配了 Biome(TS 格式化与 lint)、clippy / rustfmt(Rust 质量检查)以及 CI 检查,跨语言开发体验开箱即用。
六、总结:跨语言通信就这三件事
- Rust 端:
#[tauri::command]定义命令 +generate_handler!注册 - 前端:
invoke<类型>("命令名")一行完成跨语言调用 - 工程化:
"use client"隔离 SSR 上下文,避免window is not defined
掌握了这条链路,你就可以在 tauri-nextjs-template 上快速开发出拥有 Rust 系统能力、前端体验一流的桌面应用了 ✨
【免费下载链接】tauri-nextjs-templateA Tauri 2.0 + Next.js (SSG) template, with TailwindCSS, opinionated linting, and GitHub Actions preconfigured项目地址: https://gitcode.com/gh_mirrors/ta/tauri-nextjs-template
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考