菜单

概述

相关源文件

Tauri 是一个使用 Web 技术(HTML、CSS、JavaScript)和 Rust 后端来构建安全、轻量级、跨平台的桌面应用程序的框架。本文档提供了 Tauri 框架架构、其核心组件以及它们之间如何交互的技术概述。

Tauri 是什么?

Tauri 使开发者能够创建具有 Web 前端的桌面应用程序,同时利用 Rust 的性能和安全性。与 Electron 为每个应用程序都打包 Chromium 不同,Tauri 使用操作系统的原生 Webview,从而显著减小了应用程序的大小并提高了性能。

主要功能包括

  • 基于原生 Webview 的 GUI
  • JavaScript 和 Rust 之间安全的进程间通信(IPC)
  • 通过 Rust 后端访问特定于平台的 API
  • 为主要的桌面平台(Windows、macOS、Linux)内置应用程序打包
  • 用于扩展功能的插件系统

来源: README.md12-40 crates/tauri-runtime-wry/src/lib.rs5-8

架构概览

Tauri 架构遵循分层方法

  1. 前端层:基于 Web 的 UI 和 JavaScript API
  2. 核心层:Tauri 框架的 Rust 实现
  3. 构建层:用于构建和打包应用程序的工具
  4. 平台层:特定于平台的实现和原生 API

来源: crates/tauri/Cargo.toml1-45 crates/tauri-runtime-wry/src/lib.rs10-50 crates/tauri-cli/Cargo.toml1-20

核心组件

运行时系统

runtime 是一个核心抽象,它使 Tauri 能够使用通用接口在不同平台之间工作,同时委托给特定于平台的实现。

Runtime trait 定义了应用程序生命周期、窗口管理和事件处理的接口。主要的 runtime 实现是 Wry,它使用 wry Webview 引擎和 tao 窗口库。

来源: crates/tauri-runtime-wry/src/lib.rs18-31 crates/tauri-runtime-wry/src/lib.rs84-87

App 和 AppHandle

App struct 代表主应用程序实例,而 AppHandle 则提供了一种更轻量级的方式来与代码的各个部分进行应用程序状态的交互。

  • App:拥有事件循环,并负责应用程序的生命周期
  • AppHandle:一个可克隆的引用,用于在不拥有事件循环的情况下访问应用程序功能

这种模式允许从任何线程与应用程序进行通信,这对于命令、插件和后台任务特别有用。

来源: crates/tauri/src/webview/mod.rs39-41

窗口和 Webview 系统

Tauri 的窗口和 Webview 系统允许创建、管理和交互承载 Webview 的窗口。

  • Window:代表一个平台窗口
  • Webview:代表窗口内的 Webview
  • WebviewWindow:结合了窗口和 Webview(最常见的用例)
  • 相应的构建器模式允许自定义属性

Webview 系统支持多个窗口、自定义初始化脚本、URL 处理和 DOM 操作。

来源: crates/tauri/src/webview/mod.rs8-11 crates/tauri/src/webview/webview_window.rs5-7

IPC(进程间通信)

IPC 系统通过多种机制实现 JavaScript 前端和 Rust 后端之间的通信

命令

命令是从 JavaScript 执行 Rust 代码的主要方式

  1. JavaScript 调用 invoke('command_name', payload)
  2. Tauri 将此路由到用 #[command] 标注的 Rust 函数
  3. 函数执行并返回结果
  4. 结果被序列化并发送回 JavaScript

事件

事件系统提供了一个发布/订阅机制

  1. 事件可以从 Rust 或 JavaScript 发出
  2. 侦听器可以在任一环境中注册
  3. 事件可以定向到特定窗口或全局广播

通道

通道提供双向流通信

  1. 允许 Rust 和 JavaScript 之间进行连续数据传输
  2. 适用于长时间运行的操作或实时数据源

来源: crates/tauri/src/ipc/channel.rs1-6 crates/tauri/src/webview/mod.rs30-42 packages/api/src/window.ts6-17

应用程序生命周期

  1. 设置:应用程序配置了插件、命令和设置回调
  2. 窗口创建:根据配置创建初始窗口
  3. 事件循环:应用程序进入主事件循环
  4. 事件处理:处理事件(用户输入、IPC、系统事件)
  5. 清理:应用程序退出时释放资源

来源: crates/tauri-runtime-wry/src/lib.rs242-282 crates/tauri/src/webview/webview_window.rs49-55

配置系统

Tauri 的配置系统基于 tauri.conf.json 文件(或 TOML/JSON5 变体),该文件定义了应用程序设置

配置控制

  • 窗口属性(大小、位置、装饰)
  • 安全设置(CSP、功能)
  • 构建设置(命令、前端位置)
  • 打包设置(图标、目标平台)
  • 插件特定配置

来源: crates/tauri-schema-generator/schemas/config.schema.json1-10 crates/tauri-utils/src/config.rs1-17 examples/api/src-tauri/tauri.conf.json1-20

构建和打包系统

Tauri CLI 提供开发和构建命令

  • tauri dev:启动开发服务器,监视更改并运行应用程序
  • tauri build:构建前端,编译 Rust 后端,并打包应用程序

打包器创建特定于平台的包

  • Windows:MSI 和 NSIS(EXE)安装程序
  • macOS:DMG 和 APP 包
  • Linux:DEB、RPM 和 AppImage

来源: crates/tauri-cli/Cargo.toml35-37 crates/tauri-bundler/Cargo.toml1-19 examples/api/package.json6-11

JavaScript API

@tauri-apps/api 包提供了与 Tauri 核心交互的 JavaScript 绑定

模块描述
app应用程序信息和生命周期
cli命令行参数处理
dialog原生文件和消息对话框
event用于发布/订阅通信的事件系统
fs文件系统操作
http用于网络请求的 HTTP 客户端
notification原生系统通知
os操作系统信息
path路径操作工具
process进程管理和子进程
shell打开外部 URL 和执行命令
updater应用程序更新处理
window窗口操作

这些 API 被前端用来与 Rust 后端通信和访问平台功能。

来源:packages/api/package.json1-10 packages/api/src/window.ts1-18 packages/api/src/webview.ts1-18

安全模型

Tauri 实现了多项安全功能

  1. 内容安全策略 (CSP):限制可加载的资源
  2. 权限系统:对访问系统资源的细粒度权限控制
  3. IPC 验证:命令参数在执行前会进行验证
  4. 资源协议:受控的本地文件访问
  5. 隔离模式:将特权代码与主 WebView 分开

安全模型旨在遵循最小权限原则,允许开发者明确定义其应用程序所需的功能。

来源:examples/api/src-tauri/tauri.conf.json16-38 crates/tauri-utils/src/config.rs50-68

插件系统

Tauri 支持通过插件以模块化的方式扩展功能

  1. 插件可以添加新的命令、事件和原生功能
  2. 它们可以通过 tauri.conf.json 文件进行配置
  3. 社区插件提供常见功能,如 SQL 数据库、身份验证等。

这种可扩展的架构允许开发者在不修改核心框架的情况下添加功能。

来源:examples/api/src-tauri/tauri.conf.json40-75 crates/tauri/src/webview/plugin.rs1-4