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
Eseguire script pre e post esecuzione di un workflow di GitHub
Evitare il flickering dei componenti nel prerender di Blazor 8
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Testare l'invio dei messaggi con Event Hubs Data Explorer
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Utilizzare Azure Cosmos DB con i vettori
Implementare l'infinite scroll con QuickGrid in Blazor Server
I più letti di oggi
- Disponibile il download di Silverlight 3.0 beta1!
- Disponibile la beta 1 del .NET Framework 4.0 e di Visual Studio 2010
- Speciale .NET Framework 4.0 e Visual Studio 2010
- Internet Explorer 9 in beta per tutti
- Microsoft lancia il nuovo Windows Phone Dev Center, sostituendo l'AppHub
- Pubblicata la lista delle breaking changes del .NET Framework 2.0 rispetto alla 1.1
- Quando Linq incontra ASP.NET, nasce BLinq
- August 2006 CTP per la prossima versione di ADO.NET
- Dopo diversi anni la nuova versione 5.7 di Windows Scripting Host
- C# 12: Cosa c'è di nuovo e interessante