{"id":32825,"date":"2021-05-11T10:00:00","date_gmt":"2021-05-11T08:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=32825"},"modified":"2021-05-12T11:26:25","modified_gmt":"2021-05-12T09:26:25","slug":"blazor-vs-angular-quale-scegliere-seconda-parte","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/","title":{"rendered":"Blazor vs Angular: quale scegliere? Seconda parte"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"32836\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/attachment\/ita-angularvsblazor2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&amp;ssl=1\" data-orig-size=\"1105,656\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ITA-angularvsblazor2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-32836\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dopo aver confrontato i due framework dal punto di vista dell\u2019esperienza di sviluppo, analizziamo adesso le funzionalit\u00e0 che&nbsp;entrambi mettono a disposizione in termini di componenti, infrastruttura e&nbsp;maturit\u00e0.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mentre&nbsp;Angular&nbsp;\u00e8 basato su&nbsp;ECMAScript&nbsp;e su un insieme di librerie appositamente create per dare vita&nbsp;al framework,&nbsp;Blazor&nbsp;poggia&nbsp;sul&nbsp;.NET Core framework, ereditandone tutte le funzionalit\u00e0 e peculiarit\u00e0.&nbsp;A differenza del .NET Framework classico, .NET Core fornisce nativamente&nbsp;Dependency&nbsp;Injection,&nbsp;Logging&nbsp;e supporto alla configurazione,&nbsp;funzionalit\u00e0 che&nbsp;Blazor&nbsp;eredit\u00e0 direttamente, cos\u00ec come tanti aspetti avanzati come&nbsp;la&nbsp;Reflection, LINQ e tutto quello che conosciamo del mondo .NET. Uniti&nbsp;alla&nbsp;forte tipizzazione&nbsp;di C#, questi aspetti&nbsp;possono fare&nbsp;la differenza in tanti scenari business, a patto ovviamente di conoscerli.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dependency&nbsp;Injection<\/strong><em>&nbsp;<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno dei metodi pi\u00f9 diffusi per implementare il <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inversion_of_control\" target=\"_blank\" rel=\"noreferrer noopener\">principio dell\u2019inversione di controllo<\/a>&nbsp;(IoC),&nbsp;\u00e8 utilizzare una&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_factory_pattern\" target=\"_blank\" rel=\"noreferrer noopener\">Factory&nbsp;astratta<\/a> che fornisca le dipendenze alle classi che&nbsp;ne&nbsp;hanno bisogno. In programmazione si usa per rendere gli elementi della propria soluzione bassamente&nbsp;accoppiati, in modo da rendere sostituibili le implementazioni delle dipendenze. Oltre ad essere una pratica molto utile per avere codice di alta qualit\u00e0,&nbsp;manutenibile&nbsp;e testabile, \u00e8 anche un modo molto interessante per sostituire, anche a caldo, implementazioni di una funzionalit\u00e0 sulla base delle proprie&nbsp;esigenze.&nbsp;Questa tecnica \u00e8 chiamata&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noreferrer noopener\">Dependency&nbsp;Injection<\/a>&nbsp;ed \u00e8 implementata nativamente dai moderni framework di sviluppo software.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tipicamente,&nbsp;una dipendenza \u00e8 un\u2019&nbsp;istanza di una classe che serve al&nbsp;nostro componente per eseguire delle operazioni, ad esempio invocare il back-end per recuperare delle informazioni, oppure una classe di servizio che esegue dei calcoli.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un fatto interessante delle librerie di&nbsp;dependency&nbsp;injection, \u00e8 che&nbsp;ci permettono sia di definire le dipendenze, sia il loro ciclo di vita, risolvendo a catena tutte le dipendenze di cui&nbsp;avete bisogno. Questo significa che se&nbsp;abbiamo&nbsp;un componente che ha bisogno di una classe per fare qualche operazione, invece di istanziare direttamente la classe,&nbsp;chiede alla&nbsp;Factory&nbsp;di&nbsp;fornirgliela: sar\u00e0 quindi la&nbsp;Factory&nbsp;a decidere, sulla base della sua configurazione,&nbsp;se istanziare una nuova classe o restituire una istanza gi\u00e0 creata precedentemente.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tipicamente, una gestione del ciclo di vita che crea sempre una nuova istanza ad ogni richiesta, viene detta Transiente. Se&nbsp;viene create&nbsp;invece una istanza sulla base di un certo contesto,&nbsp;ad esempio se&nbsp;viene creata&nbsp;una istanza una sola volta nell\u2019arco di una stessa richiesta HTTP&nbsp;e restituisco sempre la stessa a chiunque la richieda nell\u2019arco di quella richiesta,&nbsp;il ciclo di vita viene chiamate&nbsp;Scoped, dove lo scope, in questo caso,&nbsp;\u00e8 la richiesta&nbsp;HTTP.&nbsp;Se invece&nbsp;viene&nbsp;creata&nbsp;una istanza una sola volta e restituita&nbsp;sempre la stessa, si parla di Singleton.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teniamo&nbsp;presente che se la classe che deve essere istanziata&nbsp;ha, a sua volta,&nbsp;delle dipendenze, la&nbsp;Factory&nbsp;risolve anche quelle, creando un vero e proprio albero di oggetti che accoppiano dinamicamente le parti dell&#8217;applicazione.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se vi state chiedendo&nbsp;perch\u00e9&nbsp;dovreste&nbsp;fare una cosa del genere invece di implementare tutto nei metodi del componente stesso, vi suggerisco di <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-responsibility_principle\" target=\"_blank\" rel=\"noreferrer noopener\">partire per il lungo viaggio nell\u2019ingegneria del software<\/a>. Ma vi faccio notare che, a parte tutti i benefici in termini di qualit\u00e0, la possibilit\u00e0 di configurare il ciclo di vita di un oggetto ha il piacevole effetto collaterale di poter creare degli oggetti da condividere tra pi\u00f9 componenti, fornendo un meccanismo di comunicazione tra&nbsp;elementi&nbsp;della vostra UI che non si trovano in relazione padre\/figlio.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sia&nbsp;Angular&nbsp;che&nbsp;Blazor&nbsp;forniscono strumenti per la&nbsp;dependency&nbsp;injection, nonostante siano molto diversi tra loro.&nbsp;<a href=\"https:\/\/angular.io\/guide\/dependency-injection\" target=\"_blank\" rel=\"noreferrer noopener\">Angular<\/a>&nbsp;implementa un meccanismo&nbsp;gerarchico,&nbsp;basato su provider, in cui \u00e8 possibile definire chi fornisce&nbsp;le dipendenza a chi.&nbsp;Possiamo&nbsp;ad esempio indicare che un modulo&nbsp;\u00e8&nbsp;il provider di&nbsp;specifiche&nbsp;dipendenze: questo significa che tutti i componenti di quel modulo possono&nbsp;ricevere la stessa istanza della classe desiderata.&nbsp;In alternativa,&nbsp;posso definire un nuovo provider a livello di componente: in questo caso il componente crea l\u2019istanza per se e i suoi figli (i componenti contenuti all\u2019interno di esso).&nbsp;Le classi iniettate in&nbsp;Angular&nbsp;vengono dette Service, e sono identificate dall\u2019annotazione @Injectable. In realt\u00e0 questa annotazione \u00e8 necessaria solo se la&nbsp;classe definisce a sua volta delle dipendenze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/fundamentals\/dependency-injection?view=aspnetcore-5.0&amp;pivots=webassembly\" target=\"_blank\" rel=\"noreferrer noopener\">Blazor<\/a>, essendo basato su .NET Core, non ha bisogno di implementare una libreria per la&nbsp;dependency&nbsp;injection, dato&nbsp;che il framework la&nbsp;fornisce gi\u00e0 nativamente. Quindi possiamo utilizzare tutto quello che gi\u00e0 sappiamo del motore di&nbsp;dependency&nbsp;injection di .NET, compresa la&nbsp;possibilit\u00e0 di sostituirlo con un motore custom di nostra preferenza.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo giusto una piccola precisazione per la gestione del ciclo di vita degli oggetti in&nbsp;Blazor&nbsp;Server e&nbsp;Blazor&nbsp;WebAssembly.&nbsp;In&nbsp;Blazor&nbsp;Server l\u2019applicazione \u00e8, a tutti gli effetti, una applicazione ASP.NET Core, quindi il concetto di Singleton,&nbsp;Transient&nbsp;e&nbsp;Scoped&nbsp;resta invariato.&nbsp;In una applicazione&nbsp;Blazor&nbsp;WebAssembly, il codice gira nel browser, quindi&nbsp;Scoped&nbsp;e Singleton tendono a confondersi, dato che,&nbsp;finch\u00e9&nbsp;non&nbsp;aggiornate&nbsp;la pagina,&nbsp;gli oggetti&nbsp;Scoped&nbsp;hanno la stessa durata degli oggetti Singleton.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CSS&nbsp;Isolation<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Anche la&nbsp;CSS&nbsp;isolation&nbsp;\u00e8 presente in entrambi i framework:&nbsp;abbiamo&nbsp;cio\u00e8 la possibilit\u00e0 di scrivere regole CSS che si applicano a un particolare componente, quindi il resto dell\u2019applicazione non ne sar\u00e0 impattata. Ad esempio,&nbsp;possiamo&nbsp;decidere che nel&nbsp;nostro&nbsp;componente i titoli siano rossi, senza per questo far diventare rossi i titoli degli altri componenti dell\u2019applicazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel <a href=\"https:\/\/angular.io\/guide\/component-styles\" target=\"_blank\" rel=\"noreferrer noopener\">caso di&nbsp;Angular<\/a>&nbsp;potete avere un array di&nbsp;file&nbsp;CSS,&nbsp;SAAS&nbsp;o LESS&nbsp;associati al vostro componete, dichiarando la lista nelle definizione&nbsp;del componente stesso&nbsp;(propriet\u00e0&nbsp;styleUrls&nbsp;dell\u2019annotazione Component).&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/components\/css-isolation?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">caso di&nbsp;Blazor<\/a><a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/components\/css-isolation?view=aspnetcore-5.0%22%20\\\" target=\"_blank\" rel=\"noreferrer noopener\">,<\/a>&nbsp;invece, si lavora ancora una volta di convenzione,&nbsp;denominando&nbsp;il file &lt;NomeComponente&gt;.razor.css. Questo significa anche che al momento potete avere un unico file e deve necessariamente essere un CSS. Ovviamente potremmo&nbsp;intervenire in fase di build per generare questo file da un file SAAS&nbsp;o LESS, e potremmo&nbsp;a quel punto avere pi\u00f9 file, ma il framework e i suoi tool non&nbsp;ci supportano direttamente, almeno per il momento.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Piccola nota personale: usate&nbsp;la CSS&nbsp;Isolation&nbsp;solo se ne avete&nbsp;strettamente&nbsp;bisogno o state realizzando componenti da ridistribuire in una libreria. In una applicazione reale mi sento di consigliare l\u2019uso di regole di CSS comuni, basandosi magari su un framework come Bootstrap. La parte di stilizzazione \u00e8 spesso complessa,&nbsp;e parzializzare le regole ostacola sia la manutenibilit\u00e0 che l\u2019ingresso nel team di una figura che si occupa solo della stilizzazione.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gestione&nbsp;delle&nbsp;Form<\/strong><em>&nbsp;<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;Angular&nbsp;avete a disposizione ben due librerie diverse per la gestione delle&nbsp;form. La prima, presente fin dalla prima versione, \u00e8 chiamata <a href=\"https:\/\/angular.io\/guide\/forms\" target=\"_blank\" rel=\"noreferrer noopener\">Form Template<\/a>, e vi fornisce tutta una serie di direttive per&nbsp;risolvere la creazione e la gestione di&nbsp;form&nbsp;sulla parte di markup del vostro componente. E\u2019 la stessa libreria che vi consente di definire i famosi&nbsp;binding&nbsp;bidirezionali tra un vostro oggetto e la&nbsp;form&nbsp;stessa, che&nbsp;rende&nbsp;semplice,&nbsp;negli scenari pi\u00f9 comuni,&nbsp;la gestione della cattura dell\u2019input dell\u2019utente&nbsp;e la sua validazione, per la quale potete usare i&nbsp;validatori&nbsp;di HTML5 o crearne di personalizzati.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A questa libreria \u00e8 stata poi aggiunta la possibilit\u00e0 di creare&nbsp;form&nbsp;reattive, da cui prende il nome,&nbsp;<a href=\"https:\/\/angular.io\/guide\/reactive-forms\" target=\"_blank\" rel=\"noreferrer noopener\">Reactive&nbsp;Forms<\/a>, in cui non avete pi\u00f9 i&nbsp;binding&nbsp;bidirezionali (le performance sentitamente ringraziano), ma la possibilit\u00e0 di sfruttare l\u2019approccio reattivo per&nbsp;tenere traccia dello stato della&nbsp;form&nbsp;e intervenire a ogni cambiamento.&nbsp;In questo caso la definizione della&nbsp;form&nbsp;avviene tutta lato codice, fornendo delle direttive per \u201cagganciare\u201d la&nbsp;form&nbsp;creata&nbsp;sugli elementi di markup.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;Blazor&nbsp;abbiamo invece una serie di componenti ed eventi gi\u00e0 pronti per la creazione di&nbsp;form. Una&nbsp;form&nbsp;viene delimitata dal componente &lt;EditForm&gt;&lt;\/EditForm&gt;, e al suo interno possiamo inserire i principali elementi di UI gi\u00e0 forniti o creati appositamente. Abbiamo la classica&nbsp;casella di testo (InputText), casella numerica (InputNumber), date&nbsp;picker&nbsp;(InputDate), e similari. Tutti questi componenti vi permettono il&nbsp;binding&nbsp;bidirezionale con un oggetto&nbsp;utilizzando l\u2019attributo @bind-Value, dopo avere specificato l\u2019istanza dell\u2019oggetto con la propriet\u00e0 Model dell\u2019EditForm. Utilizzando il componente &lt;DataAnnotationValidator&nbsp;\/&gt; potete aggiungere il supporto per la validazione sulla base delle Data&nbsp;Annotation&nbsp;della&nbsp;classe da cui \u00e8 stato creato l\u2019oggetto che conterr\u00e0 i vostri dati.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Potete trovare maggiori informazioni <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/forms-validation?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>, ma notiamo subito che&nbsp;questa&nbsp;\u00e8 una delle killer feature di&nbsp;Blazor&nbsp;per chi ha un&nbsp;back-end .NET: potete infatti condividere queste classi, decorate con le&nbsp;data&nbsp;annotation, tra back-end e front-end in una libreria condivisa e centralizzare cos\u00ec&nbsp;non solo la definizione di questi oggetti, ma sfruttare le Form&nbsp;Blazor&nbsp;per la validazione front-end, e il Model Binder di ASP.NET per ripetere le validazioni anche lato back-end, operazione che dovreste in ogni caso fare.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Blazor, come&nbsp;Angular, nasce principalmente per gestire applicazioni Business, quindi in realt\u00e0 c\u2019\u00e8 tanto altro dietro le quinte, tra cui creare componenti Form personalizzati, intervenire nel processo di&nbsp;binding&nbsp;e validazione utilizzando&nbsp;EditContext&nbsp;invece di specificare semplicemente il Model, fino alla generazione dinamica della UI sfruttando&nbsp;la&nbsp;Reflection&nbsp;e&nbsp;le&nbsp;Expression&nbsp;di LINQ. Se vi va di dare un occhio, ho tenuto una sessione al&nbsp;WebDay&nbsp;organizzato da&nbsp;UgiDotNet&nbsp;sull\u2019argomento:&nbsp;<a href=\"https:\/\/www.youtube.com\/watch?v=PMERZDximE4%22%20\\\" target=\"_blank\" rel=\"noreferrer noopener\">Generazione dinamica della UI con&nbsp;Blazor&nbsp;WebAssembly<\/a>.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Integrazione con il Back-end<\/strong><em>&nbsp;<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Angular&nbsp;fornisce una libreria specifica anche per l\u2019integrazione con il back-end, grazie alla quale potete iniettare nei vostri service un&nbsp;HttpClient&nbsp;che vi permette di invocare API HTTP in maniera&nbsp;molto&nbsp;semplice. La libreria fornisce anche la possibilit\u00e0 di infilarsi nel processo di invocazione per fare qualcosa prima e\/o dopo una chiamata, come ad esempio loggare&nbsp;o aggiungere degli&nbsp;header&nbsp;sulla richiesta (il classico token JWT&nbsp;ad esempio), definendo quelli che il framework chiama HTTP&nbsp;Interceptor.&nbsp;Maggiori info <a href=\"https:\/\/angular.io\/guide\/http\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;Blazor&nbsp;potete utilizzare il client HTTP di .NET Core, comprensivo del suo motore di serializzazione\/deserializzazione&nbsp;JSON&nbsp;e di tutto quello che sapete su questa libreria,&nbsp;che sicuramente avrete gi\u00e0 usato in altri scenari.&nbsp;Per&nbsp;Blazor&nbsp;vengono&nbsp;forniti&nbsp;anche&nbsp;alcuni Extension&nbsp;Methods&nbsp;per semplificare l\u2019invocazione di API REST,&nbsp;maggiori info <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/call-web-api?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche in&nbsp;Blazor&nbsp;potete inserirvi nella pipeline di invocazione HTTP, definendo in fase di configurazione del&nbsp;client HTTP dei&nbsp;message&nbsp;handler&nbsp;usando il metodo di estensione&nbsp;AddMessageHandler() della libreria&nbsp;Microsoft.Extensions.DependencyInjection. Anche in questo caso non si tratta di una libreria specifica di&nbsp;Blazor, ma del client HTTP.&nbsp;Potete&nbsp;approfondire <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/security\/webassembly\/additional-scenarios?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inoltre, sfruttando la <a href=\"https:\/\/grpc.io\/blog\/grpc-web-ga\/\" target=\"_blank\" rel=\"noreferrer noopener\">libreria&nbsp;gRPC-Web<\/a>, potete&nbsp;utilizzare&nbsp;gRPC&nbsp;per invocare il back-end&nbsp;con entrambi i framework.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>JS&nbsp;Interop&nbsp;e&nbsp;JS&nbsp;Isolation<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Come sapete, il codice&nbsp;Typescript&nbsp;con cui scriviamo&nbsp;le applicazioni&nbsp;Angular&nbsp;viene convertito in JavaScript prima dell\u2019esecuzione. Nel caso di&nbsp;Blazor&nbsp;WebAssembly&nbsp;invece, il codice C# viene convertito in codice IL,&nbsp;<em>jittato<\/em>&nbsp;in&nbsp;WebAssembly&nbsp;dal&nbsp;runtime&nbsp;Mono, quindi nessuna interazione con JS.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ma dato che\u00a0WebAssembly\u00a0e JavaScript vengono eseguiti\u00a0entrambi nel JavaScript Runtime, \u00e8 possibile da .NET invocare una <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/call-javascript-from-dotnet?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">funzione JavaScript<\/a>\u00a0\u00a0\u00a0e da JavaScript invocare un <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/call-dotnet-from-javascript?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">metodo\u00a0.NET<\/a>\u00a0statico o di istanza.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima della versione 5 di .NET l\u2019organizzazione del codice JavaScript a supporto delle applicazioni&nbsp;Blazor&nbsp;era basato sull\u2019inclusione di uno o pi\u00f9 file JS nella index.html, agganciando all\u2019oggetto window&nbsp;le funzioni da invocare.&nbsp;Oltre ad essere scomodo per scenari&nbsp;medio\/grandi, questo approccio non permette la parzializzazione del codice JavaScript&nbsp;sulla base delle esigenze, rendendolo il pi\u00f9 delle volte poco&nbsp;manutenibile&nbsp;e richiedendo&nbsp;il suo intero download all\u2019avvio.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con .NET 5 \u00e8 stata introdotta la JS&nbsp;Isolation, cio\u00e8 la possibilit\u00e0 di associare dei file JS a specifici componenti, che ne impongono il download quando attivati,&nbsp;modularizzando&nbsp;la loro scrittura.&nbsp;Questa funzionalit\u00e0 in realt\u00e0 \u00e8 stata introdotta per fornire supporto ai <a href=\"https:\/\/tc39.es\/ecma262\/#sec-modules\" target=\"_blank\" rel=\"noreferrer noopener\">moduli&nbsp;ECMAScript<\/a>&nbsp;in&nbsp;Blazor, dato che i browser supportano questo standard di default.&nbsp;Vi lascio un articolo di approfondimento per la sintassi e le modalit\u00e0 d\u2019uso:&nbsp;<a href=\"https:\/\/khalidabuhakmeh.com\/blazor-javascript-isolation-modules-and-dynamic-csharp\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/khalidabuhakmeh.com\/blazor-javascript-isolation-modules-and-dynamic-csharp<\/a>.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Lazy&nbsp;Load<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In applicazioni molto grandi pu\u00f2 essere un grande vantaggio parzializzare il download del nostro codice in base a strategie diverse dal singolo download iniziale.&nbsp;Questa funzionalit\u00e0 \u00e8 chiamata&nbsp;Lazy&nbsp;Load e viene fornita sia da&nbsp;Angular&nbsp;che da&nbsp;Blazor&nbsp;(a partire da .NET 5).&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il supporto di\u00a0Angular\u00a0per il\u00a0Lazy\u00a0Load \u00e8 completo: potete tirare gi\u00f9 interi moduli on-demand <a href=\"https:\/\/angular.io\/guide\/lazy-loading-ngmodules\" target=\"_blank\" rel=\"noreferrer noopener\">configurando il router<\/a>. In questo modo solo quando farete un primo accesso alla rotta configurata, il codice sar\u00e0 scaricato ed eseguito.\u00a0Potete\u00a0quindi\u00a0prevenire il download\u00a0di interi moduli\u00a0se l\u2019utente non ha accesso a quella rotta o\u00a0finch\u00e9\u00a0non vi accede.\u00a0Con l\u2019introduzione di Ivy, potete anche fare\u00a0Lazy\u00a0Load\u00a0di singoli componenti, invece che dell\u2019intero modulo, come ha chiaramente illustrato Salvatore nel suo <a href=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo su\u00a0Angular\u00a09<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;Blazor&nbsp;al momento il supporto al&nbsp;Lazy&nbsp;Load \u00e8 piuttosto limitato, e richiede la suddivisione del codice che si vuole parzializzare in diverse DLL, andando a specificare a livello di progetto che si vuole rendere il download&nbsp;di&nbsp;quelle <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/webassembly-lazy-load-assemblies?view=aspnetcore-5.0\" target=\"_blank\" rel=\"noreferrer noopener\">DLL&nbsp;Lazy<\/a>. Ci viene fornito un oggetto&nbsp;LazyAssemblyLoader, che possiamo iniettare dove ci serve, per attivare la funzionalit\u00e0.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nonostante sia un primo approccio funzionante, il&nbsp;Lazy&nbsp;Load fornito in&nbsp;Blazor&nbsp;\u00e8 ancora acerbo e non permette degli automatismi che sgravino il programmatore dalla gestione del download sulla base del&nbsp;routing, che si spera arrivi, insieme alla compilazione AOT, con .NET 6.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Programmazione reattiva<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un discorso a parte merita la programmazione reattiva, che pervade tutto il framework&nbsp;Angular&nbsp;grazie a&nbsp;<a href=\"https:\/\/angular.io\/guide\/rx-library\" target=\"_blank\" rel=\"noreferrer noopener\">RxJS<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questa libreria introduce la possibilit\u00e0 di gestire stream di dati nel tempo, utilizzando il <a href=\"https:\/\/en.wikipedia.org\/wiki\/Observer_pattern\" target=\"_blank\" rel=\"noreferrer noopener\">pattern Observer<\/a>: grazie alla possibilit\u00e0 di lavorare con degli oggetti&nbsp;Observable, possiamo utilizzare tutta una serie di operatori e crearne di personalizzati, per reagire quando&nbsp;qualcosa succede nella nostra applicazione.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nonostante tutta questa potenza di fuoco, questa&nbsp;\u00e8 proprio la parte meno conosciuta e sfruttata dai programmatori&nbsp;Angular. Inoltre, volendo, esiste la controparte <a href=\"https:\/\/github.com\/dotnet\/reactive\" target=\"_blank\" rel=\"noreferrer noopener\">Rx.NET<\/a>&nbsp;per portare gli&nbsp;Observable&nbsp;e i suoi operatori anche in&nbsp;Blazor,&nbsp;anche&nbsp;se,&nbsp;il pi\u00f9&nbsp;delle volte,&nbsp;non se ne sente la necessit\u00e0 a causa dei delegate e degli eventi forniti&nbsp;nativamente&nbsp;da .NET.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>State Management<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Discorso diverso invece, sono le applicazioni per le quali pu\u00f2 essere un valore aggiunto l\u2019utilizzo di una libreria di State Management.&nbsp;In un approccio completamente reattivo, possiamo immaginare di avere localmente (nel browser intendo) uno store&nbsp;centralizzato&nbsp;che rappresenta lo stato dell\u2019applicazione&nbsp;a cui \u00e8 possibile sottoscriversi per essere notificati dei cambiamenti. Questo store pu\u00f2 essere modificato solo seguendo una serie di funzioni pure (per evitare side&nbsp;effects) che trattano strutture dati immutabili.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mi dispiace&nbsp;banalizzare&nbsp;il concetto&nbsp;perch\u00e9&nbsp;\u00e8 molto interessante, magari ne parleremo in un altro articolo, ma&nbsp;a mio parere&nbsp;ha&nbsp;senso&nbsp;per applicazioni&nbsp;molto&nbsp;grandi che hanno una logica locale complessa,&nbsp;perch\u00e9&nbsp;rende la manutenibilit\u00e0 dell\u2019applicazione pi\u00f9 sostenibile, a fronte di un debito tecnico pi\u00f9 alto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;Angular&nbsp;esistono librerie&nbsp;ormai diventate standard de facto per gestire un approccio del genere,&nbsp;come&nbsp;NgRx, che ha una maturit\u00e0&nbsp;e diffusione&nbsp;tale da poterci&nbsp;basare le proprie soluzioni&nbsp;abbastanza a cuor leggero.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resta comunque la possibilit\u00e0 di gestire lo stato applicativo anche in applicazioni semplici, semplicemente andando a mantenere in memoria dei service o sfruttando l\u2019accesso agli storage del browser. Vi lascio un <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/state-management?view=aspnetcore-5.0&amp;pivots=webassembly\" target=\"_blank\" rel=\"noreferrer noopener\">link alla documentazione ufficiale<\/a> per farvi un\u2019idea.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusioni<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Possiamo concludere che, nonostante la differenza di anzianit\u00e0, i due framework&nbsp;si equivalgono&nbsp;nella&nbsp;maggior pare degli scenari business&nbsp;medio\/piccoli&nbsp;in cui vengono utilizzati.&nbsp;Negli scenari medio\/grandi invece&nbsp;Angular, grazie al supporto di&nbsp;RxJS&nbsp;che potenzia drasticamente tutte le sue librerie&nbsp;e un&nbsp;Lazy&nbsp;Load pi\u00f9 completo, si posiziona&nbsp;sicuramente meglio.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ma se il grosso delle logiche&nbsp;da implementare&nbsp;sono CRUD e il back-end \u00e8 scritto in .NET, la possibilit\u00e0 di condividere librerie tra back-end e front-end, su cui centralizzare&nbsp;regole di validazione e di generazione dinamica della UI,&nbsp;grazie a attributi standard e custom, fa pendere inevitabilmente la bilancia verso&nbsp;Blazor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comunque, c\u2019\u00e8 ancora da valutare un aspetto importantissimo, le performance, in tutte le&nbsp;sue&nbsp;sfaccettature, quindi restate sintonizzati per la terza e ultima parte di questo confronto all\u2019ultimo&nbsp;bit.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy Coding<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Dall\u2019analisi al confronto: le funzionalit\u00e0 <\/p>\n","protected":false},"author":196716248,"featured_media":32836,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637387,688637459],"class_list":["post-32825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular","tag-blazor"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Blazor vs Angular: quale scegliere? Seconda parte - Blexin<\/title>\n<meta name=\"description\" content=\"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blazor vs Angular: quale scegliere? Seconda parte - Blexin\" \/>\n<meta property=\"og:description\" content=\"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-11T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-12T09:26:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1105\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michele Aponte\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michele Aponte\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/\"},\"author\":{\"name\":\"Michele Aponte\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\"},\"headline\":\"Blazor vs Angular: quale scegliere? Seconda parte\",\"datePublished\":\"2021-05-11T08:00:00+00:00\",\"dateModified\":\"2021-05-12T09:26:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/\"},\"wordCount\":3074,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1\",\"keywords\":[\"Angular\",\"Blazor\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/\",\"name\":\"Blazor vs Angular: quale scegliere? Seconda parte - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2021-05-11T08:00:00+00:00\",\"dateModified\":\"2021-05-12T09:26:25+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\"},\"description\":\"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/blazor-vs-angular-quale-scegliere-seconda-parte\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blazor vs Angular: quale scegliere? Seconda parte\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/cdc5540c3b6edcacd8d760669e797005\",\"name\":\"Michele Aponte\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g\",\"caption\":\"Michele Aponte\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/michele-aponteblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Blazor vs Angular: quale scegliere? Seconda parte - Blexin","description":"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/","og_locale":"it_IT","og_type":"article","og_title":"Blazor vs Angular: quale scegliere? Seconda parte - Blexin","og_description":"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati","og_url":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/","og_site_name":"Blexin","article_published_time":"2021-05-11T08:00:00+00:00","article_modified_time":"2021-05-12T09:26:25+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","type":"image\/png"}],"author":"Michele Aponte","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Michele Aponte","Tempo di lettura stimato":"10 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/"},"author":{"name":"Michele Aponte","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005"},"headline":"Blazor vs Angular: quale scegliere? Seconda parte","datePublished":"2021-05-11T08:00:00+00:00","dateModified":"2021-05-12T09:26:25+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/"},"wordCount":3074,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","keywords":["Angular","Blazor"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/","url":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/","name":"Blazor vs Angular: quale scegliere? Seconda parte - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","datePublished":"2021-05-11T08:00:00+00:00","dateModified":"2021-05-12T09:26:25+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005"},"description":"Nella seconda parte del confronto fra Angular e Blazor, Michele analizza le funzionalit\u00e0 dei framework per frontend pi\u00f9 utilizzati","breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","width":1105,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/blazor-vs-angular-quale-scegliere-seconda-parte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Blazor vs Angular: quale scegliere? Seconda parte"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/cdc5540c3b6edcacd8d760669e797005","name":"Michele Aponte","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32138aff568f2063b34d27a23cef27e09f3159bfcadea5ea05599c499cf4342f?s=96&d=identicon&r=g","caption":"Michele Aponte"},"url":"https:\/\/blexin.com\/it\/author\/michele-aponteblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/05\/ITA-angularvsblazor2.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8xr","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716248"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=32825"}],"version-history":[{"count":32,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32825\/revisions"}],"predecessor-version":[{"id":32886,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32825\/revisions\/32886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/32836"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=32825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=32825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=32825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}