ASP.NET nástrojů pro sestavení Core Blazor WebAssembly a kompilace AOT (Head-of-Time)

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Tento článek popisuje nástroje sestavení pro samostatné Blazor WebAssembly aplikace a postup kompilace aplikace před nasazením s předem připravenou kompilací (AOT).

I když se článek primárně zaměřuje na samostatné Blazor WebAssembly aplikace, část o velikosti haldy pro některé prohlížeče mobilních zařízení platí také pro projekt na straně klienta (.Client) Blazor webové aplikace.

Nástroje pro sestavení .NET WebAssembly

Nástroje pro sestavení .NET WebAssembly jsou založené na Emscriptenu, sadě nástrojů kompilátoru pro webovou platformu. K instalaci nástrojů sestavení použijte některý z následujících přístupů:

  • Pro úlohu vývoje ASP.NET a webu v instalačním programu sady Visual Studio vyberte možnost nástroje sestavení .NET WebAssembly ze seznamu volitelných komponent.
  • Spusťte dotnet workload install wasm-tools v příkazovém prostředí pro správu.

Poznámka:

Nástroje pro sestavení .NET WebAssembly pro projekty .NET 6

Úloha wasm-tools nainstaluje nástroje sestavení pro nejnovější verzi. Aktuální verze nástrojů sestavení ale není kompatibilní s existujícími projekty vytvořenými v .NET 6. Projekty používající nástroje sestavení, které musí podporovat rozhraní .NET 6 i novější verzi, musí používat cílení na více verzí.

wasm-tools-net6 Při vývoji aplikací pomocí sady .NET 7 SDK použijte úlohu pro projekty .NET 6. Pokud chcete nainstalovat wasm-tools-net6 úlohu, spusťte z příkazového prostředí pro správu následující příkaz:

dotnet workload install wasm-tools-net6

Kompilace AOT (Head-of-Time)

Blazor WebAssembly podporuje kompilaci AOT (head-of-time), kde můžete kód .NET zkompilovat přímo do WebAssembly. Kompilace AOT vede ke zlepšení výkonu za běhu na úkor větší velikosti aplikace.

Bez povolení kompilace Blazor WebAssembly AOT se aplikace spouští v prohlížeči pomocí interpretu .NET Intermediate Language (IL) implementovaného v WebAssembly s částečnou podporou za běhu (JIT), která se neformálně označuje jako Jiterpreter. Vzhledem k tomu, že je interpretován kód .NET IL, aplikace obvykle běží pomaleji, než by běžely na modulu runtime .NET JIT na straně serveru bez jakékoli interpretace IL. Kompilace AOT řeší tento problém s výkonem kompilací kódu .NET aplikace přímo do WebAssembly pro nativní spuštění WebAssembly prohlížečem. Vylepšení výkonu AOT může přinést dramatická vylepšení pro aplikace, které provádějí úlohy náročné na procesor. Nevýhodou použití kompilace AOT je, že kompilované aplikace AOT jsou obecně větší než jejich protějšky interpretované v IL, takže při prvním požadavku obvykle trvá stažení do klienta déle.

Bez povolení kompilace Blazor WebAssembly AOT aplikace běží v prohlížeči pomocí interpretu .NET Intermediate Language (IL) implementovaného v WebAssembly. Vzhledem k tomu, že je kód .NET interpretován, aplikace obvykle běží pomaleji, než by běžely na straně serveru za běhu (JIT ). Kompilace AOT řeší tento problém s výkonem kompilací kódu .NET aplikace přímo do WebAssembly pro nativní spuštění WebAssembly prohlížečem. Vylepšení výkonu AOT může přinést dramatická vylepšení pro aplikace, které provádějí úlohy náročné na procesor. Nevýhodou použití kompilace AOT je, že kompilované aplikace AOT jsou obecně větší než jejich protějšky interpretované v IL, takže při prvním požadavku obvykle trvá stažení do klienta déle.

Pokyny k instalaci nástrojů sestavení .NET WebAssembly najdete v tématu ASP.NET Nástroje sestavení Core Blazor WebAssembly a kompilace AOT (Head-of-Time).

Pokud chcete povolit kompilaci WebAssembly AOT, přidejte <RunAOTCompilation> vlastnost nastavenou na Blazor WebAssemblytrue soubor projektu aplikace:

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

Pokud chcete aplikaci zkompilovat do WebAssembly, publikujte ji. Release Publikování konfigurace zajišťuje, že se také spustí propojení jazyka IL (.NET Intermediate Language), aby se snížila velikost publikované aplikace:

dotnet publish -c Release

Kompilace WebAssembly AOT se provádí pouze při publikování projektu. Kompilace AOT se nepoužívá, když je projekt spuštěn během vývoje (Development prostředí), protože kompilace AOT obvykle trvá několik minut u malých projektů a potenciálně déle u větších projektů. Zkrácení doby sestavení pro kompilaci AOT je ve vývoji pro budoucí verze ASP.NET Core.

Velikost kompilované Blazor WebAssembly aplikace AOT je obecně větší než velikost aplikace, pokud je zkompilována do .NET IL:

  • I když rozdíl velikosti závisí na aplikaci, většina zkompilovaných aplikací AOT je přibližně dvakrát větší než jejich verze kompilované v il. To znamená, že použití kompilace AOT snižuje výkon při načítání za běhu. To, jestli stojí za použití kompilace AOT, závisí na vaší aplikaci. Blazor WebAssembly aplikace, které jsou náročné na procesor, obecně využívají nejvíce kompilace AOT.

  • Větší velikost kompilované aplikace AOT je způsobená dvěma podmínkami:

    • Další kód je nutný k reprezentaci instrukcí .NET IL vysoké úrovně v nativní WebAssembly.
    • AOT při publikování aplikace neořízne spravované knihovny DLL. Blazor vyžaduje knihovny DLL pro metadata reflexe a podporu určitých funkcí modulu runtime .NET. Vyžadování knihoven DLL na klientovi zvětšuje velikost stahování, ale poskytuje kompatibilní prostředí .NET.

Poznámka:

Informace o vlastnostech a cílech nástroje Mono/WebAssembly MSBuild najdete v tématu WasmApp.Common.targets (dotnet/runtime úložiště GitHub). Oficiální dokumentace pro běžné vlastnosti NÁSTROJE MSBuild se plánuje pro jednotlivé možnosti konfigurace nástroje Document blazor msbuild (dotnet/docs #27395).

Střih .NET IL po předběžné kompilaci (AOT)

Možnost WasmStripILAfterAOT MSBuild umožňuje odebrat .NET Intermediate Language (IL) pro zkompilované metody po provedení kompilace AOT do WebAssembly, což snižuje velikost _framework složky.

V souboru projektu aplikace:

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

Toto nastavení oříznou kód IL pro většinu zkompilovaných metod, včetně metod z knihoven a metod v aplikaci. Ne všechny kompilované metody je možné oříznout, protože některé interpret .NET stále vyžaduje za běhu.

Pokud chcete nahlásit problém s možností oříznutí, otevřete problém v dotnet/runtime úložišti GitHub.

Pokud brání normálnímu spuštění aplikace, zakažte vlastnost oříznutí:

<WasmStripILAfterAOT>false</WasmStripILAfterAOT>

Velikost haldy pro některé prohlížeče mobilních zařízení

Při vytváření Blazor aplikace, která běží na klientovi a cílí na prohlížeče mobilních zařízení, zejména Safari v iOSu, může být vyžadováno snížení maximální paměti aplikace s vlastností EmccMaximumHeapSize MSBuild. Další informace najdete v tématu Hostitel a nasazení ASP.NET Core Blazor WebAssembly.

Opětovné propojení modulu runtime

Jednou z největších Blazor WebAssembly částí aplikace je modul runtime .NET založený na WebAssembly (dotnet.wasm), který musí prohlížeč stáhnout, když je aplikace poprvé přístupná prohlížečem uživatele. Opětovným propojením modulu runtime .NET WebAssembly se oříznou nepoužitý kód modulu runtime a tím se zvýší rychlost stahování.

Opětovné propojení za běhu vyžaduje instalaci nástrojů sestavení .NET WebAssembly. Další informace naleznete v tématu Nástroje pro ASP.NET Core Blazor.

S nainstalovanými nástroji sestavení .NET WebAssembly se při publikování aplikace v Release konfiguraci automaticky provede opětovné propojení modulu runtime. Redukce velikosti je obzvláště dramatická při zakazování globalizace. Další informace najdete v tématu ASP.NET globalizace a lokalizace jádraBlazor.

Důležité

Opětovné propojení modulu runtime oříznou instanci třídy JavaScript-invokable metod .NET, pokud nejsou chráněné. Další informace naleznete v tématu Volání metod .NET z funkcí JavaScriptu v ASP.NET Core Blazor.

Jedna instrukce, více dat (SIMD)

Funkce WebAssembly Single Instruction, Multiple Data (SIMD) může zlepšit propustnost vektorizovaných výpočtů provedením operace s více částmi dat paralelně pomocí jediné instrukce. SIMD je ve výchozím nastavení povolená.

Pokud chcete SIMD zakázat, například při cílení na staré prohlížeče nebo prohlížeče na mobilních zařízeních, která simd nepodporují, nastavte <WasmEnableSIMD> vlastnost na false soubor projektu aplikace (.csproj):

<PropertyGroup>
  <WasmEnableSIMD>false</WasmEnableSIMD>
</PropertyGroup>

Další informace najdete v tématu Konfigurace a hostování aplikací .NET WebAssembly: SIMD – jedna instrukce, více dat a všimněte si, že pokyny nejsou verze a platí pro nejnovější veřejnou verzi.

Funkce WebAssembly Single Instruction, Multiple Data (SIMD) může zlepšit propustnost vektorizovaných výpočtů provedením operace s více částmi dat paralelně pomocí jediné instrukce. SIMD je ve výchozím nastavení zakázané.

Pokud chcete simd povolit, přidejte vlastnost nastavenou <WasmEnableSIMD> do true souboru projektu aplikace (.csproj):

<PropertyGroup>
  <WasmEnableSIMD>true</WasmEnableSIMD>
</PropertyGroup>

Další informace najdete v tématu Konfigurace a hostování aplikací .NET WebAssembly: SIMD – jedna instrukce, více dat a všimněte si, že pokyny nejsou verze a platí pro nejnovější veřejnou verzi.

Ošetření výjimek

Zpracování výjimek je ve výchozím nastavení povolené. Pokud chcete zakázat zpracování výjimek, přidejte <WasmEnableExceptionHandling> vlastnost s hodnotou false v souboru projektu aplikace (.csproj):

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

Pokud chcete povolit zpracování výjimek WebAssembly, přidejte <WasmEnableExceptionHandling> vlastnost s hodnotou true v souboru projektu aplikace (.csproj):

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

Další materiály