共用方式為


ASP.NET 核心 Blazor WebAssembly 建置工具和預先 (AOT) 編譯

注意

這不是這篇文章的最新版本。 關於目前版本,請參閱 本文的 .NET 10 版本

警告

不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。

本文說明獨立 Blazor WebAssembly 應用程式的建置工具,以及如何在部署前使用預先 (AOT) 編譯來編譯應用程式。

.NET WebAssembly 組建工具

.NET WebAssembly 組建工具是以 Web 平台的編譯器工具鏈 Emscripten 為基礎。

若要將建置工具安裝為 .NET 工作負載,請使用下列 任一 方法:

  • 針對 Visual Studio 安裝程式中的 ASP.NET 和 Web 開發工作負載,請從選用元件清單中選取 [.NET WebAssembly 組建工具] 選項。 此選項可確保下列事項:

    • 工作負載已安裝到最新的 .NET SDK。
    • 當新版本的 Visual Studio 發行且其中包含新的 .NET SDK 時,選項會安裝新 SDK 的工作負載。
  • 或者,在 系統管理命令 Shell 中執行下列命令,將最新的工作負載安裝至系統上可用的最新 .NET SDK:

    dotnet workload install wasm-tools
    

若要使用指定的 .NET SDK 來定位先前的 .NET 版本,請安裝 wasm-tools-net{MAJOR VERSION} 工作負載:

  • {MAJOR VERSION} 預留位置將被替換為您要目標的 .NET 發行版的主要版本號碼(例如,wasm-tools-net8 用於 .NET 8)。
  • 工作負載會根據 .NET SDK 安裝。 安裝 wasm-tools 一個特定 SDK 的工作負載不會讓系統上的其他 SDK 可用。
  • 您必須針對您要使用的每個 .NET SDK 版本安裝適當的工作負載。

下列清單顯示要為每個 .NET SDK 安裝的工作負載,取決於您計劃開發的應用程式。 雖然多個資料列可能包含相同的工作負載名稱,但每個特定 .NET SDK 的工作負載一律略有不同。

  • 使用 .NET 10 SDK
    • 以 .NET 10 為目標需要 wasm-tools
    • 以 .NET 9 為目標需要 wasm-tools-net9
    • 以 .NET 8 為目標需要 wasm-tools-net8
  • 使用 .NET 9 SDK
    • 以 .NET 9 為目標需要 wasm-tools
    • 以 .NET 8 為目標需要 wasm-tools-net8
  • 使用 .NET 8 SDK:以 .NET 8 為目標需要wasm-tools

預先編譯 (AOT)

Blazor WebAssembly 支援預先 (AOT) 編譯,您可以在其中直接將 .NET 程式碼編譯成 WebAssembly。 AOT 編譯會導致執行階段的效能獲得改善,但代價是應用程式會比較大。

若未啟用 AOT 編譯,Blazor WebAssembly 應用程式會使用 WebAssembly 中所實作、具有部分 Just-In-Time (JIT) 執行階段支援的 .NET 中繼語言 (IL) 解譯器在瀏覽器中執行,這個解譯器的非正式稱呼是 Jiterpreter。 因為要解譯 .NET IL 程式碼,應用程式的執行速度一般會比在沒有任何 IL 解譯的伺服器端 .NET JIT 執行階段上執行時來得慢。 AOT 編譯解決這個效能問題的方法是,將應用程式的 .NET 程式碼直接編譯到 WebAssembly,以便瀏覽器能以原生方式執行 WebAssembly。 AOT 效能獲得改善後,所執行的工作需要 CPU 密集運算的應用程式也會獲得大幅的效能改善。 使用 AOT 編譯的缺點是,經過 AOT 編譯的應用程式一般會比其進行 IL 解譯的對照項目還大,因此在首次要求下載時,通常需要較長的時間才能下載到用戶端。

若未啟用 AOT 編譯,Blazor WebAssembly 應用程式會使用 WebAssembly 中所實作的 .NET 中繼語言 (IL) 解譯器在瀏覽器中執行。 因為要解譯 .NET 程式碼,應用程式的執行速度一般會比在伺服器端 .NET Just-In-Time (JIT) 執行階段上執行時來得慢。 AOT 編譯解決這個效能問題的方法是,將應用程式的 .NET 程式碼直接編譯到 WebAssembly,以便瀏覽器能以原生方式執行 WebAssembly。 AOT 效能獲得改善後,所執行的工作需要 CPU 密集運算的應用程式也會獲得大幅的效能改善。 使用 AOT 編譯的缺點是,經過 AOT 編譯的應用程式一般會比其進行 IL 解譯的對照項目還大,因此在首次要求下載時,通常需要較長的時間才能下載到用戶端。

如需安裝 .NET WebAssembly 建置工具的指引,請參閱 ASP.NET Core Blazor WebAssembly 建置工具和預先 (AOT) 編譯

若要啟用 WebAssembly AOT 編譯,請將設定為 <RunAOTCompilation>true 屬性新增至 Blazor WebAssembly 應用程式的專案檔:

<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>

若要將應用程式編譯至 WebAssembly,請發行應用程式。 發行 Release 組態可確保 .NET 中繼語言 (IL) 連結也會執行,以減少所發行應用程式的大小:

dotnet publish -c Release

只有在發行專案時,才會執行 WebAssembly AOT 編譯。 在開發期間 (Development 環境) 執行專案時不會使用 AOT 編譯,因為小型專案的 AOT 編譯通常需要幾分鐘的時間,大型專案的 AOT 編譯則可能需要多上許多的時間。 未來的 ASP.NET Core 版本正在開發減少 AOT 編譯建置時間的方法。

經過 AOT 編譯的 Blazor WebAssembly 應用程式,其大小一般會大於編譯至 .NET IL 的應用程式所具有的大小:

  • 雖然大小差異取決於應用程式,但大部分經過 AOT 編譯的應用程式都會有其 IL 編譯版本兩倍左右的大小。 這表示使用 AOT 編譯是拿載入階段的效能換得執行階段的效能。 此權衡結果是否值得您使用 AOT 編譯取決於您的應用程式。 一般來說,需要 CPU 密集運算的 Blazor WebAssembly 應用程式可從 AOT 編譯獲得做大的好處。

  • 經過 AOT 編譯的應用程式之所以會比較大,是兩個情況所造成的:

    • 需要更多程式碼才能在原生 WebAssembly 中呈現高階 .NET IL 指令。
    • 在發行應用程式時,AOT 不會修剪受控 DLL。 Blazor 需要 DLL 來處理反射中繼資料及支援某些 .NET 執行時功能。 用戶端上需要 DLL 會增加下載大小,但可提供更相容的 .NET 體驗。

注意

關於 Mono/WebAssembly MSBuild 屬性和目標,請參閱 WasmApp.Common.targets (dotnet/runtime GitHub 存放庫)。 官方文件針對一般 MSBuild 屬性將根據 文件 blazor msbuild 配置選項(dotnet/docs #27395) 進行規劃。

績效

如需效能指引,請參閱 ASP.NET Core Blazor WebAssembly 運行時間效能

  • 某些行動裝置瀏覽器的堆積大小
  • 執行階段重新連結
  • 單指令多資料 (SIMD)
  • 在完成預先編譯 (AOT) 編譯後修剪 .NET IL(適用於 .NET 8 或更高版本)

例外狀況處理

預設會啟用例外狀況處理。 若要停用例外處理,請在應用程式的專案檔案 (<WasmEnableExceptionHandling>) 中新增屬性 false,其值為 .csproj

<PropertyGroup>
  <WasmEnableExceptionHandling>false</WasmEnableExceptionHandling>
</PropertyGroup>

若要啟用 WebAssembly 例外狀況處理,請在應用程式的專案檔 (<WasmEnableExceptionHandling>) 中新增 true 屬性,並將其值設為 .csproj

<PropertyGroup>
  <WasmEnableExceptionHandling>true</WasmEnableExceptionHandling>
</PropertyGroup>

如需詳細資訊,請參閱以下資源:

其他資源