关于 understanding-tauri-process-model
面向 Tauri 应用开发者的架构指南,说明 Rust Core 与 WebView 进程如何协作,并重点介绍 IPC、多窗口、进程隔离和基于能力的安全控制。
主要功能
- 01Core 与 WebView 进程职责
- 02IPC 请求与响应流程
- 03多窗口管理
- 04进程隔离与故障限制
- 05基于能力的访问控制
- 06前后端安全实践
适用场景
- 01划分 Rust 与 WebView 的职责
- 02追踪前端到 Core 的 IPC
- 03在应用窗口间共享状态
- 04限制各窗口的权限
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dchuk/ claude-code-tauri-skills --skill understanding-tauri-process-model安装后在 Claude Code 中输入/understanding-tauri-process-model确认已加载。
详细介绍
Tauri 进程模型
Tauri 实现了类似 Electron 和现代 Web 浏览器的多进程架构。了解这一模型对于构建安全、高性能的 Tauri 应用至关重要。
架构概览
+------------------------------------------------------------------+
| TAURI APPLICATION |
+------------------------------------------------------------------+
| |
| +-----------------------------+ |
| | CORE PROCESS | |
| | (Rust) | |
| | | |
| | +----------------------+ | |
| | | Window Manager | | |
| | +----------------------+ | |
| | | System Tray | | |
| | +----------------------+ | |
| | | Global State | | |
| | +----------------------+ | |
| | | IPC Router | | |
| | +----------------------+ | |
| | | OS Abstractions | | |
| +-------------+---------------+ |
| | |
| | IPC (Inter-Process Communication) |
| | |
| +----------+----------+----------+ |
| | | | | |
| v v v v |
| +------+ +------+ +------+ +------+ |
| |WebView| |WebView| |WebView| |WebView| |
| | #1 | | #2 | | #3 | | #N | |
| +------+ +------+ +------+ +------+ |
| | HTML | | HTML | | HTML | | HTML | |
| | CSS | | CSS | | CSS | | CSS | |
| | JS | | JS | | JS | | JS | |
| +------+ +------+ +------+ +------+ |
| |
+------------------------------------------------------------------+
核心进程
核心进程是应用的入口点和中央枢纽。它运行 Rust 代码,并独占访问操作系统功能。
职责
| 职责 | 描述 |
|---|---|
| 窗口管理 | 创建和协调应用窗口 |
| 系统集成 | 管理系统托盘菜单和通知 |
| IPC 路由 | 处理所有进程间通信 |
| 全局状态 | 管理应用级设置和数据库连接 |
| OS 抽象 | 提供跨平台 API |
核心进程为何使用 Rust
核心进程使用 Rust,以获得内存安全保障。所有权系统可防止:
- 空指针解引用
- 缓冲区溢出
- 数据竞争
- 使用已释放内存的错误
这至关重要,因为核心进程拥有完整的系统访问权限。
+------------------------------------------+
| CORE PROCESS |
| |
| Memory Safety via Rust Ownership: |
| - No null pointers |
| - No buffer overflows |
| - No data races |
| - No use-after-free |
| |
| Full OS Access: |
| - File system |
| - Network |
| - System APIs |
| - Hardware interfaces |
+------------------------------------------+
WebView 进程
WebView 进程使用操作系统的原生 WebView 库来渲染用户界面。
特定于平台的 WebView
+------------------+------------------+------------------+
| WINDOWS | MACOS | LINUX |
+------------------+------------------+------------------+
| | | |
| Microsoft Edge | WKWebView | webkitgtk |
| WebView2 | | |
| | | |
| Chromium-based | Safari engine | WebKit engine |
| | | |
+------------------+------------------+------------------+
| | |
+------------------+------------------+
|
Dynamic Linking
(Not bundled)
|
Smaller executables
主要特征
- 动态链接:WebView 库在运行时链接,而非打包在应用中
- Web 技术:执行 HTML、CSS 和 JavaScript
- 框架支持:支持 React、Vue、Svelte、Solid 等
- 隔离:每个 WebView 都在独立的进程空间中运行
进程通信(IPC)
进程间的所有通信都通过核心进程进行。
+----------------+ +----------------+
| WebView A | | WebView B |
| | | |
| invoke() ----+---->+----------------+<------+---- invoke() |
| | | CORE PROCESS | | |
| <---- listen |<----+ +------>| listen ----> |
| | | - Validates | | |
+----------------+ | - Routes | +----------------+
| - Filters |
| - Transforms |
+----------------+
|
v
+----------------+
| OS / System |
| Resources |
+----------------+
IPC 流程
- WebView 使用命令名称和负载调用
invoke() - 核心进程接收消息
- 核心进程验证并处理请求
- 核心进程可与 OS 资源交互
- 核心进程将响应发送回 WebView
示例:基本 IPC
前端(JavaScript)
import { invoke } from '@tauri-apps/api/core';
// Call a Rust command
const result = await invoke('greet', { name: 'World' });
后端(Rust)
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
多窗口处理
单个核心进程管理多个 WebView 进程。
+-------------------+
| CORE PROCESS |
| |
| Shared State: |
| - User session |
| - App config |
| - DB connection |
+-------------------+
/|\
/ | \
/ | \
/ | \
/ | \
v v v
+------+ +------+ +------+
|Main | |Settings| |About|
|Window| |Window | |Window|
+------+ +------+ +------+
窗口管理模式
创建窗口
use tauri::Manager;
#[tauri::command]
fn open_settings(app: tauri::AppHandle) {
tauri::WebviewWindowBuilder::new(
&app,
"settings",
tauri::WebviewUrl::App("settings.html".into())
)
.title("Settings")
.build()
.unwrap();
}
跨窗口通信
use tauri::Manager;
#[tauri::command]
fn broadcast_update(app: tauri::AppHandle, data: String) {
// Emit to all windows
app.emit("data-updated", data).unwrap();
}
窗口专属事件
use tauri::Manager;
#[tauri::command]
fn notify_window(app: tauri::AppHandle, window_label: String, data: String) {
if let Some(window) = app.get_webview_window(&window_label) {
window.emit("notification", data).unwrap();
}
}
进程隔离与安全
最小权限原则
“如果你请园丁来修剪树篱,你会给他花园的钥匙。但你不会把房子的钥匙也交给他。”
+------------------------------------------------------------------+
| SECURITY BOUNDARIES |
+------------------------------------------------------------------+
| |
| +---------------------------+ +---------------------------+ |
| | CORE PROCESS | | WEBVIEW PROCESS | |
| | (Trusted Zone) | | (Untrusted Zone) | |
| +---------------------------+ +---------------------------+ |
| | | | | |
| | - File system access | | - Render UI only | |
| | - Database connections | | - User input handling | |
| | - Network requests | | - Display data | |
| | - Crypto operations | | - Call allowed commands | |
| | - Secrets management | | | |
| | - Business logic | | NO DIRECT ACCESS TO: | |
| | | | - File system | |
| | | | - Network (direct) | |
| | | | - System APIs | |
| +---------------------------+ +---------------------------+ |
| |
+------------------------------------------------------------------+
进程隔离的安全优势
| 优势 | 描述 |
|---|---|
| 崩溃隔离 | 一个进程发生故障不会导致整个应用崩溃 |
| 状态恢复 | 可独立重启失效的进程 |
| 减少攻击面 | 被攻陷的 WebView 具有有限的功能 |
| 资源保护 | 敏感数据保留在核心进程中 |
安全最佳实践
前端(WebView)
- 清理所有用户输入
- 绝不处理机密信息
- 将业务逻辑交由核心进程处理
- 实施内容安全策略(CSP)
后端(核心进程)
- 验证所有 IPC 输入
- 使用功能权限系统限制命令
- 对每个窗口应用最小权限原则
基于功能权限的安全
Tauri 使用功能权限系统来控制每个窗口可以访问的内容。
+------------------+ +------------------+ +------------------+
| Main Window | | Settings Window | | Viewer Window |
+------------------+ +------------------+ +------------------+
| Capabilities: | | Capabilities: | | Capabilities: |
| - read_file | | - read_config | | - read_file |
| - write_file | | - write_config | | (read only) |
| - network | | | | |
| - notifications | | | | |
+------------------+ +------------------+ +------------------+
示例:功能权限配置
{
"identifier": "main-capability",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"fs:read-files",
"fs:write-files",
"http:default"
]
}
进程生命周期
+------------------------------------------------------------------+
| APPLICATION LIFECYCLE |
+------------------------------------------------------------------+
| |
| 1. App Launch |
| +------------------+ |
| | Core Process | <-- Starts first |
| | Initializes | |
| +------------------+ |
| | |
| v |
| 2. Window Creation |
| +------------------+ |
| | WebView Process | <-- Core creates WebViews |
| | Spawned | |
| +------------------+ |
| | |
| v |
| 3. Running |
| +--------+ IPC +----------+ |
| | Core |<--------->| WebViews | |
| +--------+ +----------+ |
| | |
| v |
| 4. Shutdown |
| +------------------+ |
| | WebViews close | <-- WebViews terminate first |
| | Core cleans up | <-- Core process exits last |
| +------------------+ |
| |
+------------------------------------------------------------------+
总结
| 方面 | Core 进程 | WebView 进程 |
|---|---|---|
| 语言 | Rust | JavaScript/TypeScript |
| 数量 | 每个应用一个 | 每个应用一个或多个 |
| 操作系统访问权限 | 完全访问 | 无(仅通过 IPC) |
| 角色 | 后端、编排 | UI 渲染 |
| 安全性 | 可信 | 不可信 |
| 崩溃影响 | 应用终止 | 窗口关闭 |
Tauri 进程模型通过严格隔离可信的 Core 进程与可能存在漏洞的 WebView 进程,为构建桌面应用提供了安全基础。所有敏感操作都应在 Core 进程中实现,而 WebView 仅作为展示层。
评论
支持 Markdown