跳至主要內容

處理程序模型

Tauri 採用類似 Electron 或許多現代網路瀏覽器的多處理程序架構。本指南探討設計選擇背後的原因,以及為何這對於撰寫安全應用程式至關重要。

為何需要多個處理程序?

在 GUI 應用程式的早期,使用單一程序來執行運算、繪製介面和回應使用者輸入是很常見的。正如你可能猜到的,這表示一個執行時間長且昂貴的運算會讓使用者介面沒有反應,或更糟的是,一個應用程式元件的故障會導致整個應用程式崩潰。

很明顯地,需要一個更具復原力的架構,而應用程式開始在不同的程序中執行不同的元件。這能更好地利用現代多核心 CPU,並建立更安全的應用程式。一個元件的崩潰不再會影響整個系統,因為元件在不同的程序中被隔離。如果一個程序進入無效狀態,我們可以輕鬆地重新啟動它。

我們也可以透過僅授予每個程序最少的權限來限制潛在漏洞的影響範圍,僅夠讓它們完成工作。這個模式稱為最小權限原則,你經常在現實世界中看到它。如果你請了一個園丁來修剪你的樹籬,你會給他們你花園的鑰匙。你不會給他們你家裡的鑰匙;他們為什麼需要存取權?相同的概念也適用於電腦程式。我們給予它們的存取權越少,如果它們遭到入侵,它們能造成的傷害就越少。

核心程序

每個 Tauri 應用程式都有核心程序,它作為應用程式的進入點,並且是唯一具有完全存取作業系統權限的元件。

核心程式的主要職責是使用該存取權限來建立和編排應用程式視窗、系統匣選單或通知。Tauri 實作必要的跨平台抽象化,讓這件事變得容易。它也會透過核心處理程序路由所有 程序間通訊,讓您可以在一個集中位置攔截、篩選和處理 IPC 訊息。

核心處理程序也應負責管理全域狀態,例如設定或資料庫連線。這讓您可以在視窗之間輕鬆同步狀態,並保護您的商業敏感資料,避免前端的窺探。

我們選擇 Rust 來實作 Tauri,是因為它的 擁有權 概念保證記憶體安全,同時保有絕佳效能。

流程圖 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 的類瀏覽器環境。

這表示您在傳統網頁開發中使用的技術和工具大多可以用來建立 Tauri 應用程式。例如,許多 Tauri 範例都是使用 Svelte 前端架構和 Vite 捆綁器撰寫的。

安全性最佳實務也適用;例如,您必須始終清除使用者輸入,絕不要在前處理秘密,理想情況下,將儘可能多的商業邏輯遞延到核心程序,以縮小您的攻擊面。

與其他類似解決方案不同,WebView 函式庫不會包含在您的最終可執行檔中,而是在執行時動態連結1。這會讓您的應用程式大幅縮小,但也表示您需要記住平台差異,就像傳統的網頁開發一樣。


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