Nello scorso script abbiamo visto come poter integrare componenti o pagine WebAssembly nella nostra applicazione Blazor 8. Quando un sito gira in modalità WebAssembly, l'esperienza per l'utente è assolutamente comparabile a quella di una normale Single Page Application scritta in JavaScript: non ci sono latenze di rete, il sito gira interamente all'interno del browser e, anche nel caso di connessione instabile, le normali funzionalità sono comunque garantite.
Tuttavia, il prezzo da pagare è il download iniziale di .NET 8, che, seppur compresso, consiste comunque in circa una ventina di MegaByte. Fintanto che questo download è in corso, la pagina non sarà in grado di rispondere all'input utente. Una volta completato, però, le librerie verranno memorizzate in cache e mantenute per tutte le successive sessioni.
La modalità di rendering InteractiveAuto si propone di risolvere proprio questo problema con una logica tanto semplice quanto efficace:
- Al primo rendering, il componente viene istanziato come InteractiveServer e viene aperta una connessione WebSocket. Nel frattempo viene avviato il download in background di tutti gli assembly necessari a WebAssembly;
- a partire dal rendering successivo in poi, visto che gli assembly saranno già in cache, la pagina verrà renderizzata direttamente in WebAssembly.
Per renderci conto di questo comportamento, possiamo andare sulla nostra pagina Counter.razor e apportare questa semplice modifica per evidenziare se il componente sta funzionando lato server o lato client:
@page "/counter" @rendermode InteractiveAuto <PageTitle>Counter</PageTitle> <h1>Counter @(OperatingSystem.IsBrowser() ? "Wasm" : "Server")</h1> <p role="status">Current count: @currentCount</p> .. altro codice qui ..
Nel codice in alto, abbiamo impostato il rendermode a InteractiveAuto e, controllando il risultato di IsBrowser della classe helper OperatingSystem, siamo in grado di visualizzare la modalità di rendering effettivamente utilizzata.
Come passaggio ulteriore, nella classe Program del progetto host, dobbiamo controllare di aver attivato sia la modalità Server che WebAssembly:
using SampleInteractive.Client.Pages; using SampleInteractive.Components; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddInteractiveWebAssemblyComponents(); var app = builder.Build(); // .. altro codice qui .. app.MapRazorComponents<App>() .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(Counter).Assembly); app.Run();
A questo punto, possiamo provare a caricare la pagina, e vedere il risultato. Per essere sicuri di "scatenare" il primo rendering server side, può essere necessario attivare il throttling della rete sul browser e cancellare la cache.
Con i passaggi corretti, vedremo che la pagina si configurerà inizialmente come "Counter Server" e, seppure con un po' di latenza iniziale, il bottone "Click me" inizierà a funzionare una volta che la connessione WebSocket sia stata stabilita.

Una volta che gli assembly WASM sono stati tutti caricati, se facciamo il refresh della pagina, o navighiamo su una pagina differente per poi tornare su Counter, noteremo come si attiverà la versione WASM, praticamente senza nessuna latenza, visto che il download delle librerie necessarie è già avvenuto in precedenza.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Introduzione alle Container Queries
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Paginare i risultati con QuickGrid in Blazor
Creare una libreria CSS universale: i bottoni
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Migrare una service connection a workload identity federation in Azure DevOps
Eseguire i worklow di GitHub su runner potenziati
Estrarre dati randomici da una lista di oggetti in C#
Creare una libreria CSS universale: Cards
Usare le navigation property in QuickGrid di Blazor
Utilizzare QuickGrid di Blazor con Entity Framework
I più letti di oggi
- .NET Conference Italia 2023 - Milano e Online
- .NET Conference Italia 2024 - Milano
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Ricevere notifiche sui test con Azure Load Testing
- Creare agenti facilmente con Azure AI Agent Service
- Loggare le query più lente con Entity Framework
- Nuova build per ASP.NET MVC: Preview 5
- Microsoft Security Bulletin MS05-047
- Quando Linq incontra ASP.NET, nasce BLinq
- Dopo diversi anni la nuova versione 5.7 di Windows Scripting Host