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 v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
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 v tomto článku ve verzi .NET 9.
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 některých prohlížečů mobilních zařízení platí také pro projekt na straně klienta (.Client
) oddílu o velikosti haldy Blazor Web App.
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 WebAssembly true
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 Msbuild dokumentu blazor (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)
Blazor používá metodu WebAssembly Single Instruction, Multiple Data (SIMD) ke zlepšení propustnosti vektorizovaných výpočtů provedením operace na více částech dat paralelně pomocí jediné instrukce.
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.
Blazor používá metodu WebAssembly Single Instruction, Multiple Data (SIMD) ke zlepšení propustnosti vektorizovaných výpočtů provedením operace na více částech dat paralelně pomocí jediné instrukce.
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ší informace naleznete v následujících zdrojích: