前端一键调用 Rust:tauri-nextjs-template 中 Tauri Command + invoke 跨语言通信完全指南
2026/8/23 14:09:06 网站建设 项目流程

前端一键调用 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.rsRust 应用入口,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 dev

pnpm tauri dev会同时启动 Next.js 开发服务器(localhost:3000)并在 Tauri 窗口中加载页面,热更新即改即见。

开发完成后,一条命令完成 SSG 导出 + Rust 编译打包:

pnpm tauri build

模板还预配了 Biome(TS 格式化与 lint)、clippy / rustfmt(Rust 质量检查)以及 CI 检查,跨语言开发体验开箱即用。

六、总结:跨语言通信就这三件事

  1. Rust 端#[tauri::command]定义命令 +generate_handler!注册
  2. 前端invoke<类型>("命令名")一行完成跨语言调用
  3. 工程化"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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询