{"id":33622,"date":"2022-03-28T09:00:00","date_gmt":"2022-03-28T07:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=33622"},"modified":"2022-03-28T09:21:44","modified_gmt":"2022-03-28T07:21:44","slug":"angular-presente-e-futuro","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/","title":{"rendered":"Angular: presente e futuro"},"content":{"rendered":"<p>[et_pb_section admin_label=&#8221;section&#8221;]<br>\n\t\t\t[et_pb_row admin_label=&#8221;row&#8221;]<br>\n\t\t\t\t[et_pb_column type=&#8221;4_4&#8243;][et_pb_text admin_label=&#8221;Text&#8221;]<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"33698\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/14_ita_1105x656_blog-angular13\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.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=\"14_ITA_1105x656_blog-angular13\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-33698\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13-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\">Torniamo a parlare di Angular dopo un po\u2019 di tempo dall\u2019ultimo <a href=\"https:\/\/blexin.com\/it\/blog\/angular-10-cose-cambiato-negli-ultimi-tre-mesi\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> sulle novit\u00e0 del framework. Secondo i <a href=\"https:\/\/gist.github.com\/tkrotoff\/b1caa4c3a185629299ec234d2314e190\" target=\"_blank\" rel=\"noreferrer noopener\">sondaggi<\/a> condotti da Stack Overflow, Angular resta il secondo framework di front-end pi\u00f9 popolare alle spalle di React, anche se il divario \u00e8 cresciuto rispetto al 2020. Altro aspetto peculiare \u00e8 che non sembra particolarmente amato dai suoi utenti (addirittura quarto).&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"281\" data-attachment-id=\"33625\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-00-58\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58.png?fit=1314%2C360&amp;ssl=1\" data-orig-size=\"1314,360\" 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=\"Schermata-2022-03-14-alle-15.00.58\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58.png?fit=1024%2C281&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58.png?resize=1024%2C281&#038;ssl=1\" alt=\"\" class=\"wp-image-33625\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58-980x268.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58-480x132.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\">Sembra che la sua stabilit\u00e0, invece che incrementarne l\u2019adozione, ne stia spegnendo l\u2019entusiasmo: come se un framework completo, ma troppo \u201copinionated\u201d, non sia pi\u00f9 sufficiente. E\u2019 un paradosso che sta spingendo il team di Angular a riconsiderare alcune scelte storiche come vedremo nel paragrafo finale. Nel frattempo vediamo cos\u2019\u00e8 successo nel 2021.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel corso del 2021, sono state pubblicate due major release (la <a href=\"https:\/\/blog.angular.io\/angular-v12-is-now-available-32ed51fbfd49\" target=\"_blank\" rel=\"noreferrer noopener\">v.12<\/a> e <a href=\"https:\/\/blog.angular.io\/angular-v13-is-now-available-cce66f7bc296\" target=\"_blank\" rel=\"noreferrer noopener\">v.13<\/a>). Si \u00e8 anzitutto concluso il periodo di transizione, avviato con la pubblicazione della versione 9 dove era stato inserito Ivy, per la nuova pipeline di compilazione e rendering. Quella usata precedentemente, nota come View Engine, \u00e8 stata deprecata a partire dalla versione 12 (senza che fosse necessario alcun intervento nel codice): le librerie dipendenti da essa hanno continuato a funzionare grazie a un compilatore speciale chiamato <strong>ngcc<\/strong>. A partire dalla versione 13, per\u00f2, View Engine non \u00e8 pi\u00f9 disponibile.&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" data-attachment-id=\"33629\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-03-01\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01.png?fit=1290%2C912&amp;ssl=1\" data-orig-size=\"1290,912\" 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=\"Schermata-2022-03-14-alle-15.03.01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01.png?fit=1024%2C724&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01.png?resize=1024%2C724&#038;ssl=1\" alt=\"\" class=\"wp-image-33629\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01-980x693.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01-480x339.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\">Ci sono voluti anni per completare Ivy e i risultati sono evidenti anche nel caso di piccole applicazioni: Angular \u00e8 diventato pi\u00f9 semplice, veloce e facile da manutenere grazie al type checking, le ottimizzazioni di build e la fast change detection (di cui abbiamo parlato <a href=\"https:\/\/blexin.com\/it\/blog\/la-change-detection-in-angular\/\">qui<\/a>).\u00a0\u00a0<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Angular Package Format&nbsp;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sono state portate modifiche ad APF (Angular Package Format). Di cosa si tratta? E\u2019 una specifica per la struttura e formato dei pacchetti npm che viene usata anzitutto dalle librerie native (ad esempio @angular\/core oppure @angular\/material) ma anche da librerie di terze parti. Nel frastagliato panorama di JavaScript, gli sviluppatori consumano pacchetti in tante maniere diverse: alcuni usano <a href=\"https:\/\/github.com\/systemjs\/systemjs\" target=\"_blank\" rel=\"noreferrer noopener\">SystemJS<\/a>, altri <a href=\"https:\/\/webpack.js.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WebPack<\/a> oppure potrebbero consumare pacchetti in Node o forse nel browser come bundle <a href=\"https:\/\/github.com\/umdjs\/umd\" target=\"_blank\" rel=\"noreferrer noopener\">UMD,<\/a> o attraverso variabili di accesso globale.&nbsp; Questa proliferazione \u00e8 dovuta al fatto che per molto tempo JavaScript non ha avuto una maniera ufficiale di importare \/ esportare moduli di codice.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">APF supporta tutti gli strumenti di sviluppo e workflow pi\u00f9 comunemente usati ponendo enfasi sulle ottimizzazioni (dimensioni pi\u00f9 piccole delle applicazioni e tempi di compilazione pi\u00f9 ridotti). A <a href=\"https:\/\/docs.google.com\/document\/d\/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs\/preview\" target=\"_blank\" rel=\"noreferrer noopener\">questo<\/a> indirizzo trovate le specifiche, mentre nell\u2019immagine seguente trovate uno stralcio del pacchetto @angular\/core.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"952\" data-attachment-id=\"33635\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-07-51\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51.png?fit=1284%2C1194&amp;ssl=1\" data-orig-size=\"1284,1194\" 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=\"Schermata-2022-03-14-alle-15.07.51\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51.png?fit=1024%2C952&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51.png?resize=1024%2C952&#038;ssl=1\" alt=\"\" class=\"wp-image-33635\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51-980x911.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51-480x446.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<h1 class=\"wp-block-heading\">Angular Dev Tools<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sullo <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/angular-devtools\/ienfalfjdbdpebioblfackkekamfmbnh\" target=\"_blank\" rel=\"noreferrer noopener\">store<\/a> Chrome Web \u00e8 disponibile una estensione del browser Chrome che offre agli sviluppatori Angular nuovi strumenti sia per il debug che per il profiling delle applicazioni. Dopo l\u2019installazione diventa disponibile un tab chiamato Angular nei Chrome Dev Tools.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" data-attachment-id=\"33638\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-09-41\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41.png?fit=1288%2C760&amp;ssl=1\" data-orig-size=\"1288,760\" 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=\"Schermata-2022-03-14-alle-15.09.41\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41.png?fit=1024%2C604&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41.png?resize=1024%2C604&#038;ssl=1\" alt=\"\" class=\"wp-image-33638\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41-980x578.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41-480x283.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\">L\u2019 estensione presenta a sua volta due tab aggiuntivi: Components e Profiler. Il primo consente di esplorare le componenti e direttive, vederne un\u2019anticipazione o modificare lo stato. Il secondo offre uno sguardo sull\u2019esecuzione della change detection di Angular.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"392\" data-attachment-id=\"33642\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-11-13\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13.png?fit=1286%2C492&amp;ssl=1\" data-orig-size=\"1286,492\" 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=\"Schermata-2022-03-14-alle-15.11.13\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13.png?fit=1024%2C392&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13.png?resize=1024%2C392&#038;ssl=1\" alt=\"\" class=\"wp-image-33642\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13-980x375.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13-480x184.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\">Nell\u2019immagine, \u00e8 possibile vedere una sequenza di barre, ciascuna delle quali simboleggia i cicli della change detection. Pi\u00f9 alta \u00e8 una barra, pi\u00f9 lungo \u00e8 il tempo speso in quel ciclo. Ogni barra ha un dettaglio che mostra anche la gerarchia dei genitori delle direttive selezionate.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"537\" data-attachment-id=\"33648\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-16-09\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09.png?fit=1286%2C674&amp;ssl=1\" data-orig-size=\"1286,674\" 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=\"Schermata-2022-03-14-alle-15.16.09\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09.png?fit=1024%2C537&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09.png?resize=1024%2C537&#038;ssl=1\" alt=\"\" class=\"wp-image-33648\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09-980x514.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09-480x252.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<h1 class=\"wp-block-heading\">Testing in Angular<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/www.protractortest.org\/#\/\" target=\"_blank\" rel=\"noreferrer noopener\">Protractor<\/a> \u00e8 un framework per il test end-to-end in applicazioni Angular. Il suo futuro \u00e8 incerto e a partire dalla versione 12 non \u00e8 pi\u00f9 incluso nei nuovi progetti. L\u2019idea \u00e8 fornire supporto a soluzioni di terze parti come Cypress, WebdriverIO e TestCafe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rimanendo nell\u2019ambito dei test, ricordiamo che Angular offre nei suoi progetti <a href=\"https:\/\/jasmine.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jasmine<\/a>, un framework JavaScript per la scrittura ed esecuzione di unit ed integration test. Esiste una <a href=\"https:\/\/testing-angular.com\/test-suites-with-jasmine\/#test-suites-with-jasmine\" target=\"_blank\" rel=\"noreferrer noopener\">guida<\/a> ufficiale e completa su come il team di Angular pensa che debbano essere testati componenti, moduli, servizi, pipe e direttive. Vi rimandiamo anche a un <a href=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> del nostro Adolfo per una discussione introduttiva sull\u2019argomento.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nella versione 13 di Angular sono stati introdotti miglioramenti alla classe TestBed che impattano sul consumo di memoria e sulla velocit\u00e0 di esecuzione di ogni test eseguito. Il dettaglio \u00e8 descritto nella seguente serie di <a href=\"https:\/\/dev.to\/this-is-angular\/improving-angular-tests-by-enabling-angular-testing-module-teardown-38kh\" target=\"_blank\" rel=\"noreferrer noopener\">articoli<\/a>.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Nullish Coalescing&nbsp;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019operatore ?? che da molto tempo \u00e8 utilizzato dagli sviluppatori TypeScript, \u00e8 stato messo a disposizione anche nei template Angular a partire dalla versione 12. Quindi mentre finora era necessario scrivere codice come il seguente nei template:\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{{age !== null &amp;&amp; age !== undefined ? age : calculateAge() }} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">ora \u00e8 possible invece scrivere con ovvio beneficio:\u00a0\u00a0<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{{ age ?? calculateAge() }} \n<\/pre><\/div>\n\n\n<h1 class=\"wp-block-heading\">Creazione dinamica dei componenti<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ivy offre dei vantaggi agli sviluppatori anche in fase di scrittura del codice. A partire dalla versione 13 \u00e8 stata semplificata l\u2019API per la creazione dinamica di un componente (in questo <a href=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> avevo introdotto il problema). Non \u00e8 pi\u00f9 necessaria l\u2019iniezione di ComponentFactoryResolver e quindi un componente pu\u00f2 essere instanziato con ViewContainerRef.createComponent senza dover creare una factory associata. Quindi, con la nuova API, possiamo scrivere ad esempio:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n@Directive({ \u2026 }) \nexport class MyDirective { \n    constructor(private viewContainerRef: ViewContainerRef) {} \n    createMyComponent() { \n        this.viewContainerRef.createComponent(MyComponent); \n    } \n} \n<\/pre><\/div>\n\n\n<h1 class=\"wp-block-heading\">Addio IE11&nbsp;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">IE11 \u00e8 stato definitivamente abbandonato. La rimozione permette ad Angular non solo di sfruttare le funzionalit\u00e0 dei moderni browser (ad esempio le variabili CSS e le web animation) ma anche di produrre applicazioni pi\u00f9 piccole e veloci a causa della rimozione dei polyfills specifici di Internet Explorer.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">La ng CLI&nbsp;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Il comando ng build, a partire dalla versione 12, funziona di default su production. Inoltre la CLI ha abilitato di default lo strict mode, che permette di scoprire errori sin dalle prime fasi di sviluppo. <a href=\"https:\/\/angular.io\/guide\/strict-mode\" target=\"_blank\" rel=\"noreferrer noopener\">Qui<\/a> troverete il dettaglio su questa modalit\u00e0.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche il language service \u00e8 stato spostato di default ad uno basato su Ivy. Di cosa si tratta? Stiamo parlando del servizio utilizzato dagli editor e IDE per il controllo degli errori e l\u2019 autocompletamento delle istruzioni. La CLI ora supporta l\u2019uso di una cache di build persistente. Grazie ad essa si ha un miglioramento del 68% nella velocit\u00e0 di build. Questa configurazione (descritta nel dettaglio <a href=\"https:\/\/angular.io\/cli\/cache\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>) \u00e8 inserita all\u2019interno del file angular.json&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{ \n    &quot;$schema&quot;: &quot;...&quot;, \n    &quot;cli&quot;: { \n        &quot;cache&quot;: { \n            &quot;enabled&quot;: true, \n            &quot;path&quot;: &quot;.cache&quot;, \n            &quot;environment&quot;: &quot;all&quot; \n        } \n    } \n    ... \n} \n<\/pre><\/div>\n\n\n<h1 class=\"wp-block-heading\">Aggiornamento delle dipendenze<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Quando creiamo una nuova app col comando ng new utilizziamo adesso la versione 7.4 di RxJS.&nbsp; La libreria delle estensioni reattive di JavaScript \u00e8 usata praticamente ovunque in Angular e quindi stiamo parlando di una dipendenza assolutamente fondamentale.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RxJs 7 \u00e8 pi\u00f9 piccolo di RxJs 6: passiamo quindi da 52 KB a soli 19KB. \u00c8 stato fatto un importante refactor del codice.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" data-attachment-id=\"33660\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/attachment\/schermata-2022-03-14-alle-15-29-33\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33.png?fit=1296%2C720&amp;ssl=1\" data-orig-size=\"1296,720\" 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=\"Schermata-2022-03-14-alle-15.29.33\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33.png?fit=1024%2C569&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33.png?resize=1024%2C569&#038;ssl=1\" alt=\"\" class=\"wp-image-33660\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33-980x544.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33-480x267.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\">L\u2019operatore toPromise \u00e8 stato deprecato e verr\u00e0 completamente rimosso nella versione 8. Al suo posto sono stati introdotti firstValueFrom() e lastValueFrom(). L\u2019operatore firstValueFrom() risolve la promise sul primo valore di un observable prima di eseguire l\u2019unsubscribe. L\u2019operatore lastValueFrom, invece, aspetta l\u2019ultimo valore prima di risolvere la promise. Quindi, mentre in passato avevamo che&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst numbers$ = of(1,2,3,4,5) \n\/\/ toPromise() will return the last value of the observable \nnumbers$.toPromise().then(n =&gt; console.log(&quot;toPromise(): &quot; + n)) \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">adesso possiamo scegliere&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ lastValueFrom() will return the last value just like to promise \nlastValueFrom(numbers$).then(n =&gt; console.log(&quot;lastValueFrom(): &quot; + n)) \n\n \/\/ firstValueFrom() will return the first value of the observable \nfirstValueFrom(numbers$).then(n =&gt; console.log(&quot;firstValueFrom(): &quot; + n))  \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Attenzione che diversi operatori sono stati rinominati (ad esempio zip \u00e8 diventato zipWith), altri deprecati e nuovi aggiunti. <a href=\"https:\/\/indepth.dev\/posts\/1353\/the-state-of-rxjs-rxjs-7-and-beyond\" target=\"_blank\" rel=\"noreferrer noopener\">Qui<\/a> troverete il dettaglio.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>E il futuro?&nbsp;<\/strong><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sono due le principali richieste fatte dagli utenti e che sono in fase di elaborazione da parte del team di Angular. La roadmap ufficiale \u00e8 presente al seguente <a href=\"https:\/\/angular.io\/guide\/roadmap#better-developer-ergonomics-with-strict-typing-for-angularforms\" target=\"_blank\" rel=\"noreferrer noopener\">indirizzo<\/a>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La prima \u00e8 quella dei Strictly Typed Reactive Form (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/44513\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> troverete la RFC ufficiale). Prendiamo ad esempio un form, popolato con un valore default.&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst partyForm = new FormGroup({ \n  address: new FormGroup({\n                  house: new FormControl(1234), \n                  street: new FormControl(&#039;Powell St&#039;)}), \n                  formal: new FormControl(false), \n                  foodOptions: new FormArray(&#x5B;]) \n}); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Quando proviamo ad interagire col form e leggere i suoi elementi, ci troviamo frequentemente ad avere dei valori di tipo any.&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nconst partyDetails = partyForm.getRawValue(); \/\/ type `any` \nconst where = partyForm.get(&#039;address.street&#039;)!.value; \/\/ type `any` \npartyForm.controls.formal.setValue(true); \/\/ param has type `any` \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Immaginiamo di avere un type corrispondente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ntype Party = { \n  address: { \n      house: number,   \n      street: string, \n  }, \n  formal: boolean, \n  foodOptions: Array&amp;lt;{ \n    food: string, \n    price: number, \n  }&gt; \n} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con la proposta in fase di pubblicazione avremo che gli elementi del form sono completamenti tipizzati. Ad esempio:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nconst partyDetails = partyForm.getRawValue(); \/\/ a `Party` object \nconst where = partyForm.get(&#039;address.street&#039;)!.value; \/\/ type `string` \npartyForm.controls.formal.setValue(true); \/\/ param has type `boolean` \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La seconda richiesta \u00e8 pi\u00f9 radicale (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> ne trovate il dettaglio): rendere i moduli opzionali.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gli NgModule sono il concetto base di una applicazione Angular. Persino un\u2019app <em>Hello World<\/em> ne ha bisogno di uno per la sua esecuzione. I moduli sono l\u2019unit\u00e0 di riutilizzo, le librerie sono moduli, il lazy-loading \u00e8 basato sui moduli (<a href=\"https:\/\/blexin.com\/it\/blog\/usiamo-il-lazy-loading-pattern-in-angular\/\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> ne parla sempre il nostro Adolfo).&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poco prima, per\u00f2, abbiamo parlato della creazione dinamica di un\u2019istanza di un componente. Tale funzionalit\u00e0 nasconde delle insidie e non \u00e8 detto che a runtime funzioni correttamente. Un componente pu\u00f2 aspettarsi che all\u2019invocazione del suo costruttore venga passato un servizio. Tipicamente \u00e8 un modulo che garantisce che ci\u00f2 avvenga correttamente ma se istanzio direttamente un componente rischio di non avere il provider necessario a runtime. Quindi, se ci pensate (ed \u00e8 l\u2019unico esempio nella scena dei framework web), i componenti hanno bisogno dei moduli che sono quindi il blocco pi\u00f9 piccolo di codice riutilizzabile.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nelle prossime versioni di Angular potremo scegliere se utilizzare o meno gli NgModule. Uno standalone component (o pipe o directive) non sar\u00e0 dichiarato in alcun modulo e gestir\u00e0 autonomamente le proprie dipendenze e potr\u00e0 essere usato direttamente senza aver bisogno di un NgModule intermedio. Ecco un semplice esempio:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nimport {Component} from &#039;@angular\/core&#039;; \n@Component({ \n  standalone: true,   \n  template: `I&#039;m a standalone component!` \n}) \nexport class HelloStandaloneComponent {} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come gestiremo le dipendenze? Verr\u00e0 aggiunta una propriet\u00e0 imports all\u2019interno del decoratore @Component dove andremo a specificare le dipendenze presenti nel template&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nimport {Component} from &#039;@angular\/core&#039;; \nimport {FooComponent, BarDirective, BazPipe} from &#039;.\/template-deps&#039;; \n\n @Component({ \n  standalone: true, \n  imports: &#x5B;FooComponent, BarDirective, BazPipe], \n  template: ` \n    &amp;lt;foo-cmp&gt;&amp;lt;\/foo-cmp&gt; \n    &amp;lt;div bar&gt;{{expr | baz}}&amp;lt;\/div&gt; \n  ` \n}) \nexport class ExampleStandaloneComponent {} \n<\/pre><\/div>\n\n\n<h1 class=\"wp-block-heading\">Conclusioni&nbsp;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Il team di Angular ha quindi accettato la sfida di provare a fornire, a chi voglia utilizzarlo, una strada alternativa rispetto a quanto visto finora.&nbsp; Nel frattempo, TypeScript e RxJS continuano a renderlo un framework estremamente solido per lo sviluppo di soluzioni front-end. Sono queste le uniche dipendenze imprescindibili del framework e ci\u00f2 fa s\u00ec che i team di sviluppo non accumulino debito tecnico seguendo librerie di terze parti anche per problemi comuni quali la gestione dei form o delle chiamate HTTP. TypeScript ormai \u00e8 utilizzato anche nell\u2019ecosistema React. RxJS, invece, resta lo scoglio teorico pi\u00f9 difficile da superare per un team che inizi ad utilizzare Angular, ma, a mio modo di vedere, \u00e8 il vero valore aggiunto di questo framework.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla prossima.<\/p>\n\n\n<p>[\/et_pb_text][\/et_pb_column]<br>\n\t\t\t[\/et_pb_row]<br>\n\t\t[\/et_pb_section]<\/p>","protected":false},"excerpt":{"rendered":"<p>Facciamo il punto sullo stato attuale di Angular<\/p>\n","protected":false},"author":196716245,"featured_media":33698,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"<!-- wp:image {\"id\":33698,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13-1024x608.png\" alt=\"\" class=\"wp-image-33698\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>Torniamo a parlare di Angular dopo un po\u2019 di tempo dall\u2019ultimo <a href=\"https:\/\/blexin.com\/it\/blog\/angular-10-cose-cambiato-negli-ultimi-tre-mesi\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> sulle novit\u00e0 del framework. Secondo i <a href=\"https:\/\/gist.github.com\/tkrotoff\/b1caa4c3a185629299ec234d2314e190\" target=\"_blank\" rel=\"noreferrer noopener\">sondaggi<\/a> condotti da Stack Overflow, Angular resta il secondo framework di front-end pi\u00f9 popolare alle spalle di React, anche se il divario \u00e8 cresciuto rispetto al 2020. Altro aspetto peculiare \u00e8 che non sembra particolarmente amato dai suoi utenti (addirittura quarto).&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33625,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58-1024x281.png\" alt=\"\" class=\"wp-image-33625\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>Sembra che la sua stabilit\u00e0, invece che incrementarne l\u2019adozione, ne stia spegnendo l\u2019entusiasmo: come se un framework completo, ma troppo \u201copinionated\u201d, non sia pi\u00f9 sufficiente. E\u2019 un paradosso che sta spingendo il team di Angular a riconsiderare alcune scelte storiche come vedremo nel paragrafo finale. Nel frattempo vediamo cos\u2019\u00e8 successo nel 2021.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Nel corso del 2021, sono state pubblicate due major release (la <a href=\"https:\/\/blog.angular.io\/angular-v12-is-now-available-32ed51fbfd49\" target=\"_blank\" rel=\"noreferrer noopener\">v.12<\/a> e <a href=\"https:\/\/blog.angular.io\/angular-v13-is-now-available-cce66f7bc296\" target=\"_blank\" rel=\"noreferrer noopener\">v.13<\/a>). Si \u00e8 anzitutto concluso il periodo di transizione, avviato con la pubblicazione della versione 9 dove era stato inserito Ivy, per la nuova pipeline di compilazione e rendering. Quella usata precedentemente, nota come View Engine, \u00e8 stata deprecata a partire dalla versione 12 (senza che fosse necessario alcun intervento nel codice): le librerie dipendenti da essa hanno continuato a funzionare grazie a un compilatore speciale chiamato <strong>ngcc<\/strong>. A partire dalla versione 13, per\u00f2, View Engine non \u00e8 pi\u00f9 disponibile.&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33629,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01-1024x724.png\" alt=\"\" class=\"wp-image-33629\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>Ci sono voluti anni per completare Ivy e i risultati sono evidenti anche nel caso di piccole applicazioni: Angular \u00e8 diventato pi\u00f9 semplice, veloce e facile da manutenere grazie al type checking, le ottimizzazioni di build e la fast change detection (di cui abbiamo parlato <a href=\"https:\/\/blexin.com\/en\/blog-en\/the-change-detection-in-angular\/\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>).&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Angular Package Format&nbsp;<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Sono state portate modifiche ad APF (Angular Package Format). Di cosa si tratta? E\u2019 una specifica per la struttura e formato dei pacchetti npm che viene usata anzitutto dalle librerie native (ad esempio @angular\/core oppure @angular\/material) ma anche da librerie di terze parti. Nel frastagliato panorama di JavaScript, gli sviluppatori consumano pacchetti in tante maniere diverse: alcuni usano <a href=\"https:\/\/github.com\/systemjs\/systemjs\" target=\"_blank\" rel=\"noreferrer noopener\">SystemJS<\/a>, altri <a href=\"https:\/\/webpack.js.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WebPack<\/a> oppure potrebbero consumare pacchetti in Node o forse nel browser come bundle <a href=\"https:\/\/github.com\/umdjs\/umd\" target=\"_blank\" rel=\"noreferrer noopener\">UMD,<\/a> o attraverso variabili di accesso globale.&nbsp; Questa proliferazione \u00e8 dovuta al fatto che per molto tempo JavaScript non ha avuto una maniera ufficiale di importare \/ esportare moduli di codice.&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>APF supporta tutti gli strumenti di sviluppo e workflow pi\u00f9 comunemente usati ponendo enfasi sulle ottimizzazioni (dimensioni pi\u00f9 piccole delle applicazioni e tempi di compilazione pi\u00f9 ridotti). A <a href=\"https:\/\/docs.google.com\/document\/d\/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs\/preview\" target=\"_blank\" rel=\"noreferrer noopener\">questo<\/a> indirizzo trovate le specifiche, mentre nell\u2019immagine seguente trovate uno stralcio del pacchetto @angular\/core.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33635,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51-1024x952.png\" alt=\"\" class=\"wp-image-33635\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Angular Dev Tools<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Sullo <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/angular-devtools\/ienfalfjdbdpebioblfackkekamfmbnh\" target=\"_blank\" rel=\"noreferrer noopener\">store<\/a> Chrome Web \u00e8 disponibile una estensione del browser Chrome che offre agli sviluppatori Angular nuovi strumenti sia per il debug che per il profiling delle applicazioni. Dopo l\u2019installazione diventa disponibile un tab chiamato Angular nei Chrome Dev Tools&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33638,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41-1024x604.png\" alt=\"\" class=\"wp-image-33638\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>L\u2019 estensione presenta a sua volta due tab aggiuntivi: Components e Profiler. Il primo consente di esplorare le componenti e direttive, vederne un\u2019anticipazione o modificare lo stato. Il secondo offre uno sguardo sull\u2019esecuzione della change detection di Angular.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33642,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13-1024x392.png\" alt=\"\" class=\"wp-image-33642\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>Nell\u2019immagine, \u00e8 possibile vedere una sequenza di barre, ciascuna delle quali simboleggia i cicli della change detection. Pi\u00f9 alta \u00e8 una barra, pi\u00f9 lungo \u00e8 il tempo speso in quel ciclo. Ogni barra ha un dettaglio che mostra anche la gerarchia dei genitori delle direttive selezionate.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33648,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09-1024x537.png\" alt=\"\" class=\"wp-image-33648\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Testing in Angular<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><a href=\"http:\/\/www.protractortest.org\/#\/\" target=\"_blank\" rel=\"noreferrer noopener\">Protractor<\/a> \u00e8 un framework per il test end-to-end in applicazioni Angular. Il suo futuro \u00e8 incerto e a partire dalla versione 12 non \u00e8 pi\u00f9 incluso nei nuovi progetti. L\u2019idea \u00e8 fornire supporto a soluzioni di terze parti come Cypress, WebdriverIO e TestCafe.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Rimanendo nell\u2019ambito dei test, ricordiamo che Angular offre nei suoi progetti <a href=\"https:\/\/jasmine.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jasmine<\/a>, un framework JavaScript per la scrittura ed esecuzione di unit ed integration test. Esiste una <a href=\"https:\/\/testing-angular.com\/test-suites-with-jasmine\/#test-suites-with-jasmine\" target=\"_blank\" rel=\"noreferrer noopener\">guida<\/a> ufficiale e completa su come il team di Angular pensa che debbano essere testati componenti, moduli, servizi, pipe e direttive. Vi rimandiamo anche a un <a href=\"https:\/\/blexin.com\/it\/blog\/angular-testing-non-mi-fai-paura\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> del nostro Adolfo per una discussione introduttiva sull\u2019argomento.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Nella versione 13 di Angular sono stati introdotti miglioramenti alla classe TestBed che impattano sul consumo di memoria e sulla velocit\u00e0 di esecuzione di ogni test eseguito. Il dettaglio \u00e8 descritto nella seguente serie di <a href=\"https:\/\/dev.to\/this-is-angular\/improving-angular-tests-by-enabling-angular-testing-module-teardown-38kh\" target=\"_blank\" rel=\"noreferrer noopener\">articoli<\/a>.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Nullish Coalescing&nbsp;<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>L\u2019operatore ?? che da molto tempo \u00e8 utilizzato dagli sviluppatori TypeScript \u00e8 stato messo a disposizione anche nei template Angular a partire dalla versione 12. Quindi mentre finora era necessario scrivere codice come il seguente nei template:&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">{{age !== null &amp;&amp; age !== undefined ? age : calculateAge() }} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>ora \u00e8 possible invece scrivere con ovvio beneficio&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">{{ age ?? calculateAge() }} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Creazione dinamica dei componenti<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ivy offre dei vantaggi agli sviluppatori anche in fase di scrittura del codice. A partire dalla versione 13 \u00e8 stata semplificata l\u2019API per la creazione dinamica di un componente (in questo <a href=\"https:\/\/blexin.com\/it\/blog\/angular-9-cosa-cambia-e-perche-usarlo\/\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a> avevo introdotto il problema). Non \u00e8 pi\u00f9 necessaria l\u2019iniezione di ComponentFactoryResolver e quindi un componente pu\u00f2 essere instanziato con ViewContainerRef.createComponent senza dover creare una factory associata. Quindi, con la nuova API, possiamo scrivere ad esempio&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">@Directive({ \u2026 }) \nexport class MyDirective { \n    constructor(private viewContainerRef: ViewContainerRef) {} \n    createMyComponent() { \n        this.viewContainerRef.createComponent(MyComponent); \n    } \n} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Addio IE11&nbsp;<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>IE11 \u00e8 stato definitivamente abbandonato. La rimozione permette ad Angular non solo di sfruttare le funzionalit\u00e0 dei moderni browser (ad esempio le variabili CSS e le web animation) ma anche di produrre applicazioni pi\u00f9 piccole e veloci a causa della rimozione dei polyfills specifici di Internet Explorer.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>La ng CLI&nbsp;<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Il comando ng build, a partire dalla versione 12, funziona di default su production. Inoltre la CLI ha abilitato di default lo strict mode, che permette di scoprire errori sin dalle prime fasi di sviluppo. <a href=\"https:\/\/angular.io\/guide\/strict-mode\" target=\"_blank\" rel=\"noreferrer noopener\">Qui<\/a> troverete il dettaglio su questa modalit\u00e0.&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Anche il language service \u00e8 stato spostato di default ad uno basato su Ivy. Di cosa si tratta? Stiamo parlando del servizio utilizzato dagli editor e IDE per il controllo degli errori e l\u2019 autocompletamento delle istruzioni. La CLI ora supporta l\u2019uso di una cache di build persistente. Grazie ad essa si ha un miglioramento del 68% nella velocit\u00e0 di build. Questa configurazione (descritta nel dettaglio <a href=\"https:\/\/angular.io\/cli\/cache\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>) \u00e8 inserita all\u2019interno del file angular.json&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">{ \n    \"$schema\": \"...\", \n    \"cli\": { \n        \"cache\": { \n            \"enabled\": true, \n            \"path\": \".cache\", \n            \"environment\": \"all\" \n        } \n    } \n    ... \n} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Aggiornamento delle dipendenze<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Quando creiamo una nuova app col comando ng new utilizziamo adesso la versione 7.4 di RxJS.&nbsp; La libreria delle estensioni reattive di JavaScript \u00e8 usata praticamente ovunque in Angular e quindi stiamo parlando di una dipendenza assolutamente fondamentale.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>RxJs 7 \u00e8 pi\u00f9 piccolo di RxJs 6: passiamo quindi da 52 KB a soli 19KB. E\u2019 stato fatto un importante refactor del codice.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":33660,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33-1024x569.png\" alt=\"\" class=\"wp-image-33660\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>L\u2019operatore toPromise \u00e8 stato deprecato e verr\u00e0 completamente rimosso nella versione 8. Al suo posto sono stati introdotti firstValueFrom() e lastValueFrom(). L\u2019operatore firstValueFrom() risolve la promise sul primo valore di un observable prima di eseguire l\u2019unsubscribe. L\u2019operatore lastValueFrom, invece, aspetta l\u2019ultimo valore prima di risolvere la promise. Quindi, mentre in passato avevamo che&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">const numbers$ = of(1,2,3,4,5) \n\/\/ toPromise() will return the last value of the observable \nnumbers$.toPromise().then(n => console.log(\"toPromise(): \" + n)) <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>adesso possiamo scegliere&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">\/\/ lastValueFrom() will return the last value just like to promise \nlastValueFrom(numbers$).then(n => console.log(\"lastValueFrom(): \" + n)) \n\n \/\/ firstValueFrom() will return the first value of the observable \nfirstValueFrom(numbers$).then(n => console.log(\"firstValueFrom(): \" + n))  <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>Attenzione che diversi operatori sono stati rinominati (ad esempio zip \u00e8 diventato zipWith), altri deprecati e nuovi aggiunti. <a href=\"https:\/\/indepth.dev\/posts\/1353\/the-state-of-rxjs-rxjs-7-and-beyond\" target=\"_blank\" rel=\"noreferrer noopener\">Qui<\/a> troverete il dettaglio.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1><strong>E il futuro?&nbsp;<\/strong><\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Sono due le principali richieste fatte dagli utenti e che sono in fase di elaborazione da parte del team di Angular. La roadmap ufficiale \u00e8 presente al seguente <a href=\"https:\/\/angular.io\/guide\/roadmap#better-developer-ergonomics-with-strict-typing-for-angularforms\" target=\"_blank\" rel=\"noreferrer noopener\">indirizzo<\/a>.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>La prima \u00e8 quella dei Strictly Typed Reactive Form (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/44513\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> troverete la RFC ufficiale). Prendiamo ad esempio un form, popolato con un valore default.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code {\"language\":\"jscript\"} -->\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyForm = new FormGroup({ \n  address: new FormGroup({\n                  house: new FormControl(1234), \n                  street: new FormControl('Powell St')}), \n                  formal: new FormControl(false), \n                  foodOptions: new FormArray([]) \n}); <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>Quando proviamo ad interagire col form e leggere i suoi elementi, ci troviamo frequentemente ad avere dei valori di tipo any.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ type `any` \nconst where = partyForm.get('address.street')!.value; \/\/ type `any` \npartyForm.controls.formal.setValue(true); \/\/ param has type `any` <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>Immaginiamo di avere un type corrispondente:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">type Party = { \n  address: { \n      house: number,   \n      street: string, \n  }, \n  formal: boolean, \n  foodOptions: Array&lt;{ \n    food: string, \n    price: number, \n  }> \n} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>Con la proposta in fase di pubblicazione avremo che gli elementi del form sono completamenti tipizzati. Ad esempio:&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ a `Party` object \nconst where = partyForm.get('address.street')!.value; \/\/ type `string` \npartyForm.controls.formal.setValue(true); \/\/ param has type `boolean` <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>La seconda richiesta \u00e8 pi\u00f9 radicale (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> ne trovate il dettaglio): rendere i moduli opzionali.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Gli NgModule sono il concetto base di una applicazione Angular. Persino un\u2019app <em>Hello World<\/em> ne ha bisogno di uno per la sua esecuzione. I moduli sono l\u2019unit\u00e0 di riutilizzo, le librerie sono moduli, il lazy-loading \u00e8 basato sui moduli (<a href=\"https:\/\/blexin.com\/it\/blog\/usiamo-il-lazy-loading-pattern-in-angular\/\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a> ne parla sempre il nostro Adolfo).&nbsp;&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Poco prima, per\u00f2, abbiamo parlato della creazione dinamica di un\u2019istanza di un componente. Tale funzionalit\u00e0 nasconde delle insidie e non \u00e8 detto che a runtime funzioni correttamente. Un componente pu\u00f2 aspettarsi che all\u2019invocazione del suo costruttore venga passato un servizio. Tipicamente \u00e8 un modulo che garantisce che ci\u00f2 avvenga correttamente ma se istanzio direttamente un componente rischio di non avere il provider necessario a runtime. Quindi, se ci pensate (ed \u00e8 l\u2019unico esempio nella scena dei framework web), i componenti hanno bisogno dei moduli che sono quindi il blocco pi\u00f9 piccolo di codice riutilizzabile.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Nelle prossime versioni di Angular potremo scegliere se utilizzare o meno gli NgModule. Uno standalone component (o pipe o directive) non sar\u00e0 dichiarato in alcun modulo e gestir\u00e0 autonomamente le proprie dipendenze e potr\u00e0 essere usato direttamente senza aver bisogno di un NgModule intermedio. Ecco un semplice esempio:&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \n@Component({ \n  standalone: true,   \n  template: `I'm a standalone component!` \n}) \nexport class HelloStandaloneComponent {} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:paragraph -->\n<p>Come gestiremo le dipendenze? Verr\u00e0 aggiunta una propriet\u00e0 imports all\u2019interno del decoratore @Component dove andremo a specificare le dipendenze presenti nel template&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:syntaxhighlighter\/code -->\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \nimport {FooComponent, BarDirective, BazPipe} from '.\/template-deps'; \n\n @Component({ \n  standalone: true, \n  imports: [FooComponent, BarDirective, BazPipe], \n  template: ` \n    &lt;foo-cmp>&lt;\/foo-cmp> \n    &lt;div bar>{{expr | baz}}&lt;\/div> \n  ` \n}) \nexport class ExampleStandaloneComponent {} <\/pre>\n<!-- \/wp:syntaxhighlighter\/code -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1>Conclusioni&nbsp;<\/h1>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Il team di Angular ha quindi accettato la sfida di provare a fornire, a chi voglia utilizzarlo, una strada alternativa rispetto a quanto visto finora.&nbsp; Nel frattempo, TypeScript e RxJS continuano a renderlo un framework estremamente solido per lo sviluppo di soluzioni front-end. Sono queste le uniche dipendenze imprescindibili del framework e ci\u00f2 fa s\u00ec che i team di sviluppo non accumulino debito tecnico seguendo librerie di terze parti anche per problemi comuni quali la gestione dei form o delle chiamate HTTP. TypeScript ormai \u00e8 utilizzato anche nell\u2019ecosistema React. RxJS, invece, resta lo scoglio teorico pi\u00f9 difficile da superare per un team che inizi ad utilizzare Angular, ma, a mio modo di vedere, \u00e8 il vero valore aggiunto di questo framework.&nbsp;<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Alla prossima.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:post-author \/-->","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"jetpack_post_was_ever_published":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},"categories":[688637374],"tags":[688637387],"class_list":["post-33622","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular: presente e futuro - Blexin<\/title>\n<meta name=\"description\" content=\"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework\" \/>\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\/angular-presente-e-futuro\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular: presente e futuro - Blexin\" \/>\n<meta property=\"og:description\" content=\"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-28T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-28T07:21:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png\" \/>\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=\"Salvatore Sorrentino\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salvatore Sorrentino\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/\"},\"author\":{\"name\":\"Salvatore Sorrentino\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"headline\":\"Angular: presente e futuro\",\"datePublished\":\"2022-03-28T07:00:00+00:00\",\"dateModified\":\"2022-03-28T07:21:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/\"},\"wordCount\":1602,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1\",\"keywords\":[\"Angular\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/\",\"name\":\"Angular: presente e futuro - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2022-03-28T07:00:00+00:00\",\"dateModified\":\"2022-03-28T07:21:44+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"description\":\"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/angular-presente-e-futuro\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular: presente e futuro\"}]},{\"@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\\\/354db2bc97cac71c2ceeca21a92d5bed\",\"name\":\"Salvatore Sorrentino\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"caption\":\"Salvatore Sorrentino\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/salvatore-sorrentinoblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular: presente e futuro - Blexin","description":"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework","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\/angular-presente-e-futuro\/","og_locale":"it_IT","og_type":"article","og_title":"Angular: presente e futuro - Blexin","og_description":"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework","og_url":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/","og_site_name":"Blexin","article_published_time":"2022-03-28T07:00:00+00:00","article_modified_time":"2022-03-28T07:21:44+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png","type":"image\/png"}],"author":"Salvatore Sorrentino","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Salvatore Sorrentino","Tempo di lettura stimato":"12 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/"},"author":{"name":"Salvatore Sorrentino","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"headline":"Angular: presente e futuro","datePublished":"2022-03-28T07:00:00+00:00","dateModified":"2022-03-28T07:21:44+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/"},"wordCount":1602,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1","keywords":["Angular"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/","url":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/","name":"Angular: presente e futuro - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1","datePublished":"2022-03-28T07:00:00+00:00","dateModified":"2022-03-28T07:21:44+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"description":"Facciamo il punto sullo stato attuale di Angular e su quale possa essere il futuro di questo framework","breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1","width":1105,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/angular-presente-e-futuro\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Angular: presente e futuro"}]},{"@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\/354db2bc97cac71c2ceeca21a92d5bed","name":"Salvatore Sorrentino","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","caption":"Salvatore Sorrentino"},"url":"https:\/\/blexin.com\/it\/author\/salvatore-sorrentinoblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8Ki","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/33622","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\/196716245"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=33622"}],"version-history":[{"count":46,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/33622\/revisions"}],"predecessor-version":[{"id":33709,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/33622\/revisions\/33709"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/33698"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=33622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=33622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=33622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}