跳至主要內容

對 WebAssembly (Wasm) 的支援

當為網路建置應用程式時,Flutter 和 Dart 支援 WebAssembly 作為編譯目標。

開始使用

#

若要試用使用 Wasm 的預建 Flutter 網頁應用程式,請查看 Wonderous 示範應用程式

若要在您自己的應用程式中實驗 Wasm,請使用下列步驟。

切換到最新版本的 Flutter

#

切換到 Flutter 3.24 或更高版本,以執行並編譯 Flutter 應用程式為 WebAssembly。為確保您執行的是最新版本,請執行 flutter upgrade

確保應用程式的依賴項相容

#

嘗試預設範本的範例應用程式,或選擇任何已遷移為與 Wasm 相容的 Flutter 應用程式。

修改索引頁面

#

請確保您的應用程式的 web/index.html 已更新為 Flutter 3.22 及更新版本的最新Flutter 網頁應用程式初始化

如果您想使用預設值,請刪除 web/ 目錄的內容,並執行下列命令以重新產生它們

flutter create . --platforms web

執行或建置您的應用程式

#

若要使用 Wasm 執行應用程式以進行開發或測試,請將 --wasm 標誌與 flutter run 命令搭配使用。

flutter run -d chrome --wasm

若要使用 Wasm 建置網頁應用程式,請將 --wasm 標誌新增至現有的 flutter build web 命令。

flutter build web --wasm

該命令會將輸出產生到相對於套件根目錄的 build/web 目錄中,就像 flutter build web 一樣。

在相容的網路瀏覽器中開啟應用程式

#

即使使用 --wasm 標誌,Flutter 仍會將應用程式編譯為 JavaScript。如果執行階段未偵測到 WasmGC 支援,則會使用 JavaScript 輸出,因此應用程式仍可在所有主要瀏覽器中運作。

您可以藉由檢查在編譯期間設定的 dart2wasm 環境變數(較佳方式)來驗證應用程式是否實際使用 Wasm 執行。

dart
const isRunningWithWasm = bool.fromEnvironment('dart.tool.dart2wasm');

或者,您可以使用數字表示法的差異來測試是否使用原生 (Wasm) 數字表示法。

dart
final isRunningWithWasm = identical(double.nan, double.nan);

瞭解更多關於瀏覽器相容性的資訊

#

若要執行已編譯為 Wasm 的 Flutter 應用程式,您需要支援 WasmGC 的瀏覽器。

Chromium 和 V8 自 119 版起支援 WasmGC。iOS 上的 Chrome 使用 WebKit,後者尚未支援 WasmGC。Firefox 宣布在 Firefox 120 中穩定支援 WasmGC,但由於已知的限制,目前無法運作(請參閱下方詳細資訊)。

  • 為何不使用 Firefox? Firefox 120 及更新版本先前可以執行 Flutter/Wasm,但它們遇到一個錯誤,阻礙了與 Flutter Wasm 渲染器的相容性。請追蹤此錯誤以取得詳細資訊。
  • 為何不使用 Safari? Safari 尚未支援 WasmGC。請追蹤此錯誤以取得詳細資訊。

使用相容的 JS 互通程式庫

#

為了支援編譯為 Wasm,Dart 已變更它如何啟用與瀏覽器和 JavaScript API 的互通性。這會阻止使用 dart:htmlpackage:js 的 Dart 程式碼編譯為 Wasm。

相反地,Dart 現在提供以靜態 JS 互通性為基礎的新輕量互通解決方案

若要深入瞭解 Dart 中的 JS 互通性,請參閱 Dart 的JS 互通性文件頁面。