ASP.NET Core Blazor WebAssembly bouwtools en ahead-of-time (AOT) compilatie
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
In dit artikel worden de buildhulpprogramma's voor zelfstandige Blazor WebAssembly-apps beschreven en wordt beschreven hoe u een app compileert vóór de implementatie met AOT-compilatie (Ahead-Of-Time).
Hoewel het artikel zich voornamelijk richt op zelfstandige Blazor WebAssembly-apps, is het gedeelte over heapgrootte voor sommige browsers van mobiele apparaten ook van toepassing op het klantzijdeproject (.Client
) van een Blazor Web App.
.NET WebAssembly-bouwtools
De .NET WebAssembly-buildhulpprogramma's zijn gebaseerd op Emscripten, een compilerhulpprogrammaketen voor het webplatform. Als u de buildhulpprogramma's wilt installeren, gebruikt u van de volgende methoden:
- Selecteer voor de ASP.NET- en web-ontwikkeling workload in het installatieprogramma van Visual Studio de optie .NET WebAssembly-buildhulpprogramma's uit de lijst met optionele onderdelen.
- Voer
dotnet workload install wasm-tools
uit in een shell met beheeropdrachten.
Notitie
.NET WebAssembly-buildhulpprogramma's voor .NET 6-projecten
De wasm-tools
workload installeert de buildhulpprogramma's voor de nieuwste versie. De huidige versie van de buildhulpprogramma's is echter niet compatibel met bestaande projecten die zijn gebouwd met .NET 6. Projecten die gebruikmaken van de buildhulpprogramma's die zowel .NET 6 als een latere release moeten ondersteunen, moeten gebruikmaken van meerdere targeting.
Gebruik de wasm-tools-net6
-workload voor .NET 6-projecten bij het ontwikkelen van apps met de .NET 7 SDK. Als u de wasm-tools-net6
-workload wilt installeren, voert u de volgende opdracht uit vanuit een shell met beheerdersopdrachten:
dotnet workload install wasm-tools-net6
AOT-compilatie (Ahead-Of-Time)
Blazor WebAssembly biedt ondersteuning voor AOT-compilatie (ahead-of-time), waar u uw .NET-code rechtstreeks in WebAssembly kunt compileren. AOT-compilatie resulteert in runtime-prestatieverbeteringen ten koste van een grotere app-grootte.
Zonder AOT-compilatie in te schakelen, worden Blazor WebAssembly apps uitgevoerd in de browser met behulp van een .NET Intermediate Language (IL) interpreter geïmplementeerd in WebAssembly met gedeeltelijk Just-In-Time -ondersteuning (JIT) runtime-ondersteuning, informeel aangeduid als de Jiterpreter. Omdat de .NET IL-code wordt geïnterpreteerd, worden apps doorgaans langzamer uitgevoerd dan op een .NET JIT-runtime aan de serverzijde zonder il-interpretatie. Met AOT-compilatie wordt dit prestatieprobleem opgelost door de .NET-code van een app rechtstreeks in WebAssembly te compileren voor systeemeigen WebAssembly-uitvoering door de browser. De verbetering van de AOT-prestaties kan aanzienlijke verbeteringen opleveren voor apps die CPU-intensieve taken uitvoeren. Het nadeel van het gebruik van AOT-compilatie is dat AOT-gecompileerde apps over het algemeen groter zijn dan hun IL-geïnterpreteerde tegenhangers, zodat ze meestal langer duren om naar de client te downloaden wanneer ze voor het eerst worden aangevraagd.
Zonder AOT-compilatie in te schakelen, worden Blazor WebAssembly apps uitgevoerd in de browser met behulp van een .NET Intermediate Language (IL) interpreter geïmplementeerd in WebAssembly. Omdat de .NET-code wordt geïnterpreteerd, worden apps doorgaans langzamer uitgevoerd dan op een .NET-Just-In-Time -runtime (Just-In-Time) aan de serverzijde. Met AOT-compilatie wordt dit prestatieprobleem opgelost door de .NET-code van een app rechtstreeks in WebAssembly te compileren voor systeemeigen WebAssembly-uitvoering door de browser. De verbetering van de AOT-prestaties kan aanzienlijke verbeteringen opleveren voor apps die CPU-intensieve taken uitvoeren. Het nadeel van het gebruik van AOT-compilatie is dat AOT-gecompileerde apps over het algemeen groter zijn dan hun IL-geïnterpreteerde tegenhangers, zodat ze meestal langer duren om naar de client te downloaden wanneer ze voor het eerst worden aangevraagd.
Zie ASP.NET Core Blazor WebAssembly buildhulpprogramma's en AOT-compilatievoor richtlijnen over het installeren van de .NET WebAssembly-buildhulpprogramma's.
Als u WebAssembly AOT-compilatie wilt inschakelen, voegt u de eigenschap <RunAOTCompilation>
die is ingesteld op true
toe aan het projectbestand van de Blazor WebAssembly-app:
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
Als u de app wilt compileren naar WebAssembly, publiceert u de app. Het publiceren van de Release
-configuratie zorgt ervoor dat de .NET Intermediate Language (IL) koppeling ook wordt uitgevoerd om de grootte van de gepubliceerde app te verminderen:
dotnet publish -c Release
WebAssembly AOT-compilatie wordt alleen uitgevoerd wanneer het project wordt gepubliceerd. AOT-compilatie wordt niet gebruikt wanneer het project wordt uitgevoerd tijdens de ontwikkeling (Development
omgeving), omdat AOT-compilatie meestal enkele minuten duurt voor kleine projecten en mogelijk veel langer voor grotere projecten. Het verminderen van de buildtijd voor AOT-compilatie is in ontwikkeling voor toekomstige releases van ASP.NET Core.
De grootte van een AOT-gecompileerde Blazor WebAssembly-app is over het algemeen groter dan de grootte van de app als deze is gecompileerd in .NET IL:
Hoewel het grootteverschil afhankelijk is van de app, zijn de meeste door AOT gecompileerde apps ongeveer twee keer zo groot als hun IL-gecompileerde versies. Dit betekent dat het gebruik van AOT-compilatie de laadtijdprestatie inruilt voor runtimeprestaties. Of dit compromis het waard is om AOT-compilatie te gebruiken, is afhankelijk van uw app. Blazor WebAssembly apps die CPU-intensief zijn, profiteren over het algemeen het meeste van AOT-compilatie.
De grotere grootte van een AOT-gecompileerde app is te wijten aan twee voorwaarden:
- Er is meer code vereist om .NET IL-instructies op hoog niveau weer te geven in systeemeigen WebAssembly.
- AOT knipt beheerde DLL's niet uit wanneer de app wordt gepubliceerd. Blazor vereist de DLL's voor weerspiegelingsmetagegevens en om bepaalde .NET-runtimefuncties te ondersteunen. Het vereisen van de DLL's op de client verhoogt de downloadgrootte, maar biedt een meer compatibele .NET-ervaring.
Notitie
Zie WasmApp.Common.targets
(dotnet/runtime
GitHub-opslagplaats) voor Mono/WebAssembly MSBuild-eigenschappen en -doelen. Officiële documentatie voor algemene MSBuild-eigenschappen is gepland per Document Blazor MSBuild-configuratieopties (dotnet/docs
#27395).
.NET IL bijsnijden na AOT-compilatie (Ahead-of-Time)
Met de optie WasmStripILAfterAOT
MSBuild kunt u de .NET Intermediate Language (IL) voor gecompileerde methoden verwijderen na het uitvoeren van AOT-compilatie naar WebAssembly, waardoor de _framework
map kleiner wordt.
In het projectbestand van de app:
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
<WasmStripILAfterAOT>true</WasmStripILAfterAOT>
</PropertyGroup>
Met deze instelling wordt de IL-code voor de meeste gecompileerde methoden weggeknipt, inclusief methoden uit bibliotheken en methoden in de app. Niet alle gecompileerde methoden kunnen worden ingekort, omdat sommige nog steeds vereist zijn voor de .NET-interpreter tijdens runtime.
Om een probleem met de optie voor bijsnijden te melden, gelieve een probleem te openen in de dotnet/runtime
GitHub-opslagplaats.
Schakel de eigenschap bijsnijden uit als het voorkomt dat uw app normaal functioneert.
<WasmStripILAfterAOT>false</WasmStripILAfterAOT>
Heapgrootte voor sommige browsers voor mobiele apparaten
Wanneer u een Blazor-app bouwt die wordt uitgevoerd op de client en gericht is op browsers voor mobiele apparaten, met name Safari op iOS, kan het nodig zijn om het maximale geheugen voor de app te beperken met behulp van de MSBuild-eigenschap EmccMaximumHeapSize
. Zie Host en implementeer ASP.NET Core Blazor WebAssemblyvoor meer informatie.
Runtime opnieuw koppelen
Een van de grootste onderdelen van een Blazor WebAssembly-app is de op WebAssembly gebaseerde .NET Runtime (dotnet.wasm
) die de browser moet downloaden wanneer de app voor het eerst wordt geopend door de browser van een gebruiker. Als u de .NET WebAssembly-runtime opnieuw koppelt, wordt ongebruikte runtimecode beperkt en wordt de downloadsnelheid dus verbeterd.
Voor het opnieuw koppelen van runtime is de installatie van de .NET WebAssembly-buildhulpprogramma's vereist. Zie Hulpprogramma's voor ASP.NET Core Blazorvoor meer informatie.
Wanneer de .NET WebAssembly-buildhulpprogramma's zijn geïnstalleerd, wordt runtime-herkoppeling automatisch uitgevoerd wanneer een app wordt gepubliceerd in de Release
-configuratie. De groottevermindering is bijzonder dramatisch bij het uitschakelen van globalisering. Zie ASP.NET Core Blazor globalisatie en lokalisatievoor meer informatie.
Belangrijk
Bij het opnieuw koppelen van runtime worden JavaScript-aanroepbare .NET-methoden van de klasse-instantie verwijderd, tenzij ze beschermd zijn. Zie .NET-methoden aanroepen vanuit JavaScript-functies in ASP.NET Core Blazorvoor meer informatie.
Eén instructie, meerdere gegevens (SIMD)
Blazor gebruikt WebAssembly Single Instruction, Multiple Data (SIMD) om de doorvoer van vectorized berekeningen te verbeteren door een bewerking uit te voeren op meerdere stukjes gegevens parallel met behulp van één instructie.
Als u SIMD wilt uitschakelen, bijvoorbeeld bij het richten van oude browsers of browsers op mobiele apparaten die geen SIMD ondersteunen, stelt u de eigenschap <WasmEnableSIMD>
in op false
in het projectbestand van de app (.csproj
):
<PropertyGroup>
<WasmEnableSIMD>false</WasmEnableSIMD>
</PropertyGroup>
Zie .NET WebAssembly-toepassingen configureren en hosten: SIMD - Enkele instructie, meerdere gegevens en houd er rekening mee dat de richtlijnen niet zijn geversied en van toepassing zijn op de nieuwste openbare release.
Blazor gebruikt WebAssembly Single Instruction, Multiple Data (SIMD) om de doorvoer van vectorized berekeningen te verbeteren door een bewerking uit te voeren op meerdere stukjes gegevens parallel met behulp van één instructie.
Als u SIMD wilt inschakelen, voegt u de eigenschap <WasmEnableSIMD>
toe die is ingesteld op true
in het projectbestand van de app (.csproj
):
<PropertyGroup>
<WasmEnableSIMD>true</WasmEnableSIMD>
</PropertyGroup>
Zie .NET WebAssembly-toepassingen configureren en hosten: SIMD - Enkele instructie, meerdere gegevens en houd er rekening mee dat de richtlijnen niet zijn geversied en van toepassing zijn op de nieuwste openbare release.
Afhandeling van uitzonderingen
Uitzonderingsafhandeling is standaard ingeschakeld. Als u uitzonderingsafhandeling wilt uitschakelen, voegt u de eigenschap <WasmEnableExceptionHandling>
toe met een waarde van false
in het projectbestand van de app (.csproj
):
<PropertyGroup>
<WasmEnableExceptionHandling>false</WasmEnableExceptionHandling>
</PropertyGroup>
Als u de verwerking van WebAssembly-uitzonderingen wilt inschakelen, voegt u de eigenschap <WasmEnableExceptionHandling>
toe met een waarde van true
in het projectbestand van de app (.csproj
):
<PropertyGroup>
<WasmEnableExceptionHandling>true</WasmEnableExceptionHandling>
</PropertyGroup>
Zie de volgende bronnen voor meer informatie:
- .NET WebAssembly-toepassingen configureren en hosten: EH - Uitzonderingsafhandeling
- afhandeling van uitzonderingen