跳到主要內容

縮小應用程式大小

透過 Tauri,我們努力減少應用程式的環境足跡,方法是盡可能使用較少的系統資源,提供不需要執行階段評估的已編譯系統,並提供指南,讓工程師在不犧牲效能或安全性的情況下,進一步縮小應用程式。透過節省資源,我們盡一份心力協助您協助我們拯救地球,這是 21 世紀公司唯一應關心的重點。

因此,如果您有興趣了解如何改善應用程式的規模和效能,請繼續閱讀!

無法衡量就無法改善

在最佳化應用程式之前,您需要找出在應用程式中佔用空間的項目!以下是一些可以協助您執行的工具

  • cargo-bloat - 一個 Rust 工具程式,用於判斷在應用程式中佔用最多空間的項目。它會提供一個極佳的已排序概觀,顯示最重要的 Rust 函式。

  • cargo-expand - 巨集讓您的 Rust 程式碼更簡潔且更容易閱讀,但它們也是隱藏的規模陷阱!使用 cargo-expand 來查看這些巨集在幕後產生什麼。

  • rollup-plugin-visualizer - 一個工具,用於從您的 Rollup 捆綁產生美觀(且有見解的)圖形。非常方便,用於找出哪些 JavaScript 相依性對您的最終捆綁大小貢獻最多。

  • rollup-plugin-graph - 您注意到一個相依性包含在您的最終前端捆綁中,但您不確定原因?rollup-plugin-graph 會產生與 Graphviz 相容的視覺化,顯示您的整個相依性圖形。

這些只是您可能使用的幾個工具。務必查看您的前端打包器外掛程式清單,以取得更多資訊!

檢查清單

  1. 壓縮 JavaScript
  2. 最佳化依賴項
  3. 最佳化圖片
  4. 移除不必要的自訂字型
  5. 允許清單設定檔
  6. Rust 編譯時間最佳化
  7. 剝離
  8. UPX

壓縮 JavaScript

JavaScript 佔用一般 Tauri 應用程式很大一部分,因此讓 JavaScript 盡可能精簡非常重要。

你可以從許多 JavaScript 捆綁器中選擇;熱門的選擇包括 Vitewebpackrollup。只要正確設定,所有這些捆綁器都可以產生壓縮的 JavaScript,因此請參閱你的捆綁器文件以取得特定選項。一般來說,你應該確保

啟用 tree shaking

此選項會從你的套件中移除未使用的 JavaScript。所有熱門的捆綁器預設都啟用此選項。

啟用壓縮

壓縮會移除不必要的空白,縮短變數名稱,並套用其他最佳化。大多數捆綁器預設都啟用此選項;一個值得注意的例外是 rollup,你需要像 rollup-plugin-terserrollup-plugin-uglify 這樣的外掛程式。

注意:你可以使用像 terseresbuild 這樣的壓縮器作為獨立工具。

停用原始碼對應

原始碼對應表在使用編譯成 JavaScript 的語言(例如 TypeScript)進行開發時,可提供愉快的開發人員體驗。由於原始碼對應表往往相當龐大,因此在建置生產環境時,您必須將其停用。它們對您的最終使用者沒有任何好處,因此實際上是多餘的負擔。

最佳化依賴項

許多熱門函式庫都有更小且更快的替代方案,您可以選擇使用這些替代方案。

您使用的多數函式庫本身依賴許多函式庫,因此乍看之下看似不起眼的函式庫可能會為您的應用程式增加數 MB 的程式碼。

您可以使用 Bundlephobia 來找出 JavaScript 依賴項的成本。檢查 Rust 依賴項的成本通常較為困難,因為編譯器會進行許多最佳化。

如果您找到一個看似過於龐大的函式庫,請在 Google 上搜尋,很有可能其他人已經有過相同的想法並建立了一個替代方案。一個很好的範例是 Moment.js 和其 許多替代方案

但請記住:最佳的依賴項是不依賴,這表示您應該永遠優先使用語言內建函式,而非第三方套件。

最佳化圖片

根據 Http Archive,圖片是 網站負擔的主要來源。因此,如果您的應用程式包含圖片或圖示,請務必最佳化它們!

您可以選擇各種手動選項 (GIMPPhotoshopSquoosh) 或您最喜歡的 frontend 建置工具的插件 (vite-imagetoolsvite-plugin-imageminimage-minimizer-webpack-plugin)。

請注意,大多數插件使用的 imagemin 函式庫 已正式停止維護

使用現代影像格式

與 jpeg 相比,webpavif 等格式可將大小縮小多達 95%,同時維持極佳的視覺準確度。您可以使用 Squoosh 等工具在您的影像上嘗試不同的格式。

適當地調整影像大小

沒有人會欣賞您在應用程式中發布 6K 原始影像,因此請務必適當地調整影像大小。在螢幕上顯示較大的影像應調整為比佔用較少螢幕空間的影像更大的尺寸。

不要使用回應式影像

在網頁環境中,您應該使用 回應式圖片 為每個使用者動態載入正確的圖片大小。由於您並未透過網路動態散布圖片,使用回應式圖片只會讓您的應用程式因重複的副本而徒增負擔。

移除元資料

直接從相機或股票照片網站取得的圖片通常包含相機和鏡頭型號或攝影師的元資料。這些不僅是浪費的位元組,元資料屬性也可能包含潛在的敏感資訊,例如照片的時間、日期和地點。

移除不必要的自訂字型

考慮不要在應用程式中加入自訂字型,而改用系統字型。如果您必須加入自訂字型,請確定它們採用現代的最佳化格式,例如 woff2

字型可能相當大,因此使用作業系統中已包含的字型可以減少應用程式的佔用空間。它也能避免 FOUT(未設定樣式的文字閃爍),並讓您的應用程式感覺更「原生」,因為它使用與所有其他應用程式相同的字型。

如果您必須包含自訂字型,請確定您以現代格式(例如 woff2)包含它們,因為這些格式通常比舊版格式小很多。

在您的 CSS 中使用所謂的「系統字型堆疊」。有許多變體,但以下 3 個基本變體可以讓您開始使用

無襯線

font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial,
sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';

襯線

font-family: Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid
Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe
UI Symbol;

等寬

font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation
Mono, monospace;

允許清單設定

您可以在 allowlist 設定檔中僅啟用您需要的 Tauri API 功能,以縮小應用程式的規模。

allowlist 設定檔決定要啟用哪些 API 功能;停用的功能將不會編譯到您的應用程式中。這是減輕一些額外負擔的簡單方法。

來自典型 tauri.conf.json 的範例

{
"tauri": {
"allowlist": {
"all": false,
"fs": {
"writeFile": true
},
"shell": {
"execute": true
},
"dialog": {
"save": true
}
}
}
}

Rust 編譯時間最佳化

設定您的 cargo 專案以利用 Rust 的大小最佳化功能。 Rust 可執行檔為何如此龐大? 提供了為何這很重要的絕佳說明和深入的演練。同時,最小化 Rust 二進位檔案大小 較為最新,並提供了一些額外的建議。

Rust 以產生大型二進位檔案而惡名昭彰,但您可以指示編譯器最佳化最終可執行檔的大小。

Cargo 公開了幾個選項,用於決定編譯器如何產生您的二進位檔案。Tauri 應用程式的「建議」選項如下

[profile.release]
panic = "abort" # Strip expensive panic clean-up logic
codegen-units = 1 # Compile crates one after another so the compiler can optimize better
lto = true # Enables link to optimizations
opt-level = "s" # Optimize for binary size
strip = true # Remove debug symbols
備註

還有 opt-level = "z" 可用於縮小產生的二進位檔案大小。"s""z" 有時可能比其他選項小,所以請使用您的應用程式測試它!

我們已經從 "s" 看到了 Tauri 範例應用程式的較小二進位檔案大小,但實際應用程式可能總是不同。

有關每個選項和更多內容的詳細說明,請參閱 Cargo 書籍的 Profiles 區段

停用 Tauri 的資產壓縮

預設情況下,Tauri 使用 Brotli 來壓縮最終二進位檔中的資產。Brotli 內嵌一個大型(約 170KiB)查詢表以達成極佳的結果,但如果你內嵌的資源小於此大小或壓縮效果不佳,產生的二進位檔可能會比任何節省的空間還大。

可以透過將 default-features 設為 false 並指定除了 compression 功能以外的所有功能來停用壓縮

[dependencies]
tauri = { version = "...", features = ["objc-exception", "wry"], default-features = false }

不穩定的 Rust 壓縮功能

注意

以下建議都是不穩定的功能,需要 nightly 工具鏈。請參閱 不穩定的功能 文件,以取得更多關於這方面內容的資訊。

以下方法包含使用不穩定的編譯器功能,需要 rust nightly 工具鏈。如果你沒有 nightly 工具鏈 + rust-src nightly 組件,請嘗試以下操作

rustup toolchain install nightly
rustup component add rust-src --toolchain nightly

若要告知 Cargo 目前專案使用 nightly 工具鏈,我們將在專案根目錄建立一個 覆寫檔案,命名為 rust-toolchain.toml。此檔案將包含以下內容

rust-toolchain.toml
[toolchain]
channel = "nightly-2023-01-03" # The nightly release to use, you can update this to the most recent one if you want
profile = "minimal"

Rust 標準函式庫預先編譯。這表示 Rust 安裝速度較快,但編譯器無法最佳化標準函式庫。您可以使用不穩定的標記將最佳化選項套用至其他二進位檔 + 相依性。此標記需要指定目標,因此請了解您鎖定的目標三元組。

cargo tauri build --target <Target triple to build for> -- -Z build-std

如果您在發行設定檔最佳化中使用 panic = "abort",您需要確定 panic_abort crate 已使用 std 編譯。此外,額外的 std 功能可以進一步縮小二進位檔大小。以下兩者都適用

cargo tauri build --target <Target triple to build for> -- -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort

請參閱不穩定文件,以取得有關 -Z build-std-Z build-std-features 的更多詳細資料。

移除

使用移除公用程式從已編譯的應用程式中移除偵錯符號。

已編譯的應用程式包含所謂的「偵錯符號」,其中包含函式和變數名稱。您的最終使用者可能不會在意偵錯符號,因此這是節省一些位元組的相當可靠方法!

最簡單的方法是使用著名的 strip 公用程式移除此偵錯資訊。

strip target/release/my_application

請參閱您本地的 strip 手冊頁,以取得更多資訊和可用的標記,用於指定從二進位檔中移除哪些資訊。

資訊

Rust 1.59 現在內建 strip 版本!可透過將以下內容新增至 Cargo.toml 來啟用

[profile.release]
strip = true # Automatically strip symbols from the binary.

UPX

UPX,Ultimate Packer for eXecutables,是二進制封裝程式中的恐龍。這套維護良好的 23 年老軟體採用 GPL-v2 授權,並有相當寬鬆的使用聲明。我們對授權的理解是,你可以將其用於任何目的(商業或其他用途),無需變更你的授權,除非你修改 UPX 的原始碼。

也許你的目標受眾的網際網路速度非常慢,或者你的應用程式需要安裝在一個微小的 USB 隨身碟上,而上述所有步驟都無法達到你需要的儲存空間。別擔心,我們還有最後一招

UPX 會壓縮你的二進制檔案,並建立一個自解壓縮可執行檔,在執行時會自動解壓縮。

注意

你應該知道,此技術可能會在 Windows 和 macOS 上將你的二進制檔案標記為病毒,因此請自行斟酌使用,並一如往常,使用 Frida 驗證並進行實際的發行測試!

在 macOS 上的使用

brew install upx
yarn tauri build
upx --ultra-brute src-tauri/target/release/bundle/macos/app.app/Contents/macOS/app

Ultimate Packer for eXecutables
Copyright (C) 1996 - 2018
UPX 3.95 Markus Oberhumer, Laszlo Molnar & John Reiser Aug 26th 2018

File size Ratio Format Name
-------------------- ------ ----------- -----------
963140 -> 274448 28.50% macho/amd64 app