{"id":33680,"date":"2022-03-28T09:00:00","date_gmt":"2022-03-28T07:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=33680"},"modified":"2024-06-28T09:35:31","modified_gmt":"2024-06-28T07:35:31","slug":"angular-present-and-future","status":"publish","type":"post","link":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/","title":{"rendered":"Angular: present and future"},"content":{"rendered":"<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"33699\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/14_ita_1105x656_blog-angular13-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13.png?fit=300%2C178&amp;ssl=1\" 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\" class=\"wp-image-33699\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>It\u2019s been awhile since the last news <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-10-what-has-changed-in-the-last-three-months\/\" target=\"_blank\" rel=\"noreferrer noopener\">article<\/a> about the framework, so let&#8217;s get back to talking about Angular . According to <a href=\"https:\/\/gist.github.com\/tkrotoff\/b1caa4c3a185629299ec234d2314e190\" target=\"_blank\" rel=\"noreferrer noopener\">surveys<\/a> conducted by Stack Overflow, Angular remains the second most popular front-end framework coming in behind React, although the gap has grown compared to 2020. Another curiosity is that it does not seem particularly loved by its users (in fact it\u2019s ranked fourth).\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"281\" data-attachment-id=\"33626\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-00-58-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58.png?fit=300%2C82&amp;ssl=1\" 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\" class=\"wp-image-33626\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>It seems that it\u2019s stability, instead of increasing its use, produces a dwindling enthusiasm: as if a complete framework, but too &#8220;opinionated&#8221;, is no longer enough. It is a paradox that is pushing the Angular team to reconsider some of their past choices, as we will see in the final paragraph. In the meantime, let&#8217;s see what happened in 2021.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>During 2021, two major versions were released (<a href=\"https:\/\/blog.angular.io\/angular-v12-is-now-available-32ed51fbfd49\" target=\"_blank\" rel=\"noreferrer noopener\">v.12<\/a> and <a href=\"https:\/\/blog.angular.io\/angular-v13-is-now-available-cce66f7bc296\" target=\"_blank\" rel=\"noreferrer noopener\">v.13<\/a>). First of all, the transition period, which started with the publication of version 9 where Ivy was inserted for the new compilation and rendering pipeline, has ended. The previous option, known as the View Engine, has been deprecated since version 12 (without any needed intervention in the code) although the libraries dependent on it have continued to work thanks to a special compiler called ngcc. As of version 13, however, View Engine is no longer available.\u00a0\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" data-attachment-id=\"33630\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-03-01-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01.png?fit=300%2C212&amp;ssl=1\" 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\" class=\"wp-image-33630\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>It took years to complete Ivy and the results are evident even in the case of small applications: Angular has become simpler, faster and easier to maintain thanks to type checking, build optimizations and fast change detection (which we talked about <a href=\"https:\/\/blexin.com\/en\/blog-en\/the-change-detection-in-angular\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).\u00a0<\/p>\n<p>&nbsp;<\/p>\n<h1>Angular Package Format\u00a0<\/h1>\n<p>&nbsp;<\/p>\n<p>Changes have been made to Angular Package Format (APF). What is it? It is a specification for the structure and format of npm packages that is used primarily by native libraries (for example @angular\/core or @angular\/material) but also by third-party libraries. In the rough and tumble JavaScript world, developers consume packages in many different ways: some use <a href=\"https:\/\/github.com\/systemjs\/systemjs\" target=\"_blank\" rel=\"noreferrer noopener\">SystemJS<\/a>, others <a href=\"https:\/\/webpack.js.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WebPack<\/a>, or they might consume packages in Node or perhaps in the browser as <a href=\"https:\/\/github.com\/umdjs\/umd\" target=\"_blank\" rel=\"noreferrer noopener\">UMD<\/a> bundles, or through global access variables.\u00a0This proliferation is due to the fact that for a long time JavaScript did not have an official way of importing\/exporting code modules.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>APF supports all commonly used development tools and workflows with an emphasis on optimizations (smaller application sizes and shorter build times). At this <a href=\"https:\/\/docs.google.com\/document\/d\/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs\/preview\" target=\"_blank\" rel=\"noreferrer noopener\">address<\/a> you can find the specifications, while in the following image you can find an excerpt of the @angular\/core package.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"952\" data-attachment-id=\"33636\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-07-51-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51.png?fit=300%2C279&amp;ssl=1\" 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\" class=\"wp-image-33636\" 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=\"\" 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<p>&nbsp;<\/p>\n<h1>Angular Dev Tools<\/h1>\n<p>&nbsp;<\/p>\n<p>A browser extension is available on the Chrome web <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/angular-devtools\/ienfalfjdbdpebioblfackkekamfmbnh\" target=\"_blank\" rel=\"noreferrer noopener\">store<\/a> that gives Angular developers new tools for both debugging and profiling applications. After installation, a tab called Angular becomes available in Chrome Dev Tools.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" data-attachment-id=\"33639\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-09-41-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41.png?fit=300%2C177&amp;ssl=1\" 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\" class=\"wp-image-33639\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>The extension also has two additional tabs: Components and Profiler. The first allows you to explore the components and directives, to see a preview of them or change their status. The second offers a look at the execution of Angular change detection.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"392\" data-attachment-id=\"33643\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-11-13-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13.png?fit=300%2C115&amp;ssl=1\" 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\" class=\"wp-image-33643\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>In the image, you can see a sequence of bars, each of which symbolizes the cycles of change detection. The higher a bar, the longer the time spent in that cycle. Each bar has a detail that also shows the parental hierarchy of the selected directives.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"537\" data-attachment-id=\"33649\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-16-09-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09.png?fit=300%2C157&amp;ssl=1\" 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\" class=\"wp-image-33649\" 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=\"\" 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<p>&nbsp;<\/p>\n<h1>Testing in Angular<\/h1>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.protractortest.org\/%22%20\/l%20%22\/\" target=\"_blank\" rel=\"noreferrer noopener\">Protractor<\/a> is a framework for end-to-end testing in Angular applications. It\u2019s future is uncertain and as of version 12 it is no longer included in the new projects. The idea is to provide support for third-party solutions such as Cypress, WebdriverIO and TestCafe.<\/p>\n<p>&nbsp;<\/p>\n<p>Remaining in the field of testing, we recall that Angular offers <a href=\"https:\/\/jasmine.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jasmine<\/a> in its projects, a JavaScript framework for writing and executing unit and integration tests. There is an official and comprehensive <a href=\"https:\/\/testing-angular.com\/test-suites-with-jasmine\/%22%20\/l%20%22test-suites-with-jasmine\" target=\"_blank\" rel=\"noreferrer noopener\">guide<\/a> on how the Angular team thinks components, modules, services, pipes and directives should be tested. We also refer you to an <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-testing-you-dont-scare-me\/\">article<\/a> by Adolfo for an introductory discussion on the subject.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>Version 13 of Angular introduces improvements to the TestBed class that impact memory consumption and the speed of execution of each test performed. The detail is described in the following series of <a href=\"https:\/\/dev.to\/this-is-angular\/improving-angular-tests-by-enabling-angular-testing-module-teardown-38kh\" target=\"_blank\" rel=\"noreferrer noopener\">articles<\/a>.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<h1>Nullish Coalescing\u00a0<\/h1>\n<p>&nbsp;<\/p>\n<p>The ?? operator, which has long been used by TypeScript developers, has also been made available in Angular templates since version 12. So while up to now it had been necessary to write code like the following in templates:\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">{{age !== null &amp;&amp; age !== undefined ? age : calculateAge() }} <\/pre>\n<p>&nbsp;<\/p>\n<p>now it is possible to write like so (clearly an advantage )\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">{{ age ?? calculateAge() }} <\/pre>\n<p>&nbsp;<\/p>\n<h1>Dynamic creation of components<\/h1>\n<p>&nbsp;<\/p>\n<p>Ivy also benefits developers when writing code. Starting from version 13, the API for dynamically creating a component has been simplified (in this <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-9-what-changes-and-why-use-it\/\">article<\/a> I introduced the problem). ComponentFactoryResolver injection is no longer required, so a component can be instantiated with ViewContainerRef.createComponent without having to create an associated factory. So, with the new API, we can write for example:\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">@Directive({ \u2026 }) \r\nexport class MyDirective { \r\n    constructor(private viewContainerRef: ViewContainerRef) {} \r\n    createMyComponent() { \r\n        this.viewContainerRef.createComponent(MyComponent); \r\n    } \r\n} <\/pre>\n<p>&nbsp;<\/p>\n<h1>Good-bye IE11\u00a0<\/h1>\n<p>&nbsp;<\/p>\n<p>IE11 has been permanently abandoned. The removal allows Angular not only to take advantage of the features of modern browsers (e.g. CSS variables and web animation) but also to produce smaller and faster applications due to the removal of Internet Explorer-specific polyfills.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<h1>ng CLI\u00a0<\/h1>\n<p>&nbsp;<\/p>\n<p>The ng build command, starting from version 12, works by default on production. In addition, the CLI has enabled strict mode by default, which allows you to discover errors starting at the earliest stages of development. <a href=\"https:\/\/angular.io\/guide\/strict-mode\" target=\"_blank\" rel=\"noreferrer noopener\">Here<\/a> you will find the details about this mode.<\/p>\n<p>&nbsp;<\/p>\n<p>The language service has also been moved to default to an Ivy-based one. What is it? We are talking about the service used by editors and IDEs for error checking and self-completion of instructions. The CLI now supports the use of a persistent build cache. Thanks to it you have a 68% improvement in build speed. This configuration (described in detail <a href=\"https:\/\/angular.io\/cli\/cache\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>) is inserted within the angular.json file\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">{ \r\n    \"$schema\": \"...\", \r\n    \"cli\": { \r\n        \"cache\": { \r\n            \"enabled\": true, \r\n            \"path\": \".cache\", \r\n            \"environment\": \"all\" \r\n        } \r\n    } \r\n    ... \r\n} <\/pre>\n<p>&nbsp;<\/p>\n<h1>Updating dependencies<\/h1>\n<p>&nbsp;<\/p>\n<p>When we create a new app with the ng new command we now use version 7.4 of RxJS.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>The JavaScript responsive extensions library is used pretty much everywhere in Angular and so we&#8217;re talking about an absolutely fundamental dependency.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>RxJs 7 is smaller than RxJs 6: so we go from 52 KB to only 19KB. An important refactor of the code has been made.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" data-attachment-id=\"33661\" data-permalink=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/attachment\/schermata-2022-03-14-alle-15-29-33-2\/\" 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-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33.png?fit=300%2C167&amp;ssl=1\" 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\" class=\"wp-image-33661\" 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=\"\" 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<p>&nbsp;<\/p>\n<p>The toPromise operator has been deprecated and will be completely removed in version 8. In it\u2019s place, firstValueFrom() and lastValueFrom() were introduced. The firstValueFrom() operator resolves the promise on the first value of an observable before executing the unsubscribe. The lastValueFrom operator, on the other hand, waits for the last value before resolving the promise. So while in the past we had this<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">const numbers$ = of(1,2,3,4,5) \r\n\/\/ toPromise() will return the last value of the observable \r\nnumbers$.toPromise().then(n =&gt; console.log(\"toPromise(): \" + n)) <\/pre>\n<p>&nbsp;<\/p>\n<p>now we can choose between\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">\/\/ lastValueFrom() will return the last value just like to promise \r\nlastValueFrom(numbers$).then(n =&gt; console.log(\"lastValueFrom(): \" + n)) \r\n\r\n \/\/ firstValueFrom() will return the first value of the observable \r\nfirstValueFrom(numbers$).then(n =&gt; console.log(\"firstValueFrom(): \" + n))  <\/pre>\n<p>&nbsp;<\/p>\n<p>Beware that several operators have been renamed (e.g. zip has become zipWith), others deprecated and new additions have been made. <a href=\"https:\/\/indepth.dev\/posts\/1353\/the-state-of-rxjs-rxjs-7-and-beyond\" target=\"_blank\" rel=\"noreferrer noopener\">Here<\/a> you will find the detail.\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h1>And the future?<strong>\u00a0<\/strong><\/h1>\n<p>&nbsp;<\/p>\n<p>There are two main requests made by users and that are being processed by the Angular team. The official roadmap is available at the following <a href=\"https:\/\/angular.io\/guide\/roadmap%22%20\/l%20%22better-developer-ergonomics-with-strict-typing-for-angularforms\" target=\"_blank\" rel=\"noreferrer noopener\">address<\/a>.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>The first is that of the Strictly Typed Reactive Form (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/44513\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> you will find the official RFC).<\/p>\n<p>&nbsp;<\/p>\n<p>Take, for example, a form, populated with a default value.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyForm = new FormGroup({ \r\n  address: new FormGroup({\r\n                  house: new FormControl(1234), \r\n                  street: new FormControl('Powell St')}), \r\n                  formal: new FormControl(false), \r\n                  foodOptions: new FormArray([]) \r\n}); <\/pre>\n<p>&nbsp;<\/p>\n<p>When we try to interact with the form and read its elements, we frequently find ourselves having \u2018any\u2019\u00a0 value types.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ type `any` \r\nconst where = partyForm.get('address.street')!.value; \/\/ type `any` \r\npartyForm.controls.formal.setValue(true); \/\/ param has type `any` <\/pre>\n<p>&nbsp;<\/p>\n<p>Let&#8217;s imagine that we have a corresponding type:\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">type Party = { \r\n  address: { \r\n      house: number,   \r\n      street: string, \r\n  }, \r\n  formal: boolean, \r\n  foodOptions: Array&lt;{ \r\n    food: string, \r\n    price: number, \r\n  }&gt; \r\n} <\/pre>\n<p>&nbsp;<\/p>\n<p>With the proposal soon to be be published we will have the elements of the form completely typed. For example:\u00a0\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ a `Party` object \r\nconst where = partyForm.get('address.street')!.value; \/\/ type `string` \r\npartyForm.controls.formal.setValue(true); \/\/ param has type `boolean` <\/pre>\n<p>&nbsp;<\/p>\n<p>The second request is more radical (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> you can find the detail): make the modules optional.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>NgModules are the basic concept of an Angular application. Even a Hello World app needs one to run. Modules are the reuse unit, libraries are modules, lazy-loading is based on modules (<a href=\"https:\/\/blexin.com\/en\/blog-en\/using-lazy-loading-pattern-in-angular\/\">here<\/a> Adolfo talks about it).\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>Earlier, however, we talked about the dynamic creation of a component instance. This feature is full of pitfalls and it is not a given that the runtime works correctly. A component can expect\u00a0 that upon its\u00a0 constructor&#8217;s invocation, a service will be passed on. Typically it is a module that ensures that this happens correctly but if I directly install a component we risk not having the necessary provider at runtime. So, if you think about it (and it&#8217;s the only example in the web framework scene), components need modules that are therefore the smallest block of reusable code.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>In the next versions of Angular we will be able to choose whether or not to use NgModules. A standalone component (or pipe or directive) will not be declared in any module and will independently manage its dependencies and can be used directly without the need for an intermediate NgModule. Here&#8217;s a simple example:\u00a0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \r\n@Component({ \r\n  standalone: true,   \r\n  template: `I'm a standalone component!` \r\n}) \r\nexport class HelloStandaloneComponent {} <\/pre>\n<p>&nbsp;<\/p>\n<p>How will we manage dependencies? An imports property will be added inside the decorator @Component where we will specify the dependencies present in the template:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \r\nimport {FooComponent, BarDirective, BazPipe} from '.\/template-deps'; \r\n\r\n @Component({ \r\n  standalone: true, \r\n  imports: [FooComponent, BarDirective, BazPipe], \r\n  template: `<\/pre>\n<div>{{expr | baz}}<\/div>\n<pre class=\"wp-block-syntaxhighlighter-code\"> \r\n  ` \r\n}) \r\nexport class ExampleStandaloneComponent {} <\/pre>\n<p>&nbsp;<\/p>\n<h1>Conclusions\u00a0<\/h1>\n<p>&nbsp;<\/p>\n<p>The Angular team has therefore accepted the challenge of trying to provide, to those who want to use it, an alternative way to what has been seen so far.\u00a0 Meanwhile, TypeScript and RxJS continue to make it an extremely solid framework for developing front-end solutions. These are the only essential dependencies of the framework and this means that development teams do not accumulate technical debt by following third-party libraries even for common problems such as managing forms or HTTP calls. TypeScript is now also used in the React ecosystem. RxJS, on the other hand, remains the most difficult theoretical obstacle to overcome for a team that starts using Angular, but, in my opinion, it is the real added value of this framework.\u00a0<\/p>\n<p>&nbsp;<\/p>\n<p>See you at the next article!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s take a look at the current state of Angular<\/p>\n","protected":false},"author":196716245,"featured_media":33699,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33699\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/14_ITA_1105x656_blog-angular13-1024x608.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>It\u2019s been awhile since the last news <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-10-what-has-changed-in-the-last-three-months\/\" target=\"_blank\" rel=\"noreferrer noopener\">article<\/a> about the framework, so let's get back to talking about Angular . According to <a href=\"https:\/\/gist.github.com\/tkrotoff\/b1caa4c3a185629299ec234d2314e190\" target=\"_blank\" rel=\"noreferrer noopener\">surveys<\/a> conducted by Stack Overflow, Angular remains the second most popular front-end framework coming in behind React, although the gap has grown compared to 2020. Another curiosity is that it does not seem particularly loved by its users (in fact it\u2019s ranked fourth).\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33626\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.00.58-1024x281.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>It seems that it\u2019s stability, instead of increasing its use, produces a dwindling enthusiasm: as if a complete framework, but too \"opinionated\", is no longer enough. It is a paradox that is pushing the Angular team to reconsider some of their past choices, as we will see in the final paragraph. In the meantime, let's see what happened in 2021.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>During 2021, two major versions were released (<a href=\"https:\/\/blog.angular.io\/angular-v12-is-now-available-32ed51fbfd49\" target=\"_blank\" rel=\"noreferrer noopener\">v.12<\/a> and <a href=\"https:\/\/blog.angular.io\/angular-v13-is-now-available-cce66f7bc296\" target=\"_blank\" rel=\"noreferrer noopener\">v.13<\/a>). First of all, the transition period, which started with the publication of version 9 where Ivy was inserted for the new compilation and rendering pipeline, has ended. The previous option, known as the View Engine, has been deprecated since version 12 (without any needed intervention in the code) although the libraries dependent on it have continued to work thanks to a special compiler called ngcc. As of version 13, however, View Engine is no longer available.\u00a0\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33630\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.03.01-1024x724.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>It took years to complete Ivy and the results are evident even in the case of small applications: Angular has become simpler, faster and easier to maintain thanks to type checking, build optimizations and fast change detection (which we talked about <a href=\"https:\/\/blexin.com\/en\/blog-en\/the-change-detection-in-angular\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Angular Package Format\u00a0<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Changes have been made to Angular Package Format (APF). What is it? It is a specification for the structure and format of npm packages that is used primarily by native libraries (for example @angular\/core or @angular\/material) but also by third-party libraries. In the rough and tumble JavaScript world, developers consume packages in many different ways: some use <a href=\"https:\/\/github.com\/systemjs\/systemjs\" target=\"_blank\" rel=\"noreferrer noopener\">SystemJS<\/a>, others <a href=\"https:\/\/webpack.js.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WebPack<\/a>, or they might consume packages in Node or perhaps in the browser as <a href=\"https:\/\/github.com\/umdjs\/umd\" target=\"_blank\" rel=\"noreferrer noopener\">UMD<\/a> bundles, or through global access variables.\u00a0This proliferation is due to the fact that for a long time JavaScript did not have an official way of importing\/exporting code modules.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>APF supports all commonly used development tools and workflows with an emphasis on optimizations (smaller application sizes and shorter build times). At this <a href=\"https:\/\/docs.google.com\/document\/d\/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs\/preview\" target=\"_blank\" rel=\"noreferrer noopener\">address<\/a> you can find the specifications, while in the following image you can find an excerpt of the @angular\/core package.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33636\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.07.51-1024x952.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Angular Dev Tools<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>A browser extension is available on the Chrome web <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/angular-devtools\/ienfalfjdbdpebioblfackkekamfmbnh\" target=\"_blank\" rel=\"noreferrer noopener\">store<\/a> that gives Angular developers new tools for both debugging and profiling applications. After installation, a tab called Angular becomes available in Chrome Dev Tools.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33639\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.09.41-1024x604.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The extension also has two additional tabs: Components and Profiler. The first allows you to explore the components and directives, to see a preview of them or change their status. The second offers a look at the execution of Angular change detection.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33643\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.11.13-1024x392.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>In the image, you can see a sequence of bars, each of which symbolizes the cycles of change detection. The higher a bar, the longer the time spent in that cycle. Each bar has a detail that also shows the parental hierarchy of the selected directives.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33649\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.16.09-1024x537.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Testing in Angular<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p><a href=\"http:\/\/www.protractortest.org\/%22%20\/l%20%22\/\" target=\"_blank\" rel=\"noreferrer noopener\">Protractor<\/a> is a framework for end-to-end testing in Angular applications. It\u2019s future is uncertain and as of version 12 it is no longer included in the new projects. The idea is to provide support for third-party solutions such as Cypress, WebdriverIO and TestCafe.<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Remaining in the field of testing, we recall that Angular offers <a href=\"https:\/\/jasmine.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jasmine<\/a> in its projects, a JavaScript framework for writing and executing unit and integration tests. There is an official and comprehensive <a href=\"https:\/\/testing-angular.com\/test-suites-with-jasmine\/%22%20\/l%20%22test-suites-with-jasmine\" target=\"_blank\" rel=\"noreferrer noopener\">guide<\/a> on how the Angular team thinks components, modules, services, pipes and directives should be tested. We also refer you to an <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-testing-you-dont-scare-me\/\">article<\/a> by Adolfo for an introductory discussion on the subject.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Version 13 of Angular introduces improvements to the TestBed class that impact memory consumption and the speed of execution of each test performed. The detail is described in the following series of <a href=\"https:\/\/dev.to\/this-is-angular\/improving-angular-tests-by-enabling-angular-testing-module-teardown-38kh\" target=\"_blank\" rel=\"noreferrer noopener\">articles<\/a>.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Nullish Coalescing\u00a0<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The ?? operator, which has long been used by TypeScript developers, has also been made available in Angular templates since version 12. So while up to now it had been necessary to write code like the following in templates:\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">{{age !== null &amp;&amp; age !== undefined ? age : calculateAge() }} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>now it is possible to write like so (clearly an advantage )\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">{{ age ?? calculateAge() }} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Dynamic creation of components<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Ivy also benefits developers when writing code. Starting from version 13, the API for dynamically creating a component has been simplified (in this <a href=\"https:\/\/blexin.com\/en\/blog-en\/angular-9-what-changes-and-why-use-it\/\">article<\/a> I introduced the problem). ComponentFactoryResolver injection is no longer required, so a component can be instantiated with ViewContainerRef.createComponent without having to create an associated factory. So, with the new API, we can write for example:\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">@Directive({ \u2026 }) \r\nexport class MyDirective { \r\n    constructor(private viewContainerRef: ViewContainerRef) {} \r\n    createMyComponent() { \r\n        this.viewContainerRef.createComponent(MyComponent); \r\n    } \r\n} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Good-bye IE11\u00a0<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>IE11 has been permanently abandoned. The removal allows Angular not only to take advantage of the features of modern browsers (e.g. CSS variables and web animation) but also to produce smaller and faster applications due to the removal of Internet Explorer-specific polyfills.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>ng CLI\u00a0<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The ng build command, starting from version 12, works by default on production. In addition, the CLI has enabled strict mode by default, which allows you to discover errors starting at the earliest stages of development. <a href=\"https:\/\/angular.io\/guide\/strict-mode\" target=\"_blank\" rel=\"noreferrer noopener\">Here<\/a> you will find the details about this mode.<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The language service has also been moved to default to an Ivy-based one. What is it? We are talking about the service used by editors and IDEs for error checking and self-completion of instructions. The CLI now supports the use of a persistent build cache. Thanks to it you have a 68% improvement in build speed. This configuration (described in detail <a href=\"https:\/\/angular.io\/cli\/cache\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>) is inserted within the angular.json file\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">{ \r\n    \"$schema\": \"...\", \r\n    \"cli\": { \r\n        \"cache\": { \r\n            \"enabled\": true, \r\n            \"path\": \".cache\", \r\n            \"environment\": \"all\" \r\n        } \r\n    } \r\n    ... \r\n} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Updating dependencies<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>When we create a new app with the ng new command we now use version 7.4 of RxJS.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The JavaScript responsive extensions library is used pretty much everywhere in Angular and so we're talking about an absolutely fundamental dependency.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>RxJs 7 is smaller than RxJs 6: so we go from 52 KB to only 19KB. An important refactor of the code has been made.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<figure class=\"wp-block-image size-large\"><img class=\"wp-image-33661\" src=\"https:\/\/blexin.com\/wp-content\/uploads\/2022\/03\/Schermata-2022-03-14-alle-15.29.33-1024x569.png\" alt=\"\" \/><\/figure>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The toPromise operator has been deprecated and will be completely removed in version 8. In it\u2019s place, firstValueFrom() and lastValueFrom() were introduced. The firstValueFrom() operator resolves the promise on the first value of an observable before executing the unsubscribe. The lastValueFrom operator, on the other hand, waits for the last value before resolving the promise. So while in the past we had this<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">const numbers$ = of(1,2,3,4,5) \r\n\/\/ toPromise() will return the last value of the observable \r\nnumbers$.toPromise().then(n =&gt; console.log(\"toPromise(): \" + n)) <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>now we can choose between\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">\/\/ lastValueFrom() will return the last value just like to promise \r\nlastValueFrom(numbers$).then(n =&gt; console.log(\"lastValueFrom(): \" + n)) \r\n\r\n \/\/ firstValueFrom() will return the first value of the observable \r\nfirstValueFrom(numbers$).then(n =&gt; console.log(\"firstValueFrom(): \" + n))  <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Beware that several operators have been renamed (e.g. zip has become zipWith), others deprecated and new additions have been made. <a href=\"https:\/\/indepth.dev\/posts\/1353\/the-state-of-rxjs-rxjs-7-and-beyond\" target=\"_blank\" rel=\"noreferrer noopener\">Here<\/a> you will find the detail.\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>And the future?<strong>\u00a0<\/strong><\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>There are two main requests made by users and that are being processed by the Angular team. The official roadmap is available at the following <a href=\"https:\/\/angular.io\/guide\/roadmap%22%20\/l%20%22better-developer-ergonomics-with-strict-typing-for-angularforms\" target=\"_blank\" rel=\"noreferrer noopener\">address<\/a>.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The first is that of the Strictly Typed Reactive Form (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/44513\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> you will find the official RFC).<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Take, for example, a form, populated with a default value.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyForm = new FormGroup({ \r\n  address: new FormGroup({\r\n                  house: new FormControl(1234), \r\n                  street: new FormControl('Powell St')}), \r\n                  formal: new FormControl(false), \r\n                  foodOptions: new FormArray([]) \r\n}); <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>When we try to interact with the form and read its elements, we frequently find ourselves having \u2018any\u2019\u00a0 value types.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ type `any` \r\nconst where = partyForm.get('address.street')!.value; \/\/ type `any` \r\npartyForm.controls.formal.setValue(true); \/\/ param has type `any` <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Let's imagine that we have a corresponding type:\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">type Party = { \r\n  address: { \r\n      house: number,   \r\n      street: string, \r\n  }, \r\n  formal: boolean, \r\n  foodOptions: Array&lt;{ \r\n    food: string, \r\n    price: number, \r\n  }&gt; \r\n} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>With the proposal soon to be be published we will have the elements of the form completely typed. For example:\u00a0\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">const partyDetails = partyForm.getRawValue(); \/\/ a `Party` object \r\nconst where = partyForm.get('address.street')!.value; \/\/ type `string` \r\npartyForm.controls.formal.setValue(true); \/\/ param has type `boolean` <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The second request is more radical (<a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> you can find the detail): make the modules optional.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>NgModules are the basic concept of an Angular application. Even a Hello World app needs one to run. Modules are the reuse unit, libraries are modules, lazy-loading is based on modules (<a href=\"https:\/\/blexin.com\/en\/blog-en\/using-lazy-loading-pattern-in-angular\/\">here<\/a> Adolfo talks about it).\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>Earlier, however, we talked about the dynamic creation of a component instance. This feature is full of pitfalls and it is not a given that the runtime works correctly. A component can expect\u00a0 that upon its\u00a0 constructor's invocation, a service will be passed on. Typically it is a module that ensures that this happens correctly but if I directly install a component we risk not having the necessary provider at runtime. So, if you think about it (and it's the only example in the web framework scene), components need modules that are therefore the smallest block of reusable code.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>In the next versions of Angular we will be able to choose whether or not to use NgModules. A standalone component (or pipe or directive) will not be declared in any module and will independently manage its dependencies and can be used directly without the need for an intermediate NgModule. Here's a simple example:\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \r\n@Component({ \r\n  standalone: true,   \r\n  template: `I'm a standalone component!` \r\n}) \r\nexport class HelloStandaloneComponent {} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>How will we manage dependencies? An imports property will be added inside the decorator @Component where we will specify the dependencies present in the template:<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<pre class=\"wp-block-syntaxhighlighter-code\">import {Component} from '@angular\/core'; \r\nimport {FooComponent, BarDirective, BazPipe} from '.\/template-deps'; \r\n\r\n @Component({ \r\n  standalone: true, \r\n  imports: [FooComponent, BarDirective, BazPipe], \r\n  template: `<\/pre>\r\n<div>{{expr | baz}}<\/div>\r\n<pre class=\"wp-block-syntaxhighlighter-code\"> \r\n  ` \r\n}) \r\nexport class ExampleStandaloneComponent {} <\/pre>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<h1>Conclusions\u00a0<\/h1>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>The Angular team has therefore accepted the challenge of trying to provide, to those who want to use it, an alternative way to what has been seen so far.\u00a0 Meanwhile, TypeScript and RxJS continue to make it an extremely solid framework for developing front-end solutions. These are the only essential dependencies of the framework and this means that development teams do not accumulate technical debt by following third-party libraries even for common problems such as managing forms or HTTP calls. TypeScript is now also used in the React ecosystem. RxJS, on the other hand, remains the most difficult theoretical obstacle to overcome for a team that starts using Angular, but, in my opinion, it is the real added value of this framework.\u00a0<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>See you at the next article!<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n<p>&nbsp;<\/p>\r\n","_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":[688637524],"tags":[688637390],"class_list":["post-33680","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-en","tag-angular-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular: present and future - Blexin<\/title>\n<meta name=\"description\" content=\"Let&#039;s take a look at the current state of Angular and what the future of this framework could be\" \/>\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\/en\/blog-en\/angular-present-and-future\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular: present and future - Blexin\" \/>\n<meta property=\"og:description\" content=\"Let&#039;s take a look at the current state of Angular and what the future of this framework could be\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\" \/>\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=\"2024-06-28T07:35:31+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=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salvatore Sorrentino\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\"},\"author\":{\"name\":\"Salvatore Sorrentino\",\"@id\":\"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed\"},\"headline\":\"Angular: present and future\",\"datePublished\":\"2022-03-28T07:00:00+00:00\",\"dateModified\":\"2024-06-28T07:35:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\"},\"wordCount\":1644,\"image\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\",\"url\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\",\"name\":\"Angular: present and future - Blexin\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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\":\"2024-06-28T07:35:31+00:00\",\"author\":{\"@id\":\"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed\"},\"description\":\"Let's take a look at the current state of Angular and what the future of this framework could be\",\"breadcrumb\":{\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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\/en\/blog-en\/angular-present-and-future\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blexin.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular: present and future\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blexin.com\/en\/#website\",\"url\":\"https:\/\/blexin.com\/en\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blexin.com\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed\",\"name\":\"Salvatore Sorrentino\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blexin.com\/en\/#\/schema\/person\/image\/\",\"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\/en\/author\/salvatore-sorrentinoblexin-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular: present and future - Blexin","description":"Let's take a look at the current state of Angular and what the future of this framework could be","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\/en\/blog-en\/angular-present-and-future\/","og_locale":"en_US","og_type":"article","og_title":"Angular: present and future - Blexin","og_description":"Let's take a look at the current state of Angular and what the future of this framework could be","og_url":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/","og_site_name":"Blexin","article_published_time":"2022-03-28T07:00:00+00:00","article_modified_time":"2024-06-28T07:35:31+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":{"Written by":"Salvatore Sorrentino","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/"},"author":{"name":"Salvatore Sorrentino","@id":"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"headline":"Angular: present and future","datePublished":"2022-03-28T07:00:00+00:00","dateModified":"2024-06-28T07:35:31+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/"},"wordCount":1644,"image":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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":"en-US"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/","url":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/","name":"Angular: present and future - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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":"2024-06-28T07:35:31+00:00","author":{"@id":"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"description":"Let's take a look at the current state of Angular and what the future of this framework could be","breadcrumb":{"@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blexin.com\/en\/blog-en\/angular-present-and-future\/#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\/en\/blog-en\/angular-present-and-future\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/en\/"},{"@type":"ListItem","position":2,"name":"Angular: present and future"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/en\/#website","url":"https:\/\/blexin.com\/en\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blexin.com\/en\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed","name":"Salvatore Sorrentino","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blexin.com\/en\/#\/schema\/person\/image\/","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\/en\/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-8Le","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/posts\/33680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/users\/196716245"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/comments?post=33680"}],"version-history":[{"count":10,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/posts\/33680\/revisions"}],"predecessor-version":[{"id":35134,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/posts\/33680\/revisions\/35134"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/media\/33699"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/media?parent=33680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/categories?post=33680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/en\/wp-json\/wp\/v2\/tags?post=33680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}