{"id":25748,"date":"2024-05-10T22:58:56","date_gmt":"2024-05-10T20:58:56","guid":{"rendered":"https:\/\/www.angulararchitects.io\/blog\/angular-17-update-control-flow-app-builder-migration\/"},"modified":"2025-04-06T08:53:20","modified_gmt":"2025-04-06T06:53:20","slug":"angular-17-update","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/","title":{"rendered":"Angular 17 Update: Control Flow &#038; App Builder Migration"},"content":{"rendered":"<p>Since <em>Angular 18<\/em> is around the corner (planned for the <a href=\"https:\/\/angular.io\/guide\/releases#release-schedule\">Week of May 20, 2024<\/a>), it's now time to actually update to <em>Angular 17<\/em> in production.<\/p>\n<p>Besides the automatic update process executed mainly by Angular's fantastic CLI, we also need to take care of <strong>3rd party dependencies<\/strong>, the new <strong>control flow migration<\/strong> and eventually switch to the new <strong>application builder<\/strong> using esbuild and Vite.<\/p>\n<h2>When to update Angular<\/h2>\n<p>Manfred and I generally recommend updating <strong>after<\/strong> the first or even the second minor release <strong>V[N].1.0<\/strong> and <strong>before<\/strong> the next major release <strong>V[N+1].0.0<\/strong>.<\/p>\n<p>The reason for waiting up to the second minor is mainly to allow 3rd party libraries to catch up and provide compatible versions of their packages. Most of them will try to catch up earlier \u2013 however, just to make sure everything is well tested and stable for production use.<\/p>\n<p>In case of the <em>Angular 17<\/em> update, the recommended update window is between <em>V17.2.0<\/em> (February 14, 2024) and <em>V18.0.0<\/em> (planned for the week of May 20, 2024). So, it's about time to update \ud83d\ude0a<\/p>\n<h2>Doing an Angular update<\/h2>\n<h3>Using the Angular CLI<\/h3>\n<p>In my experience, Angular updates are usually quite smooth and straightforward. The <em>Angular CLI<\/em> provides a fantastic tool to automate the update process. You can run the following command to update your project to <em>Angular 17<\/em>:<\/p>\n<pre><code class=\"language-bash\">ng update @angular\/core@17 @angular\/cli@17<\/code><\/pre>\n<p>Depending on your project setup, you might want to include some additional packages like <a href=\"mailto:code&gt;@angular\/material&lt;\/code\">code>@angular\/material<\/code<\/a> and <a href=\"mailto:code&gt;@angular\/cdk&lt;\/code\">code>@angular\/cdk<\/code<\/a> or <a href=\"mailto:code&gt;@angular-eslint\/schematics&lt;\/code\">code>@angular-eslint\/schematics<\/code<\/a>:<\/p>\n<pre><code class=\"language-bash\">ng update @angular\/core@17 @angular\/cli@17 @angular\/material@17 @angular\/cdk@17 @angular-eslint\/schematics@17<\/code><\/pre>\n<p>If you're using Nrwl <code>Nx<\/code>, you can simply run:<\/p>\n<pre><code class=\"language-bash\">nx migrate latest<\/code><\/pre>\n<p>As already mentioned, these Angular core updates typically are very smooth. If something needs to be changed in your codebase or configuration, the <em>CLI<\/em> will do it automatically or \u2013 if that's not possible \u2013 tell you what to do and provide you with the necessary information.<\/p>\n<p>By the way, it's officially planned to use AI in the <em>Angular CLI<\/em> in the future to make the automated update process even smoother \ud83e\udd2f<\/p>\n<h3>Manually updating 3rd party packages<\/h3>\n<p>However, you need to be aware that <strong>the CLI can't and doesn't update everything<\/strong>. Since most Angular Apps use 3rd party dependencies, you need to check if they have a compatible version for <em>Angular 17<\/em>. If yes, you must update them too. If they are not Angular specific you should update them as well to get the latest features, bug fixes and - most importantly - security updates. In any case, you should avoid <strong>peer dependency conflicts<\/strong>.<\/p>\n<p>Here is an example of how you can update packages manually. First, check for outstanding updates:<\/p>\n<pre><code class=\"language-bash\">npm outdated<\/code><\/pre>\n<p>Then update the mentioned packages. I typically use my favorite IDE, Intellij WebStorm, to find the latest version: Simply open your <code>package.json<\/code> and your IDE will show you the latest version of the package when editing the version. When done updating the dependencies, run:<\/p>\n<pre><code class=\"language-bash\">npm i | yarn | pnpm i<\/code><\/pre>\n<h3>Important notes on updating 3rd party packages<\/h3>\n<ol>\n<li>If you're using Component Frameworks from <code>Bootstrap<\/code> to <code>Angular Material<\/code>, watch out for <strong>breaking changes<\/strong> that need your attention.<\/li>\n<li>If you're running multiple frontend projects on your machine, make sure to try <strong><a href=\"https:\/\/pnpm.io\/installation\">pnpm<\/a><\/strong> for faster installs and much, much less disk space consumption \ud83c\udf89<\/li>\n<li>Make sure to <strong>avoid peer dependency conflicts<\/strong> as good as possible. For example, you won't be able to use the latest <code>eslint<\/code> version 9.X.X because <code>@angular-eslint<\/code> currently only supports version 8.X.X. So you'd currently prefer <code>eslint<\/code> version 8.57.0 until <code>@angular-eslint<\/code> catches up (probably in Version 18, but who knows). In some cases however, we will have to use <code>npm i --legacy-peer-deps<\/code> and with that potentially screw up our dependency resolution \u2013 so be careful with that!<\/li>\n<li>Final advice on doing an update across <strong>multiple Angular versions<\/strong>: Do one version after the other and test everything in between. This way you can easily identify potential breaking changes and fix them step by step. For example, <em>Angular 16<\/em> has dropped support for <code>ViewEngine<\/code> libraries, so you need to make sure that all your dependencies are already supporting <code>Ivy<\/code>. If not, you need to update them first. In some rare cases, you might even need to replace those dependencies. At least that's what I did in my projects.<\/li>\n<\/ol>\n<p>Now let's assume you've successfully updated your project to <em>Angular 17<\/em> and all your 3rd party dependencies (except the ones like <code>eslint<\/code>) are as well up-to-date. Let's move on to the next migration step.<\/p>\n<h2>New control flow migration<\/h2>\n<p><em>Angular 17<\/em> ships with its new template <a href=\"https:\/\/angular.io\/guide\/control_flow\">control flow syntax<\/a>. The Angular team wanted to improve the framework <strong>performance<\/strong> and also the <strong>developer experience<\/strong>. At first glance the new syntax looked a bit awkward (like PHP) to me, I must confess. However, you'll get used to it pretty fast. The handling of <a href=\"mailto:code&gt;@for&lt;\/code\">code>@for<\/code<\/a> loops during runtime is up to 90% faster according to independent <a href=\"https:\/\/krausest.github.io\/js-framework-benchmark\/current.html\">benchmarks<\/a>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/angular-17-control-flow-benchmarks.png\" alt=\"Angular 17 Control Flow Benchmarks\" \/><\/p>\n<h3>Running the migration schematic<\/h3>\n<p>The <em>Angular CLI<\/em> doesn't automatically migrate your project. To migrate your Angular HTML templates to the new control flow syntax, you can use this <code>Angular CLI<\/code> schematic:<\/p>\n<pre><code class=\"language-bash\">ng g @angular\/core:control-flow<\/code><\/pre>\n<h3>Manual improvements &amp; clean up<\/h3>\n<p>While the migration schematic hopefully (and in my experience actually) doesn't produce any errors or bugs, you might want to improve and clean up your code manually afterward.<\/p>\n<p>Here is some <strong>general advice<\/strong> on the new control flow:<\/p>\n<ol>\n<li>Check your <code>@if<\/code> blocks. You might want to reduce complexity here and there by using the <code>@else if<\/code> and <code>@else<\/code>. This will make your HTML templates more readable and thus more maintainable.<\/li>\n<li>Check your <code>@for<\/code> blocks. You might want to add the <code>@empty<\/code> block \u2013 again cleaning up your HTML templates. Also, make sure you're using the now mandatory <code>track<\/code> intelligently.<\/li>\n<li>Enforce the new control flow syntax in your team. You might want to add the corresponding <code>@angular-eslint<\/code> rule to your <code>eslint<\/code> configuration:\n<pre><code class=\"language-json\">\"files\": [\"*.html\"],\n\"rules\": {\n \"@angular-eslint\/template\/prefer-control-flow\": \"warn\",<\/code><\/pre>\n<\/li>\n<li>Since you're now using the new control flow syntax, think about introducing <code>@defer<\/code> blocks for heavyweight components in your app.<\/li>\n<\/ol>\n<h3>Adding @defer for lazy-loading of components<\/h3>\n<p>To learn how to use <a href=\"mailto:code&gt;@defer&lt;\/code\">code>@defer<\/code<\/a>, check out my blog post <a href=\"https:\/\/www.angulararchitects.io\/blog\/how-to-improve-initial-load-performance-with-angular-17s-deferrable-views\/\">Angular 17\u2019s Deferrable Views<\/a>. Make sure to use <a href=\"mailto:code&gt;@defer&lt;\/code\">code>@defer<\/code<\/a> especially for large dependencies: <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/how-to-lazy-load-large-3rd-party-dependencies-with-angular-17s-defer\/\">How to lazy load large 3rd-party deps with Angular 17\u2019s @defer<\/a>.<\/p>\n<p>Now let's assume you've successfully migrated your HTML templates. Let's move on to the final migration step.<\/p>\n<h2>Application builder migration<\/h2>\n<p><em>Angular 16<\/em> introduced the new <a href=\"https:\/\/angular.io\/guide\/esbuild\">application builder<\/a> \u2013 using modern tools esbuild and Vite \u2013 which has now become the default builder for new projects in <em>Angular 17<\/em>. If you haven't switched to the new builder yet, you should try it now. It is definitely faster and also said-to-be more reliable than the old one, and it even results in a slightly smaller build size \ud83d\ude0e<\/p>\n<p>To switch existing Angular apps to the new builder, you need to run the update script or edit your <code>angular.json<\/code> (or <code>project.json<\/code> for Nx projects).<\/p>\n<h3>Changing the app builders automatically<\/h3>\n<p>Run this special update script to update all app builders automatically:<\/p>\n<pre><code class=\"language-bash\">ng update @angular\/cli --name use-application-builder<\/code><\/pre>\n<h3>Changing the app builder in angular.json<\/h3>\n<p>In your <code>angular.json<\/code>, you would typically find:<\/p>\n<pre><code class=\"language-json\">&quot;architect&quot;: {\n  &quot;build&quot;: {\n    &quot;builder&quot;: &quot;@angular-devkit\/build-angular:browser&quot;,<\/code><\/pre>\n<p>Changing the builder field is the first change you will need to make:<\/p>\n<pre><code class=\"language-json\">&quot;architect&quot;: {\n  &quot;build&quot;: {\n    &quot;builder&quot;: &quot;@angular-devkit\/build-angular:application&quot;,<\/code><\/pre>\n<p>Additionally, you need to rename <code>main<\/code> to <code>browser<\/code> within the build target. Here is a table of changes copied from the <a href=\"https:\/\/angular.io\/guide\/esbuild\">Angular Docs<\/a> on esbuild:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/esbuild.png\" alt=\"esbuild\" \/><\/p>\n<p>If you're using SSR make sure to change the builder in the <code>server<\/code> targets as well.<\/p>\n<h3>Replacing webpack bundle analyzer<\/h3>\n<p>Since were not using <code>webpack<\/code> anymore, you need to replace the <code>webpack-bundle-analyzer<\/code> as well. Here are some tools you can use to analyze your Vite bundles:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/source-map-explorer\"><strong>source-map-explorer<\/strong><\/a> (works with both webpack and Vite)\n<pre><code class=\"language-shell\">npx source-map-explorer dist\/[app-name]\/browser\/**\/*.js --no-border-checks<\/code><\/pre>\n<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/vite-bundle-visualizer\"><strong>vite-bundle-visualizer<\/strong><\/a>\n<pre><code class=\"language-shell\">npx vite-bundle-visualizer -i dist\/[app-name]\/browser\/index.html<\/code><\/pre>\n<\/li>\n<li>To find the source <strong>Treemap<\/strong> feature of Google Lighthouse DevTools, look at this screenshot:<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/google-lighthouse-treemap.png\" alt=\"Google Lighthouse Treemap\" \/><\/li>\n<\/ul>\n<p>Please feel very free to contact me via <a href=\"mailto:alexander.thalhammer@angulararchitects.io\">email<\/a>, <a href=\"https:\/\/twitter.com\/LX_T\">X<\/a> or <a href=\"https:\/\/at.linkedin.com\/in\/thalhammer\">LinkedIn<\/a> if you have any other tool you'd like to recommend (and have it mentioned here) or if you have any other question or feedback concerning this blog post.<\/p>\n<h2>Conclusion<\/h2>\n<p><em>Angular 17<\/em> is already pretty stable, so it's time to <strong>update and migrate<\/strong> your Angular projects today.<\/p>\n<p>In this post, we've shown you how to <a href=\"#doing-an-angular-update\"><strong>update Angular<\/strong><\/a> including 3rd-party packages and how to migrate to the <a href=\"#new-control-flow-migration\"><strong>new control flow<\/strong><\/a> and the <a href=\"#application-builder-migration\"><strong>new application builder<\/strong><\/a> using esbuild and Vite.<\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/update.angular.io\/?v=16.0-17.0\">Angular Update Guide V16 --&gt; V17<\/a><\/li>\n<li><a href=\"https:\/\/angular.io\/guide\/control_flow\">Angular Docs: control flow guide<\/a><\/li>\n<li><a href=\"https:\/\/www.angulararchitects.io\/blog\/how-to-improve-initial-load-performance-with-angular-17s-deferrable-views\/\">Angular 17\u2019s Deferrable Views<\/a> by Alex Thalhammer<\/li>\n<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/how-to-lazy-load-large-3rd-party-dependencies-with-angular-17s-defer\/\">How to lazy load large 3rd-party deps with Angular 17\u2019s @defer<\/a> by Alex Thalhammer<\/li>\n<li><a href=\"https:\/\/angular.io\/guide\/esbuild\">Angular Docs: esbuild guide<\/a><\/li>\n<\/ul>\n<h2>Workshops<\/h2>\n<p>If you want to deep dive into Angular, we offer a variety of workshops - both in English and German.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-accessibility-workshop\/\"><strong>Accessibility Workshop<\/strong><\/a> \u267f<\/li>\n<li><a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-performance-optimization-workshop\/\"><strong>Performance Workshop<\/strong><\/a> \ud83d\ude80<\/li>\n<li><a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-styling-workshop\/\"><strong>NG Styling Workshop<\/strong><\/a> \ud83c\udfa8<\/li>\n<\/ul>\n<p>This blog post was written by <a href=\"https:\/\/alex.thalhammer.name\">Alexander Thalhammer<\/a>. Follow me on <a href=\"https:\/\/at.linkedin.com\/in\/thalhammer\">Linkedin<\/a>, <a href=\"https:\/\/twitter.com\/LX_T\">X<\/a> or <a href=\"https:\/\/github.com\/L-X-T\">giThub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Since Angular 18 is around the corner (planned for the Week of May 20, 2024), it&#8217;s now time to actually update to Angular 17 in production. Besides the automatic update process executed mainly by Angular&#8217;s fantastic CLI, we also need to take care of 3rd party dependencies, the new control flow migration and eventually switch [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":25752,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-25748","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular 17 Update: Control Flow &amp; App Builder Migration - ANGULARarchitects<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular 17 Update: Control Flow &amp; App Builder Migration - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"Since Angular 18 is around the corner (planned for the Week of May 20, 2024), it&#039;s now time to actually update to Angular 17 in production. Besides the automatic update process executed mainly by Angular&#039;s fantastic CLI, we also need to take care of 3rd party dependencies, the new control flow migration and eventually switch [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-10T20:58:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-06T06:53:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"667\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Alexander Thalhammer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@LX_T\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alexander Thalhammer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\"},\"author\":{\"name\":\"Alexander Thalhammer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\"},\"headline\":\"Angular 17 Update: Control Flow &#038; App Builder Migration\",\"datePublished\":\"2024-05-10T20:58:56+00:00\",\"dateModified\":\"2025-04-06T06:53:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\"},\"wordCount\":243,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\",\"name\":\"Angular 17 Update: Control Flow & App Builder Migration - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg\",\"datePublished\":\"2024-05-10T20:58:56+00:00\",\"dateModified\":\"2025-04-06T06:53:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg\",\"width\":1000,\"height\":667},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular 17 Update: Control Flow &#038; App Builder Migration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\",\"name\":\"Alexander Thalhammer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"caption\":\"Alexander Thalhammer\"},\"sameAs\":[\"https:\/\/x.com\/LX_T\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular 17 Update: Control Flow & App Builder Migration - ANGULARarchitects","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:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/","og_locale":"en_US","og_type":"article","og_title":"Angular 17 Update: Control Flow & App Builder Migration - ANGULARarchitects","og_description":"Since Angular 18 is around the corner (planned for the Week of May 20, 2024), it's now time to actually update to Angular 17 in production. Besides the automatic update process executed mainly by Angular's fantastic CLI, we also need to take care of 3rd party dependencies, the new control flow migration and eventually switch [&hellip;]","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/","og_site_name":"ANGULARarchitects","article_published_time":"2024-05-10T20:58:56+00:00","article_modified_time":"2025-04-06T06:53:20+00:00","og_image":[{"width":1000,"height":667,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg","type":"image\/jpeg"}],"author":"Alexander Thalhammer","twitter_card":"summary_large_image","twitter_creator":"@LX_T","twitter_misc":{"Written by":"Alexander Thalhammer","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/"},"author":{"name":"Alexander Thalhammer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45"},"headline":"Angular 17 Update: Control Flow &#038; App Builder Migration","datePublished":"2024-05-10T20:58:56+00:00","dateModified":"2025-04-06T06:53:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/"},"wordCount":243,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/","name":"Angular 17 Update: Control Flow & App Builder Migration - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg","datePublished":"2024-05-10T20:58:56+00:00","dateModified":"2025-04-06T06:53:20+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/05\/shutterstock_527980912.jpg","width":1000,"height":667},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-17-update\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Angular 17 Update: Control Flow &#038; App Builder Migration"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45","name":"Alexander Thalhammer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","caption":"Alexander Thalhammer"},"sameAs":["https:\/\/x.com\/LX_T"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/25748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=25748"}],"version-history":[{"count":7,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/25748\/revisions"}],"predecessor-version":[{"id":29638,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/25748\/revisions\/29638"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/25752"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=25748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=25748"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=25748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}