Delen via


ASP.NET Core Blazor opstarten

Opmerking

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 wordt de configuratie van het opstarten van apps uitgelegd Blazor .

Zie Configuratie in ASP.NET Core voor algemene richtlijnen voor ASP.NET Core-app-configuratie voor ontwikkeling aan de serverzijde.

Opstartproces en configuratie

Het Blazor opstartproces is automatisch en asynchroon via het Blazor script (blazor.*.js), waarbij de * plaatsaanduiding is:

  • web voor een Blazor Web App
  • server voor een Blazor Server app
  • webassembly voor een Blazor WebAssembly app

Het Blazor opstartproces is automatisch en asynchroon via het Blazor script (blazor.*.js), waarbij de * plaatsaanduiding is:

  • server voor een Blazor Server app
  • webassembly voor een Blazor WebAssembly app

Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Om Blazor handmatig te starten:

Blazor Web App:

  • Voeg een autostart="false" kenmerk en waarde toe aan de Blazor<script> tag.
  • Plaats een script dat Blazor.start() aanroept achter de Blazor<script>-tag en binnen de afsluitende </body>-tag.
  • Plaats statische SSR-opties (rendering aan de serverzijde) in de ssr eigenschap.
  • Plaats server-side Blazor-SignalR circuit opties in de circuit eigenschap.
  • Plaats WebAssembly-opties aan de clientzijde in de webAssembly eigenschap.
<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  ...
  Blazor.start({
    ssr: {
      ...
    },
    circuit: {
      ...
    },
    webAssembly: {
      ...
    }
  });
  ...
</script>

Zelfstandig Blazor WebAssembly en Blazor Server:

  • Voeg een autostart="false" kenmerk en waarde toe aan de Blazor<script> tag.
  • Plaats een script dat Blazor.start() aanroept achter de Blazor<script>-tag en binnen de afsluitende </body>-tag.
  • U kunt extra opties opgeven in de Blazor.start() parameter.
<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  ...
  Blazor.start({
    ...
  });
  ...
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

JavaScript-initialisaties

JavaScript-initializersJS voeren logica uit voor en na het laden van een Blazor app. JS initializers zijn handig in de volgende scenario's:

  • Aanpassen hoe een Blazor app wordt geladen.
  • Bibliotheken initialiseren voordat Blazor wordt gestart.
  • Blazor Instellingen configureren.

JS initializers worden gedetecteerd als onderdeel van het buildproces en automatisch geïmporteerd. Het gebruik van initialisatiefuncties verwijdert vaak de noodzaak om JS bij het gebruik van Razor klassebibliotheken (RCL's).

Als u een JS initialisatiefunctie wilt definiëren, voegt u een JS module toe aan het project met de naam {NAME}.lib.module.js, waarbij de {NAME} tijdelijke aanduiding de assemblynaam, bibliotheeknaam of pakket-id is. Plaats het bestand in de webhoofdmap van het project. Dit is meestal de wwwroot map.

Voor Blazor Web Appen:

  • beforeWebStart(options): Geroepen voordat de Blazor Web App start. Wordt bijvoorbeeld beforeWebStart gebruikt om het laadproces, het logboekregistratieniveau en andere opties aan te passen. U ontvangt hiermee de Blazor webopties (options).
  • afterWebStarted(blazor): Gebeld nadat alle beforeWebStart beloftes zijn opgelost. afterWebStarted kan bijvoorbeeld worden gebruikt om gebeurtenislisteners en aangepaste gebeurtenistypen te registreren Blazor. Het Blazor exemplaar wordt aan afterWebStarted doorgegeven als een argument (blazor).
  • beforeServerStart(options, extensions): Aangeroepen voordat de eerste serverruntime wordt gestart. SignalR Ontvangt startopties voor het circuit (options) en eventuele extensies (extensions) die tijdens het publiceren zijn toegevoegd.
  • afterServerStarted(blazor): Aangeroepen nadat de eerste Interactive Server-runtime is gestart.
  • beforeWebAssemblyStart(options, extensions): Aangeroepen voordat de Interactive WebAssembly-runtime wordt gestart. Ontvangt de opties (Blazor) en eventuele extensies (options) die tijdens het extensions publiceren zijn toegevoegd. Met opties kunt u bijvoorbeeld het gebruik van een aangepast opstartresourcelaadprogramma opgeven.
  • afterWebAssemblyStarted(blazor): Aangeroepen nadat de Interactive WebAssembly-runtime is gestart.

Opmerking

Verouderde JS initializers (beforeStart, afterStarted) worden niet standaard aangeroepen in een Blazor Web App. U kunt de verouderde initializers inschakelen voor uitvoering met de enableClassicInitializers optie. De uitvoering van verouderde initialisatie is echter onvoorspelbaar.

<script>
  Blazor.start({ enableClassicInitializers: true });
</script>

Vanwege een frameworkfout in .NET 8 en 9 (dotnet/aspnetcore #54049) moet het Blazor script handmatig worden gestart wanneer beforeWebAssemblyStart(options, extensions) of afterWebAssemblyStarted(blazor) worden aangeroepen. Als de server-app nog niet handmatig is gestart met een WebAssembly(Blazor)-configuratie, update dan de webAssembly: {...} component in het serverproject als volgt.

In Components/App.razor, verwijder de bestaande Blazor<script> tag.

- <script src="_framework/blazor.web.js"></script>

Vervang de <script> tag door de volgende opmaak die handmatig begint met Blazor, samen met een WebAssembly-configuratie (webAssembly: {...}):

<script src="_framework/blazor.web.js" autostart="false"></script>
<script>
    Blazor.start({
        webAssembly: {}
    });
</script>

Voor Blazor Server, Blazor WebAssemblyen Blazor Hybrid apps:

  • beforeStart(options, extensions): Gebeld voordat Blazor begint. Wordt bijvoorbeeld beforeStart gebruikt voor het aanpassen van het laadproces, het logboekregistratieniveau en andere opties die specifiek zijn voor het hostingmodel.
    • Aan de clientzijde ontvangt beforeStart de Blazor opties (options) en eventuele extensies (extensions) die tijdens publiceren zijn toegevoegd. Met opties kunt u bijvoorbeeld het gebruik van een aangepast opstartresourcelaadprogramma opgeven.
    • Aan de serverzijde ontvangt beforeStart startopties voor het circuit SignalR (options).
    • Er worden geen opties doorgegeven in een BlazorWebView.
  • afterStarted(blazor): Gebeld nadat Blazor is gereed om oproepen te ontvangen van JS. Wordt bijvoorbeeld afterStarted gebruikt om bibliotheken te initialiseren door interop-aanroepen te maken JS en aangepaste elementen te registreren. Het Blazor exemplaar wordt aan afterStarted doorgegeven als een argument (blazor).

Aanvullende callbacks voor .NET WebAssembly Runtime:

  • onRuntimeConfigLoaded(config): Wordt aangeroepen wanneer de opstartconfiguratie wordt gedownload. Hiermee kan de app parameters (configuratie) wijzigen voordat de runtime wordt gestart (de parameter is MonoConfig afkomstig van dotnet.d.ts):

    export function onRuntimeConfigLoaded(config) {
      // Sample: Enable startup diagnostic logging when the URL contains 
      // parameter debug=1
      const params = new URLSearchParams(location.search);
      if (params.get("debug") == "1") {
        config.diagnosticTracing = true;
      }
    }
    
  • onRuntimeReady({ getAssemblyExports, getConfig }): Aangeroepen nadat de .NET WebAssembly-runtime is gestart (de parameter is RuntimeAPI afkomstig van dotnet.d.ts):

    export function onRuntimeReady({ getAssemblyExports, getConfig }) {
      // Sample: After the runtime starts, but before Main method is called, 
      // call [JSExport]ed method.
      const config = getConfig();
      const exports = await getAssemblyExports(config.mainAssemblyName);
      exports.Sample.Greet();
    }
    

Beide callbacks kunnen een Promise retourneren, en er wordt op de belofte gewacht voordat het opstarten doorgaat.

Voor de bestandsnaam:

  • Als de JS initializers worden ingezet als een statisch asset in het project, gebruikt u het formaat {ASSEMBLY NAME}.lib.module.js, waarbij de tijdelijke aanduiding {ASSEMBLY NAME} de assemblynaam van de app vertegenwoordigt. Geef bijvoorbeeld het bestand BlazorSample.lib.module.js een naam voor een project met een assemblynaam van BlazorSample. Plaats het bestand in de map van wwwroot de app.
  • Als de JS initialisatieprogramma's worden gebruikt vanuit een RCL, gebruikt u de indeling {LIBRARY NAME/PACKAGE ID}.lib.module.js, waarbij de tijdelijke aanduiding de {LIBRARY NAME/PACKAGE ID} bibliotheeknaam of pakket-id van het project is (<PackageId> waarde in het projectbestand van de bibliotheek). Geef bijvoorbeeld het bestand RazorClassLibrary1.lib.module.js een naam voor een RCL met een pakket-id van RazorClassLibrary1. Plaats het bestand in de map van wwwroot de bibliotheek.

Voor Blazor Web Appen:

In het volgende voorbeeld worden JS initializers getoond die aangepaste scripts laden voor en nadat de Blazor Web App is gestart door deze toe te voegen aan de <head> in beforeWebStart en afterWebStarted:

export function beforeWebStart() {
  var customScript = document.createElement('script');
  customScript.setAttribute('src', 'beforeStartScripts.js');
  document.head.appendChild(customScript);
}

export function afterWebStarted() {
  var customScript = document.createElement('script');
  customScript.setAttribute('src', 'afterStartedScripts.js');
  document.head.appendChild(customScript);
}

In het voorgaande beforeWebStart voorbeeld wordt alleen gegarandeerd dat het aangepaste script wordt geladen voordat Blazor het wordt gestart. Het garandeert niet dat beloften die op vervulling wachten in het script zijn afgerond voordat Blazor start.

Voor Blazor Server, Blazor WebAssemblyen Blazor Hybrid apps:

In het volgende voorbeeld worden initializers getoond die aangepaste scripts laden voor en nadat JS is gestart door ze toe te voegen aan de Blazor in <head> en beforeStart.

export function beforeStart(options, extensions) {
  var customScript = document.createElement('script');
  customScript.setAttribute('src', 'beforeStartScripts.js');
  document.head.appendChild(customScript);
}

export function afterStarted(blazor) {
  var customScript = document.createElement('script');
  customScript.setAttribute('src', 'afterStartedScripts.js');
  document.head.appendChild(customScript);
}

In het voorgaande beforeStart voorbeeld wordt alleen gegarandeerd dat het aangepaste script wordt geladen voordat Blazor het wordt gestart. Het garandeert niet dat beloften die op vervulling wachten in het script zijn afgerond voordat Blazor start.

Opmerking

MVC- en Razor Pages-apps laden JS niet automatisch initialiseerders. Ontwikkelaarscode kan echter een script bevatten om het manifest van de app op te halen en het laden van de JS initialisatoren te activeren.

Zie de volgende resources voor voorbeelden van JS initialisaties:

Opmerking

Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.

Controleren of bibliotheken in een specifieke volgorde worden geladen

Voeg aangepaste scripts toe aan de <head> in beforeStart - en afterStarted in de volgorde waarin ze moeten worden geladen.

In het volgende voorbeeld wordt `script1.js` vóór `script2.js` geladen en `script3.js` vóór `script4.js`.

export function beforeStart(options, extensions) {
    var customScript1 = document.createElement('script');
    customScript1.setAttribute('src', 'script1.js');
    document.head.appendChild(customScript1);

    var customScript2 = document.createElement('script');
    customScript2.setAttribute('src', 'script2.js');
    document.head.appendChild(customScript2);
}

export function afterStarted(blazor) {
    var customScript1 = document.createElement('script');
    customScript1.setAttribute('src', 'script3.js');
    document.head.appendChild(customScript1);

    var customScript2 = document.createElement('script');
    customScript2.setAttribute('src', 'script4.js');
    document.head.appendChild(customScript2);
}

Aanvullende modules importeren

Gebruik instructies op het hoogste niveau import in het JS initialisatiebestand om extra modules te importeren.

additionalModule.js:

export function logMessage() {
  console.log('logMessage is logging');
}

In het JS initialisatiebestand (.lib.module.js):

import { logMessage } from "/additionalModule.js";

export function beforeStart(options, extensions) {
  ...

  logMessage();
}

Kaart importeren

Importkaarten worden ondersteund door ASP.NET Core en Blazor.

Initialiseren Blazor wanneer het document gereed is

Het volgende voorbeeld wordt gestart Blazor wanneer het document gereed is:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  document.addEventListener("DOMContentLoaded", function() {
    Blazor.start();
  });
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Koppelen aan het Promise resultaat van een handmatige start

Als u extra taken wilt uitvoeren, zoals JS interoperabiliteit-initialisatie, gebruik then om te koppelen aan de Promise die het gevolg is van een handmatige app-start:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start().then(function () {
    ...
  });
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Opmerking

Gebruik een Blazor om extra taken automatisch uit te voeren nadat is gestart. Gebruik van een JS initialisatiefunctie vereist niet dat de gebruiker van de bibliotheek JS oproepen hoeft te verbinden met Blazor het handmatig starten.

Opstartbronnen aan de clientzijde laden

Wanneer een app in de browser wordt geladen, downloadt de app opstartbronnen vanaf de server:

  • JavaScript-code om de app te bootstrapen
  • .NET runtime en assemblies
  • Locatie-specifieke gegevens

Pas aan hoe deze opstartbronnen worden geladen met behulp van de loadBootResource API. De loadBootResource functie overschrijft het ingebouwde laadmechanisme voor opstartresources. Gebruik loadBootResource dit voor de volgende scenario's:

  • Laad statische resources, zoals tijdzonegegevens of dotnet.wasm, vanuit een CDN.
  • Laad gecomprimeerde assembly's met behulp van een HTTP-aanvraag en decomprimeer ze op de client voor hosts die geen ondersteuning bieden voor het ophalen van gecomprimeerde inhoud van de server.
  • Geef bronnen een alias door elke fetch aanvraag om te leiden naar een andere naam.

Opmerking

Externe bronnen moeten de vereiste Cross-Origin Resource Sharing (CORS)-headers retourneren, zodat browsers resources van verschillende herkomst kunnen laden. CDN's bieden meestal de vereiste headers.

loadBootResource parameters worden weergegeven in de volgende tabel.

Maatstaf Beschrijving
type Het type bron. Toegestane typen zijn: assembly, pdb, dotnetjs, dotnetwasmen timezonedata. U hoeft alleen types op te geven voor aangepast gedrag. Typen die niet aan `loadBootResource` zijn gespecificeerd, worden door het framework geladen volgens hun standaard laadgedrag. De dotnetjs opstartresource (dotnet.*.js) moet null retourneren voor standaard laadedrag of een URI voor de bron van de dotnetjs opstartresource.
name De naam van de resource.
defaultUri De relatieve of absolute URI van de resource.
integrity De integriteitstekenreeks die de verwachte inhoud in het antwoord vertegenwoordigt.

De loadBootResource functie kan een URI-tekenreeks retourneren om het laadproces te overschrijven. In het volgende voorbeeld worden de volgende bestanden geleverd bin/Release/{TARGET FRAMEWORK}/wwwroot/_framework vanuit een CDN op https://cdn.example.com/blazorwebassembly/{VERSION}/:

  • dotnet.*.js
  • dotnet.wasm
  • Tijdzonegegevens

De {TARGET FRAMEWORK} plaatsaanduiding is de naam van het doelframework (bijvoorbeeld net7.0). De {VERSION} tijdelijke aanduiding is de versie van het gedeelde framework (bijvoorbeeld 7.0.0).

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    webAssembly: {
      loadBootResource: function (type, name, defaultUri, integrity) {
        console.log(`Loading: '${type}', '${name}', '${defaultUri}', '${integrity}'`);
        switch (type) {
          case 'dotnetjs':
          case 'dotnetwasm':
          case 'timezonedata':
            return `https://cdn.example.com/blazorwebassembly/{VERSION}/${name}`;
        }
      }
    }
  });
</script>

Zelfstandige Blazor WebAssembly:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    loadBootResource: function (type, name, defaultUri, integrity) {
      console.log(`Loading: '${type}', '${name}', '${defaultUri}', '${integrity}'`);
      switch (type) {
        case 'dotnetjs':
        case 'dotnetwasm':
        case 'timezonedata':
          return `https://cdn.example.com/blazorwebassembly/{VERSION}/${name}`;
      }
    }
  });
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Als u meer wilt aanpassen dan alleen de URL's voor opstartresources, kan de loadBootResource functie het resultaat rechtstreeks aanroepen fetch en retourneren. In het volgende voorbeeld wordt een aangepaste HTTP-header toegevoegd aan de uitgaande aanvragen. Als u het standaardgedrag voor integriteitscontrole wilt behouden, geeft u de integrity parameter door.

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    webAssembly: {
      loadBootResource: function (type, name, defaultUri, integrity) {
        if (type == 'dotnetjs') {
          return null;
        } else {
          return fetch(defaultUri, {
            cache: 'no-cache',
            integrity: integrity,
            headers: { 'Custom-Header': 'Custom Value' }
          });
        }
      }
    }
  });
</script>

Zelfstandige Blazor WebAssembly:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    loadBootResource: function (type, name, defaultUri, integrity) {
      if (type == 'dotnetjs') {
        return null;
      } else {
        return fetch(defaultUri, {
          cache: 'no-cache',
          integrity: integrity,
          headers: { 'Custom-Header': 'Custom Value' }
        });
      }
    }
  });
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Wanneer de loadBootResource-functie null retourneert, gebruikt Blazor het standaard laadgedrag voor de resource. Bijvoorbeeld, de voorgaande code retourneert null voor de dotnetjs opstartresource (dotnet.*.js) omdat de dotnetjs opstartresource null moet retourneren voor standaard laadgedrag of een URI voor de bron van de dotnetjs opstartresource.

De loadBootResource functie kan ook een Response belofte retourneren. Zie Host en implementeer ASP.NET Core Blazor WebAssemblyvoor een voorbeeld.

Zie voor meer informatie ASP.NET Core-cache Blazor WebAssembly - en integriteitscontrolefouten.

Kopteksten beheren in C#-code

Beheer headers bij het opstarten in C#-code met behulp van de volgende benaderingen.

In de volgende voorbeelden wordt een CSP (Content Security Policy) toegepast op de app via een CSP-header. De {POLICY STRING} plaatsaanduiding is de tekenreeks van het CSP-beleid. Zie Een inhoudsbeveiligingsbeleid afdwingen voor ASP.NET Core Blazorvoor meer informatie over CSP's.

Opmerking

Headers kunnen niet worden ingesteld nadat het antwoord is gestart. De benaderingen in deze sectie stellen alleen headers in voordat het antwoord wordt gestart, dus de methoden die hier worden beschreven, zijn veilig. Zie IHttpContextAccessor/HttpContext in ASP.NET Core Blazor-appsvoor meer informatie.

Scenario's aan de serverzijde en vooraf gerenderde clientzijde

Gebruik ASP.NET Core Middleware om de verzameling headers te beheren.

In het bestand Program:

In Startup.Configure van Startup.cs:

app.Use(async (context, next) =>
{
    context.Response.Headers.Append("Content-Security-Policy", "{POLICY STRING}");
    await next();
});

In het voorgaande voorbeeld wordt gebruikgemaakt van inline-middleware, maar u kunt ook een aangepaste middlewareklasse maken en de middleware aanroepen met een extensiemethode in het Program bestand. Zie Aangepaste ASP.NET Core-middleware schrijvenvoor meer informatie.

Ontwikkeling aan clientzijde zonder prerendering

Geef StaticFileOptions aan MapFallbackToFile die antwoordheaders specificeert in de OnPrepareResponse fase.

In het server-side bestand Program :

In Startup.Configure van Startup.cs:

var staticFileOptions = new StaticFileOptions
{
    OnPrepareResponse = context =>
    {
        context.Context.Response.Headers.Append("Content-Security-Policy", 
            "{POLICY STRING}");
    }
};

...

app.MapFallbackToFile("index.html", staticFileOptions);

Indicatoren voor laden aan klantzijde

Een laadindicator geeft aan dat de app normaal wordt geladen en dat de gebruiker moet wachten totdat het laden is voltooid.

Blazor Web App laadindicator

De laadindicator die wordt gebruikt in Blazor WebAssembly apps, is niet aanwezig in een app die is gemaakt op basis van de Blazor Web App projectsjabloon. Normaal gesproken is een laadindicator niet wenselijk voor interactieve WebAssembly-onderdelen, omdat Blazor Web App client-side componenten op de server prerendert voor snelle initiële laadtijden. Voor situaties met gemengde render-modus moet het framework of de code voor ontwikkelaars ook voorzichtig zijn om de volgende problemen te voorkomen:

  • Meerdere laadindicatoren weergeven op dezelfde weergegeven pagina.
  • Onbedoeld verwijderen van vooraf samengestelde inhoud terwijl de .NET WebAssembly-runtime wordt geladen.

Een toekomstige release van .NET kan een op framework gebaseerde laadindicator bieden. Ondertussen kunt u een aangepaste laadindicator toevoegen aan een Blazor Web App.

Interactieve WebAssembly-rendering per onderdeel met prerendering

Dit scenario is van toepassing op interactieve webassembly-rendering per onderdeel (@rendermode InteractiveWebAssembly toegepast op afzonderlijke onderdelen).

Maak een ContentLoading onderdeel in de Layout map van de .Client app die aanroept OperatingSystem.IsBrowser:

  • Wanneer false, een laadindicator weergeven.
  • Wanneer true, geeft u de inhoud van het aangevraagde onderdeel weer.

Als u CSS-stijlen voor de indicator wilt laden, voegt u de stijlen toe aan <head> inhoud met het HeadContent onderdeel. Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.

Layout/ContentLoading.razor:

@if (!RendererInfo.IsInteractive)
{
    <!-- OPTIONAL ...
    <HeadContent>
        <style>
            ...
        </style>
    </HeadContent>
    -->
    <progress id="loadingIndicator" aria-label="Content loading…"></progress>
}
else
{
    @ChildContent
}

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
@if (!OperatingSystem.IsBrowser())
{
    <!-- OPTIONAL ...
    <HeadContent>
        <style>
            ...
        </style>
    </HeadContent>
    -->
    <progress id="loadingIndicator" aria-label="Content loading…"></progress>
}
else
{
    @ChildContent
}

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}

Als u nog geen Layout map in het .Client project hebt, voegt u de naamruimte voor de Layout map toe aan het _Imports.razor bestand. In het volgende voorbeeld is BlazorSample.Clientde naamruimte van het project:

@using BlazorSample.Client.Layout

In een component dat gebruikmaakt van Interactive WebAssembly-rendering, omwikkelt u de markup van de component met de Razor component. In het volgende voorbeeld ziet u de benadering met het Counter onderdeel van een app die is gemaakt op basis van de Blazor Web App projectsjabloon.

Pages/Counter.razor:

@page "/counter"
@rendermode InteractiveWebAssembly

<PageTitle>Counter</PageTitle>

<ContentLoading>
    <h1>Counter</h1>

    <p role="status">Current count: @currentCount</p>

    <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</ContentLoading>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

Global Interactive WebAssembly-rendering met prerendering

Dit scenario is van toepassing op globale interactieve WebAssembly-rendering met prerendering (@rendermode="InteractiveWebAssembly" op HeadOutlet en Routes componenten in de App component).

Maak een ContentLoading onderdeel in de Layout map van de .Client app die aanroept RendererInfo.IsInteractive:

  • Wanneer false, een laadindicator weergeven.
  • Wanneer true, geeft u de inhoud van het aangevraagde onderdeel weer.

Als u CSS-stijlen voor de indicator wilt laden, voegt u de stijlen toe aan <head> inhoud met het HeadContent onderdeel. Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.

Layout/ContentLoading.razor:

@if (!RendererInfo.IsInteractive)
{
    <!-- OPTIONAL ...
    <HeadContent>
        <style>
            ...
        </style>
    </HeadContent>
    -->
    <progress id="loadingIndicator" aria-label="Content loading…"></progress>
}
else
{
    @ChildContent
}

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
@if (!OperatingSystem.IsBrowser())
{
    <!-- OPTIONAL ...
    <HeadContent>
        <style>
            ...
        </style>
    </HeadContent>
    -->
    <progress id="loadingIndicator" aria-label="Content loading…"></progress>
}
else
{
    @ChildContent
}

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}

Als u nog geen Layout map in het .Client project hebt, voegt u de naamruimte voor de Layout map toe aan het _Imports.razor bestand. In het volgende voorbeeld is BlazorSample.Clientde naamruimte van het project:

@using BlazorSample.Client.Layout

In het MainLayout onderdeel (Layout/MainLayout.razor) van het .Client project wikkelt u de Body eigenschap (@Body) met het ContentLoading onderdeel:

In Layout/MainLayout.razor:

+ <ContentLoading>
    @Body
+ </ContentLoading>

Wereldwijd interactieve WebAssembly rendering zonder prerendering

Dit scenario is van toepassing op globale interactieve WebAssembly-rendering zonder vooraf renderen (@rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)" op de HeadOutlet en Routes componenten in de App component).

Voeg een JavaScript-initializer toe aan de app. In het volgende voorbeeld van de JavaScript-modulebestandsnaam is de {ASSEMBLY NAME} tijdelijke aanduiding de assembly-naam van het serverproject (bijvoorbeeld BlazorSample). De wwwroot map waarin de module is geplaatst, is de wwwroot map in het project aan de serverzijde, niet het .Client project.

In het volgende voorbeeld wordt een progress-indicator gebruikt die niet de werkelijke voortgang aangeeft van het leveren van opstartbronnen aan de client, maar het dient als een algemene benadering voor verdere ontwikkeling als u wilt dat de voortgangindicator de werkelijke voortgang van het laden van de opstartbronnen van de app weergeeft.

wwwroot/{ASSEMBLY NAME}.lib.module.js:

export function beforeWebStart(options) {
  var progress = document.createElement("progress");
  progress.id = 'loadingIndicator';
  progress.ariaLabel = 'Blazor loading…';
  progress.style = 'position:absolute;top:50%;left:50%;margin-right:-50%;' +
    'transform:translate(-50%,-50%);';
  document.body.appendChild(progress);
}

export function afterWebAssemblyStarted(blazor) {
  var progress = document.getElementById('loadingIndicator');
  progress.remove();
}

Vanwege een frameworkfout in .NET 8 en 9 (dotnet/aspnetcore #54049) moet het Blazor script handmatig worden gestart. Als de server-app nog niet handmatig is gestart met een WebAssembly(Blazor)-configuratie, update dan de webAssembly: {...} component in het serverproject als volgt.

In Components/App.razor, verwijder de bestaande Blazor<script> tag.

- <script src="_framework/blazor.web.js"></script>

Vervang de <script> tag door de volgende opmaak die handmatig begint met Blazor, samen met een WebAssembly-configuratie (webAssembly: {...}):

<script src="_framework/blazor.web.js" autostart="false"></script>
<script>
    Blazor.start({
        webAssembly: {}
    });
</script>

Als u een korte vertraging ziet tussen het verwijderen van de laadindicator en de eerste paginaweergave, kunt u garanderen dat de indicator na het weergeven wordt verwijderd door aan te roepen tot verwijdering van indicator in de OnAfterRenderAsync levenscyclusmethode van de MainLayout of Routes onderdelen. Zie Document an approach for a loading indicator that works with global Interactive WebAssembly without prerendering (dotnet/AspNetCore.Docs #35111) voor meer informatie en een codevoorbeeld.

Blazor WebAssembly voortgang van het laden van apps

De projectsjabloon bevat Scalable Vector Graphics (SVG) en tekstindicatoren die de voortgang van het laden van de app tonen.

De voortgangsindicatoren worden geïmplementeerd met HTML en CSS met behulp van twee aangepaste CSS-eigenschappen (variabelen) die worden geleverd door Blazor:

  • --blazor-load-percentage: Het percentage app-bestanden dat is geladen.
  • --blazor-load-percentage-text: Het percentage app-bestanden dat is geladen, afgerond op het dichtstbijzijnde gehele getal.

Met behulp van de voorgaande CSS-variabelen kunt u aangepaste voortgangsindicatoren maken die overeenkomen met de stijl van uw app.

In het volgende voorbeeld:

  • resourcesLoaded is een telling van de resources die onmiddellijk tijdens het opstarten van de app geladen worden.
  • totalResources is het totale aantal resources dat moet worden geladen.
const percentage = resourcesLoaded / totalResources * 100;
document.documentElement.style.setProperty(
  '--blazor-load-percentage', `${percentage}%`);
document.documentElement.style.setProperty(
  '--blazor-load-percentage-text', `"${Math.floor(percentage)}%"`);

De standaardindicator voor de voortgang van de ronde wordt geïmplementeerd in HTML in het wwwroot/index.html bestand:

<div id="app">
    <svg class="loading-progress">
        <circle r="40%" cx="50%" cy="50%" />
        <circle r="40%" cx="50%" cy="50%" />
    </svg>
    <div class="loading-progress-text"></div>
</div>

Als u de opmaak en stijl van de projectsjabloon voor de standaardvoortgangsindicatoren wilt bekijken, raadpleegt u de ASP.NET Core-referentiebron:

Opmerking

Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.

In plaats van de standaardindicator voor de voortgang van de ronde te gebruiken, ziet u in het volgende voorbeeld hoe u een lineaire voortgangsindicator implementeert.

Voeg de volgende stijlen toe aan wwwroot/css/app.css:

.linear-progress {
    background: silver;
    width: 50vw;
    margin: 20% auto;
    height: 1rem;
    border-radius: 10rem;
    overflow: hidden;
    position: relative;
}

.linear-progress:after {
    content: '';
    position: absolute;
    inset: 0;
    background: blue;
    scale: var(--blazor-load-percentage, 0%) 100%;
    transform-origin: left top;
    transition: scale ease-out 0.5s;
}

Een CSS-variabele (var(...)) wordt gebruikt om de waarde van --blazor-load-percentage door te geven aan de scale-eigenschap van een blauw pseudo-element dat de voortgang van het laden van de bestanden van de app aangeeft. Wanneer de app wordt geladen, --blazor-load-percentage wordt deze automatisch bijgewerkt, waardoor de visuele weergave van de voortgangsindicator dynamisch wordt gewijzigd.

Verwijder wwwroot/index.htmlde standaard SVG-ronde indicator in <div id="app">...</div> en vervang deze door de volgende markeringen:

<div class="linear-progress"></div>

De .NET WebAssembly-runtime configureren

In geavanceerde programmeerscenario's wordt de configureRuntime functie met de dotnet opbouwfunctie voor runtimehosts gebruikt om de .NET WebAssembly-runtime te configureren. Stelt bijvoorbeeld dotnet.withEnvironmentVariable een omgevingsvariabele in die:

  • Hiermee configureert u de .NET WebAssembly-runtime.
  • Hiermee wijzigt u het gedrag van een C-bibliotheek.

Opmerking

Een documentatieaanvraag is in behandeling in de dotnet/runtime GitHub-opslagplaats voor meer informatie over omgevingsvariabelen die de .NET WebAssembly-runtime configureren of het gedrag van C-bibliotheken beïnvloeden. Hoewel de documentatieaanvraag in behandeling is, zijn er meer informatie en kruiskoppelingen naar aanvullende resources beschikbaar in de aanvraag, vraag/aanvraag voor documentatie over .NET WASM runtime env vars (dotnet/runtime #98225).

De configureRuntime functie kan ook worden gebruikt om integratie met een browser profiler in te schakelen.

Voor de tijdelijke aanduidingen in de volgende voorbeelden die een omgevingsvariabele instellen:

  • De plaatsaanduiding {BLAZOR SCRIPT} is het pad en de bestandsnaam van het script Blazor. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.
  • De {NAME} tijdelijke aanduiding is de naam van de omgevingsvariabele.
  • De {VALUE} tijdelijke aanduiding is de waarde van de omgevingsvariabele.

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    webAssembly: {
      configureRuntime: dotnet => {
        dotnet.withEnvironmentVariable("{NAME}", "{VALUE}");
      }
    }
  });
</script>

Zelfstandige Blazor WebAssembly:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    configureRuntime: dotnet => {
      dotnet.withEnvironmentVariable("{NAME}", "{VALUE}");
    }
  });
</script>

Opmerking

Het .NET Runtime-exemplaar kan worden geopend met behulp van de .NET WebAssembly Runtime-API (Blazor.runtime). De buildconfiguratie van de app kan bijvoorbeeld worden verkregen met behulp van Blazor.runtime.runtimeBuildInfo.buildConfiguration.

Raadpleeg het TypeScript-definitiebestand (dotnet.d.ts) van de runtime in de dotnet/runtime GitHub-opslagplaats voor meer informatie over de .NET WebAssembly-runtimeconfiguratie.

Opmerking

Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.

Verbeterde navigatie- en formulierafhandeling uitschakelen

Deze sectie is van toepassing op Blazor Web Apps.

Als u verbeterde navigatie- en formulierafhandeling wilt uitschakelen, stelt u disableDomPreservation in door true op Blazor.start te zetten.

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    ssr: { disableDomPreservation: true }
  });
</script>

In het voorgaande voorbeeld zijn de tijdelijke aanduidingen {BLAZOR SCRIPT} en Blazor respectievelijk het scriptpad en de bestandsnaam. Zie ASP.NET Core Blazor projectstructuurvoor de locatie van het script.

Aanvullende bronnen