一文讀懂 Tauri

最近在折騰 WA+ 項目,因爲要實現一些隨心所欲(想到哪是哪)的功能。就被 Tauri 摧殘的不輕。查過很多相關資料,對 Tauri 也有了一些新的體會(認知有限,不保證完全正確,請自行判斷)。

關於 WA+

WA+ = W(eb) + A(pp) + more...
🤩 哇,無限可能!

WA+[1] - Making a web page more like a desktop application is just the beginning, the possibilities are unlimited, up to your imagination!

Tauri 概覽

綜合來看,Tauri JS API[18] 確實提供了很多便捷 API 供前端使用,但是有些底層方法並未暴露,而 Tauri Rust API[19] 則要強大很多。

開發問題

資源 & 文檔

開發準備

編輯器推薦使用 Visual Studio Code[28],需要安裝的插件:

常見問題

子窗口不能使用 __TAURI__ API

新創建的遠程 URL 子窗口無法使用 Tauri API,因爲這與 Tauri 架構安全是違背的,以下有兩條相關 issues:

簡單概括爲:任何與 IPC 相關的問題都觸及到了 Tauri 核心,並不能快速解決此類問題,但在 v2,v3 或未來更高的版本會有所改進。Tauri 不會在外部 URL 開的窗口上注入 Tauri API,如果項目沒有本地資源,可以通過將 distDir 設置爲遠程 URL 來解決這個問題,或者在使用的運行時更改它。但這種情況下只有一個外部 URL 能夠訪問 Tauri API,其實就是修改 tauri.conf.json 中配置的 build.devPath(開發環境) 和 build.distDir (生產環境)字段。

Brownfield vs Isolation 模式

Brownfield 模式 [34] 是使用 Tauri 的最簡單、最直接的模式,因爲它儘可能地與現有的前端項目兼容。但也並非完全兼容(API 未被瀏覽器廣泛支持,Tauri 正在實現中的),請參閱 不兼容部分 [35]。

Isolation 模式 [36] 下前端發送到 Tauri Core 之前會被注入的一個安全的應用程序攔截和修改傳入的 IPC 消息(使用 iframe[37] 沙盒隔離,使用瀏覽器的 SubtleCrypto[38] 來對數據進行加密。爲了確保安全,每次運行應用時都會生成新的密鑰),來避免被前端惡意調用。

總結:所以老項目想使用 Tauri 進行套殼,想快速上線,可以考慮 Brownfield 模式。使用 Isolation 模式則更加安全,通信時消息加解密相比於 Brownfield 模式會存在額外的開銷成本,除非高性能要求,否則 AES-GCM 身份驗證算法的成本幾乎可以忽略不計。

評價 Tauri

在技術羣,文章評論區也有一些朋友問過我:” 如何看待 Tauri?“,我也只是業餘折騰,寫過幾篇淺顯的文章而已。

以我目前的瞭解來看,覺得它很可能成爲下一代跨端(桌面,移動端)方案,但前提是它真的實現了比較易用的移動端綁定(目前還在計劃中)。Web 的生態奠定了今天的互聯網基礎,前端技術又是層出不窮,快速迭代。而 Tauri 想做的事情就是實現 Webview 和系統之間的橋接層(站在巨人的肩膀)。所以跨多少個端,提供什麼樣的能力是 Tauri 需要考慮的事情,開發應用功能是我們需要考慮的事情。Tauri 未提供的支持,我們也可以通過它的插件機制去擴展。

References

[1]

WA+: https://github.com/lencx/WA

[2]

Electron: https://www.electronjs.org/

[3]

Chromium: https://www.chromium.org/

[4]

Tauri 基準測試: https://tauri.app/v1/references/benchmarks

[5]

Tauri GitHub Action: https://github.com/tauri-apps/tauri-action

[6]

Tauri Updater: https://tauri.app/v1/guides/distribution/updater

[7]

tauri icons: https://tauri.app/v1/guides/features/icons

[8]

ASAR: https://www.electronjs.org/docs/latest/tutorial/asar-archives

[9]

vite: https://vitejs.dev

[10]

react: https://reactjs.org

[11]

vue: https://vuejs.org

[12]

svelte: https://svelte.dev

[13]

Tauri Window: https://tauri.app/v1/api/js/window

[14]

window-shadows: https://github.com/tauri-apps/window-shadows

[15]

window-vibrancy: https://github.com/tauri-apps/window-vibrancy

[16]

Tauri Command: https://tauri.app/v1/guides/features/command

[17]

Tauri Events: https://tauri.app/v1/guides/features/events

[18]

Tauri JS API: https://tauri.app/v1/api/js/

[19]

Tauri Rust API: https://docs.rs/tauri/1.2.0/tauri/

[20]

Tauri doc: https://tauri.app/

[21]

Awesome Tauri: https://github.com/tauri-apps/awesome-tauri

[22]

Tauri issues: https://github.com/tauri-apps/tauri/issues

[23]

Tauri discussions: https://github.com/tauri-apps/tauri/discussions

[24]

MDN doc: https://developer.mozilla.org/en-US/

[25]

Rust doc: https://doc.rust-lang.org/book/

[26]

npmjs: https://www.npmjs.com/

[27]

crates.io: https://crates.io/

[28]

Visual Studio Code: https://code.visualstudio.com/

[29]

Tauri: https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode

[30]

rust-analyzer: https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer

[31]

crates: https://marketplace.visualstudio.com/items?itemName=serayuzgur.crates

[32]

[bug] cant use window.TAURI with remote url: https://github.com/tauri-apps/tauri/issues/4837

[33]

[feat] Inject window.TAURI in allowed remote URLs: https://github.com/tauri-apps/tauri/issues/5088

[34]

Brownfield 模式: https://tauri.app/v1/references/architecture/inter-process-communication/brownfield

[35]

不兼容部分: https://tauri.app/v1/references/architecture/inter-process-communication/brownfield#incompatibilities

[36]

Isolation 模式: https://tauri.app/v1/references/architecture/inter-process-communication/isolation

[37]

iframe: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe

[38]

SubtleCrypto: https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/uBhG-CCS7WRXmSgVFamhbA