news 2026/2/28 8:24:21

Tauri 项目:交互流程与开发指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tauri 项目:交互流程与开发指南

一、项目文件结构

DZMRustTauriBaseProject/ ├── index.html # 前端 HTML 入口 ├── package.json # 前端依赖与脚本 ├── vite.config.ts # Vite 构建配置 ├── tsconfig.json │ ├── src/ # 【前端】主要开发区 │ ├── main.ts # Vue 应用挂载 │ ├── App.vue # 根组件 / 主页面 │ ├── assets/ # 静态资源 │ └── vite-env.d.ts │ ├── src-tauri/ # 【后端/桌面壳】主要开发区 │ ├── Cargo.toml # Rust 依赖 │ ├── tauri.conf.json # 窗口、前端地址、构建命令等 │ ├── build.rs # 构建时脚本 │ ├── capabilities/ │ │ └── default.json # 权限:允许前端调用的 API │ ├── src/ │ │ ├── main.rs # 程序入口,启动 Tauri │ │ └── lib.rs # 业务逻辑 + 暴露给前端的命令(核心) │ └── icons/ # 应用图标 │ └── docs/ # 文档(本文件所在目录)

二、前后端交互流程

2.1 整体流程(一次调用)

┌─────────────────────────────────────────────────────────────────────────┐ │ 用户操作(如点击 Greet) │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 前端 (Vue / src/App.vue) │ │ • 调用: invoke("greet", { name: name.value }) │ │ • 使用: @tauri-apps/api/core 的 invoke │ └─────────────────────────────────────────────────────────────────────────┘ │ │ (Tauri 内部:序列化参数 → IPC → 后端) ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 后端 (Rust / src-tauri/src/lib.rs) │ │ • 匹配命令名 "greet" → 执行 fn greet(name: &str) -> String │ │ • 返回值序列化后通过 IPC 回传 │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 前端 (Vue) │ │ • await invoke(...) 得到 Rust 返回的 String │ │ • 写入 greetMsg,界面更新 │ └─────────────────────────────────────────────────────────────────────────┘

2.2 代码对应关系

环节位置做什么
前端调用src/App.vueinvoke("greet", { name }),命令名必须与 Rust 中一致
命令注册src-tauri/src/lib.rs#[tauri::command] fn greet(...)+generate_handler![greet]
权限src-tauri/capabilities/default.json允许使用core(含 invoke)等能力

三、后续开发:主要操作区域与流程

3.1 加一个「新能力」(新命令)

  1. Rust 端src-tauri/src/lib.rs

    • 写一个新函数,加上#[tauri::command]
    • tauri::Builder.invoke_handler(tauri::generate_handler![..., 新命令])里注册。
  2. 前端

    • 在需要的地方import { invoke } from "@tauri-apps/api/core",然后await invoke("新命令名", { 参数 })
  3. 权限(若用到敏感 API)

    • capabilities/里为对应能力添加 permission(多数纯业务命令用默认即可)。

3.2 改界面

  • 只动src/:Vue 组件、路由、状态、样式等,和普通 Vue 项目一致。

3.3 改窗口/打包/配置

  • src-tauri/tauri.conf.json:窗口大小、标题、前端 devUrl、构建命令等。

3.4 开发时跑起来

  • 只跑网页:npm run dev
  • 跑桌面客户端(前端 + 壳):npm run tauri dev

四、交互原理简述

  • 前端运行在 Tauri 提供的 WebView 里,和普通网页一样写 Vue/TS。
  • 通信:前端不直接访问 Rust,而是通过 Tauri 的invoke发「命令名 + 参数」;Tauri 在 Rust 端根据命令名路由到对应的#[tauri::command]函数,执行完后把返回值通过 IPC 传回前端。
  • 安全:前端只能调用你在 Rust 里显式注册的 command,以及 capabilities 里允许的 API;没有「整个 Node/系统」暴露给前端,所以不需要像 Electron 那样用 contextBridge 做一层暴露。

五、和 Electron 在流程上的区别

5.1 Electron 的典型做法

  • 主进程:Node 环境,可 require、访问系统。
  • 渲染进程:浏览器环境,默认不能直接 require、不能随意调主进程。
  • 所以要用contextBridge + ipcRenderer
    • 主进程里用preload脚本,通过contextBridge.exposeInMainWorld('xxx', { ... })只暴露有限 API 给渲染进程。
    • 渲染进程里不直接require('electron'),而是用挂到window上的对象(例如window.xxx.invoke('channel', data)),内部再转成ipcRenderer.send / ipcRenderer.invoke与主进程通信。
  • 流程:渲染进程 → preload(contextBridge 暴露的 API)→ ipcRenderer → 主进程(ipcMain 监听 channel)→ 主进程逻辑

也就是说:Electron 需要你自己用 preload + contextBridge 定义「前端能调什么」,再用ipcRenderer / ipcMain在进程间传 channel + 数据。

5.2 Tauri 的对应关系

概念ElectronTauri
前端调「后端」通过 preload 暴露的 API通过invoke("command", args)
暴露方式contextBridge.exposeInMainWorld无需 preload,直接 invoke 命令名
后端实现ipcMain.on(‘channel’, handler)#[tauri::command] fn xxx()
通信模型自己定 channel 名、自己序列化命令名 + 参数,Tauri 负责序列化/路由

5.3 核心区别总结

  1. Electron

    • 渲染进程不能直接用require('electron'),所以要preload + contextBridge暴露安全 API,再用ipcRenderer发 channel,主进程用ipcMain收。
    • 流程是你自己设计 channel 和参数格式。
  2. Tauri

    • 前端直接用invoke("命令名", 参数),不需要 preload,也没有 contextBridge。
    • 「暴露什么」由 Rust 里注册的commandcapabilities决定,安全性在框架层就按「白名单命令」设计好了。

所以:Electron 的 contextBridge + ipcRenderer 那一套,在 Tauri 里被简化为「前端 invoke 命令名 + Rust 端 command 注册」,不需要你写 preload,也不用手动管 channel 名,只要在 Rust 里加 command、在前端调 invoke 即可。


六、对照小结

  • 项目结构src/= 前端,src-tauri/= 桌面壳与后端逻辑;后续开发主要就是在这两块加命令和改界面。
  • 交互流程:用户操作 → 前端invoke("命令", 参数)→ Tauri 路由到 Rust#[tauri::command]→ 返回值回前端。
  • 和 Electron 的区别:Tauri 用「invoke + command」替代了 Electron 的「contextBridge + ipcRenderer + ipcMain」;前端只调命令名,不碰 preload,也不定义 channel。

文档结束。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/23 16:27:48

基于Python 图形学实验(生成中间帧)

图形学实验: 生成中间帧 给定初始图片和结束图片,生成中间的N帧,使得首尾自然过渡 开发环境 开发环境:macOS Mojave 10.14.6开发软件:PyCharm 2019.1.3开发语言:python 如何运行 将项目文件夹拷贝到本地环境运行s…

作者头像 李华
网站建设 2026/2/27 19:43:01

从理论到实践:Node-RED性能优化的完整案例解析

在物联网和自动化领域,Node-RED以其直观的可视化编程界面赢得了众多开发者的青睐。然而,许多用户在实际应用中都会遇到一个共同的问题:为什么我的Node-RED流程看起来逻辑清晰,运行起来却异常缓慢? 为什么你的Node-RED…

作者头像 李华
网站建设 2026/2/26 10:25:59

亲测好用10个降AIGC工具 千笔AI帮你高效降AI率

AI降重工具的崛起与实用价值 在当前学术写作日益依赖AI生成内容的背景下,越来越多的学生和研究者开始关注如何有效降低AIGC率、去除AI痕迹,同时保持文章的逻辑性和语义通顺。这不仅关乎论文通过查重系统的标准,更直接影响到学术诚信和论文质…

作者头像 李华
网站建设 2026/2/26 4:41:30

基于深度学习YOLOv10的辣椒叶片病害检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 项目摘要 本项目基于YOLOv10目标检测算法,开发了一个针对辣椒叶片病害的智能检测系统。系统能够自动识别并分类5种常见的辣椒叶片状态,包括健康叶片和4种病害类型(黄单胞菌病、花叶病、尾孢菌病和卷叶病)。通过深度…

作者头像 李华
网站建设 2026/2/24 12:54:45

基于深度学习的水果品种分类检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 摘要 水果品种的精准识别在农产品分级、智能零售和自动化分拣等领域具有重要应用价值。本研究开发了一种基于YOLOv10的高精度水果品种实时检测系统,可实现对6类常见水果品种(金冠苹果、澳洲青苹果、梨子、红富士苹果、红油桃、黄桃&#…

作者头像 李华
网站建设 2026/2/28 6:33:52

计算机毕业设计之基于.NET技术的吉他音乐社区系统的设计与实现

快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,然后线上管理系统也就相继涌现。与此同时,人们开始接受方便的生活方式…

作者头像 李华