跳至主要内容

进程模型

Tauri 采用类似 Electron 或许多现代 Web 浏览器的多进程架构。本指南探讨了设计选择的理由,以及为什么它是编写安全应用程序的关键。

为什么使用多进程?

在 GUI 应用程序的早期,通常使用单个进程来执行计算、绘制界面和响应用户输入。正如您可能猜到的那样,这意味着长时间运行的、昂贵的计算会使用户界面无响应,或者更糟糕的是,一个应用程序组件的故障会使整个应用程序崩溃。

很明显,需要一种更强大的架构,应用程序开始在不同的进程中运行不同的组件。这使得现代多核 CPU 的利用率更高,并创建了更安全的应用程序。一个组件的崩溃不再影响整个系统,因为组件在不同的进程中是隔离的。如果一个进程进入无效状态,我们可以轻松地重新启动它。

我们还可以通过仅向每个进程授予最少的权限(仅够完成其工作)来限制潜在漏洞的影响范围。这种模式被称为最小权限原则,您在现实世界中经常看到它。如果您请园丁来修剪您的树篱,您会给他们您花园的钥匙。您不会给他们您房子的钥匙;他们为什么需要访问房子?同样的概念也适用于计算机程序。我们赋予它们的访问权限越少,如果它们被入侵,它们造成的损害就越小。

核心进程

每个 Tauri 应用程序都有一个核心进程,它充当应用程序的入口点,并且是唯一具有完全操作系统访问权限的组件。

核心的主要职责是使用该访问权限来创建和协调应用程序窗口、系统托盘菜单或通知。Tauri 实现必要的跨平台抽象来简化此操作。它还通过核心进程路由所有进程间通信,允许您在一个中心位置拦截、过滤和操作 IPC 消息。

核心进程还应负责管理全局状态,例如设置或数据库连接。这允许您轻松地在窗口之间同步状态,并保护您的业务敏感数据免受前端窥探。

我们选择 Rust 来实现 Tauri,因为它具有所有权的概念,可以保证内存安全,同时保持出色的性能。

flowchart TD C{核心} W1[WebView] W2[WebView] W3[WebView] C <-->|事件 & 命令| W1 C <-->|事件 & 命令| W2 C <-->|事件 & 命令| W3
图 1-1:Tauri 进程模型的简化表示。单个核心进程管理一个或多个 WebView 进程。

WebView 进程

核心进程本身不渲染实际的用户界面 (UI);它启动利用操作系统提供的 WebView 库的 WebView 进程。WebView 是一个类似浏览器的环境,用于执行您的 HTML、CSS 和 JavaScript。

这意味着您可以使用在传统 Web 开发中使用的许多技术和工具来创建 Tauri 应用程序。例如,许多 Tauri 示例都是使用Svelte前端框架和Vite打包器编写的。

安全最佳实践也适用;例如,您必须始终清理用户输入,永远不要在前端处理密钥,并且理想情况下应将尽可能多的业务逻辑推迟到核心进程,以保持较小的攻击面。

与其他类似的解决方案不同,WebView 库**不会**包含在您的最终可执行文件中,而是在运行时动态链接1。这使得您的应用程序变得显著更小,但也意味着您需要牢记平台差异,就像传统的 Web 开发一样。


  1. 目前,Tauri 在 Windows 上使用Microsoft Edge WebView2,在 macOS 上使用WKWebView,在 Linux 上使用webkitgtk