Delen via


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).

.NET WebAssembly-bouwtools

De .NET WebAssembly-buildhulpprogramma's zijn gebaseerd op Emscripten, een compilerhulpprogrammaketen voor het webplatform.

Als u de buildhulpprogramma's wilt installeren als een .NET-workload, gebruikt u een 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. De optie zorgt voor het volgende:

    • De workload is geïnstalleerd voor de nieuwste .NET SDK.
    • Wanneer er een nieuwe versie van Visual Studio wordt uitgebracht en deze een nieuwe .NET SDK bevat, installeert de optie de workload voor de nieuwe SDK.
  • U kunt ook de volgende opdracht uitvoeren in een shell met beheeropdrachten om de meest recente workload te installeren op de nieuwste .NET SDK die beschikbaar is op het systeem:

    dotnet workload install wasm-tools
    

Installeer de wasm-tools-net{MAJOR VERSION} workload om een eerdere .NET-release met een bepaalde .NET SDK te targeten:

  • De {MAJOR VERSION} tijdelijke aanduiding wordt vervangen door het primaire versienummer van de .NET-release waarop u zich wilt richten (bijvoorbeeld wasm-tools-net8 voor .NET 8).
  • Workloads worden geïnstalleerd per .NET SDK. Als u de wasm-tools workload voor één SDK installeert, wordt deze niet beschikbaar voor andere SDK's op het systeem.
  • U moet de juiste workload installeren voor elke .NET SDK-versie die u wilt gebruiken.

In de volgende lijst ziet u welke workload moet worden geïnstalleerd voor elke .NET SDK, afhankelijk van de apps waarop u zich wilt richten. Hoewel meerdere rijen dezelfde workloadnaam kunnen bevatten, verschillen de workloads altijd iets voor elke specifieke .NET SDK.

  • De .NET 9 SDK gebruiken
    • Het targeten van .NET 9 vereist wasm-tools.
    • Het richten op .NET 8 vereist wasm-tools-net8.
  • Bij gebruik van de .NET 8 SDK: Het targeten van .NET 8 vereist wasm-tools.

AOT-compilatie (vooruitcompilatie)

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 ze zouden draaien op een server-side .NET-just-in-time (JIT) runtime. 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 ) voor WasmApp.Common.targets/WebAssembly MSBuild-eigenschappen en -doelen. Officiële documentatie voor algemene MSBuild-eigenschappen is gepland per Document Blazor MSBuild-configuratieopties (dotnet/docs #27395).

Prestatie

Zie ASP.NET Core Blazor WebAssembly runtime-prestaties voor richtlijnen voor prestaties:

  • Heapgrootte voor sommige mobiele apparaatbrowsers
  • Runtime opnieuw koppelen
  • Eén instructie, meerdere gegevens (SIMD)
  • .NET IL verwijderen na AOT-compilatie (.NET 8 of hoger)

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:

Aanvullende informatiebronnen