<?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: Leo Lanese</title>
    <description>The latest articles on DEV Community by Leo Lanese (@leolanese).</description>
    <link>https://dev.to/leolanese</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%2F118345%2Fe6b5c2da-7719-4822-980f-eb62da3c73f2.jpeg</url>
      <title>DEV Community: Leo Lanese</title>
      <link>https://dev.to/leolanese</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leolanese"/>
    <language>en</language>
    <item>
      <title>The Age of AI Isn't About Replacement. It's About Relevance</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Thu, 05 Mar 2026 20:02:02 +0000</pubDate>
      <link>https://dev.to/leolanese/the-age-of-ai-isnt-about-replacement-its-about-relevance-133p</link>
      <guid>https://dev.to/leolanese/the-age-of-ai-isnt-about-replacement-its-about-relevance-133p</guid>
      <description>&lt;p&gt;Let me ask you something:&lt;br&gt;
Are you afraid AI is going to take your job?&lt;/p&gt;

&lt;p&gt;If you are... I get it. The headlines are loud. The demos are wild. It feels like everything we know about building software is changing overnight.&lt;/p&gt;

&lt;p&gt;But here's what I've learned after watching this shift up close:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Age of AI isn't about replacement. It's about relevance.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Artificial intelligence has shifted from novelty to necessity. Every industry is feeling the tremor: faster production, automated workflows, and tools that can generate in seconds what once took hours. &lt;/p&gt;

&lt;p&gt;The professionals who thrive in this new era aren't the ones who fear automation. They're the ones who understand what AI is and what it isn't. They know that while AI can accelerate execution, it cannot define purpose, context, or meaning. That's where human judgment becomes more valuable than ever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI doesn't change what we build. It changes how we work.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;What AI Actually Changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI transforms the nature of work in three major ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Repetition becomes automated&lt;/code&gt;. Tasks that are mechanical, predictable, or pattern-based are now handled by machines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Speed becomes a commodity&lt;/code&gt;. Producing something quickly is no longer a differentiator, everyone has access to the same tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Expertise becomes the premium&lt;/code&gt;. The ability to define the right problem, shape the right direction, and evaluate the right outcome becomes the real value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AI Allows Us to Elevate and Accelerate.&lt;/code&gt; Software Engineers are not just coders. AI provides a way to delegate execution so we can start making higher-level decisions. It frees us to focus on architecture, strategy, security, creativity and innovation, not just syntax.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;When the "how" becomes easy, the "why" and "what" become priceless.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;The New Value Proposition: Sell the Destination&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a world where AI can generate drafts, designs, and data at scale, the competitive edge lies in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clarity of vision: knowing what should be built.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strategic judgment: understanding what matters and what does't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creative insight: shaping ideas that resonate, differentiate, and endure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience: recognising patterns, mistakes, previous battles, and opportunities AI can't see.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clients don't pay for the hours. They pay for the outcome. They pay for the ability to navigate complexity, make decisions, and craft meaning. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI is the engine, but you are the driver. &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;A Conversation That Captures the Moment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This simple exchange illustrates the mindset shift happening across industries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client said, we can do this with AI.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That's great. Me too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;So you are not worry AI is taking your job?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nope.&lt;br&gt;
&lt;code&gt;AI doesn't replace expertise.&lt;/code&gt;&lt;br&gt;
&lt;code&gt;It replace repetition.&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Still need a strategist to define the goal, orchestrate and judge the results.&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;So, what's the move?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Sell the destination, not the effort.&lt;/code&gt; Lets the robot do the busy work.&lt;br&gt;
&lt;code&gt;You charge for knowing what to build, not just how to build it.&lt;/code&gt; &lt;br&gt;
&lt;code&gt;You are selling Creativity. Experience. Judgment.&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Why This Matters Now (probably more than ever)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As AI becomes more accessible, the gap widens between those who use it as a shortcut and those who use it as a force multiplier. The latter group will lead the next decade of innovation.&lt;/p&gt;

&lt;p&gt;The question isn't "Will AI take my job?"&lt;br&gt;
The question is "How much more valuable can I become when AI handles the repetitive parts?"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Keynotes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI isn't about replacement, it allows us to elevate and accelerate by shifting value from execution to strategic judgment.&lt;/p&gt;

&lt;p&gt;Become the pilot who defines purpose—because AI is the engine, but you are the one who decides where to go. Sell the destination, not the effort.&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;Blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AI is the Sous‑Chef, Not the Chef</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Wed, 11 Feb 2026 09:26:27 +0000</pubDate>
      <link>https://dev.to/leolanese/the-different-flavors-of-french-cuisine-l39</link>
      <guid>https://dev.to/leolanese/the-different-flavors-of-french-cuisine-l39</guid>
      <description>&lt;p&gt;&lt;strong&gt;Explaining AI to My Son: From Michelin Chefs to Ratatouille&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today I was having my cup of tea, my son open the door of the living room and asked me a simple question that opens a very big door:&lt;br&gt;
&lt;em&gt;"What is AI?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's one of those moments where you want to give an answer that's true, but also something a child can actually understand. So we started talking about chefs.&lt;/p&gt;

&lt;p&gt;I told him that AI can be a bit like a Michelin‑star restaurant run by a master chef, someone who has mastered thousands of recipes, techniques, and flavours. A chef like that can create incredible dishes because they've learned from years of experience.&lt;/p&gt;

&lt;p&gt;He liked that idea.&lt;br&gt;
Then I added something even more familiar to him: &lt;strong&gt;Ratatouille&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the movie, Remy the "smart" rat isn't magic. He doesn't replace the human Alfredo Linguini the chef. Instead, he helps, guides, and elevate the chef. Linguini still chooses what to cook, tastes the food, decides what's right and even innovate about a better solution.&lt;/p&gt;

&lt;p&gt;That's how I explained AI.&lt;br&gt;
AI is like having an smarty-panties Remy in the kitchen of your mind.&lt;br&gt;
In the movie, Remy doesn't replace the human chef.&lt;/p&gt;

&lt;p&gt;He &lt;strong&gt;helps&lt;/strong&gt;.&lt;br&gt;
He &lt;strong&gt;guides&lt;/strong&gt;.&lt;br&gt;
He &lt;strong&gt;adds skill&lt;/strong&gt;&lt;br&gt;
He &lt;strong&gt;offer ideas, shortcuts, and knowledge.&lt;/strong&gt;&lt;br&gt;
He &lt;strong&gt;speed up the work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;cannot offer intention&lt;/strong&gt;.&lt;br&gt;
It &lt;strong&gt;cannot test the real flavor&lt;/strong&gt;.&lt;br&gt;
It &lt;strong&gt;cannot replace the passion and spark that makes something yours&lt;/strong&gt;.&lt;br&gt;
It &lt;strong&gt;cannot "feel the meaning behind the dish"&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Passion, creativity, innovation, and purpose still come from the expert chef.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI is a tool, a powerful one, but it needs a human mind and a human heart to direct it. &lt;strong&gt;Just like Remy needs Linguini&lt;/strong&gt;, AI needs us to decide what we're trying to create, what is this "meaning" behind the dish to make it "unique".&lt;/p&gt;

&lt;p&gt;Some people worry that using AI is "bad" or that it "replaces chef creativity". But when you frame it the right way, it becomes clear that AI is a tool, not a threat. It is A helper, an enhancer, not a replacement.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just like in Ratatouille, the magic happens when human intention and guidance meet skill and knowledge. AI doesn't replace human creativity, it amplifies it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;Blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>ai</category>
      <category>software</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Miner and the Jeweler: Why AI Code Isn't Production-Ready</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Sat, 07 Feb 2026 17:10:30 +0000</pubDate>
      <link>https://dev.to/leolanese/the-miner-and-the-jeweler-why-ai-code-isnt-production-ready-5don</link>
      <guid>https://dev.to/leolanese/the-miner-and-the-jeweler-why-ai-code-isnt-production-ready-5don</guid>
      <description>&lt;p&gt;Keep hearing voices claiming that AI is replacing Devs, and as we discuss befor in my previous article: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/leolanese/the-great-compression-why-ai-isnt-replacing-developers-its-refining-them-3j0n"&gt;The Great Compression: Why AI isn't Replacing Developers, It's Refining Them&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI-Generated Code, right now, is a Raw Diamond, Not a Finished Ring. Not a Finished pollished ring that is going to direcly represent your brand reputation to the customers in the market. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LLM's doesn't produce fully "ready for production" code, it produces "ready for refinement" code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Miner (LLM's) does the brutal, foundational work:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Finds the raw material: It scrapes through terabytes of code (the digital earth) to identify patterns, syntax, and logic.&lt;/li&gt;
&lt;li&gt;Extracts the valuable ore: It can produce code snippets, functions, even whole files that are often structurally correct and address the stated problem.&lt;/li&gt;
&lt;li&gt;Roughs out a shape: It can create a basic, functional version of what you asked for the equivalent of a roughly cut stone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But a "Ready for Production" ring requires a master jeweler (the human senior developers):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Design &amp;amp; Intent: The miner didn't conceive of the ring's design, its purpose, or how it fits into a larger collection (the software architecture). The years of experience does.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precision Cutting &amp;amp; Polishing: The raw code is full of flaws.&lt;br&gt;
Edge Cases: It doesn't handle unexpected inputs or errors gracefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UI/UX: May be not trendy and sharp as expected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Innovation: May be working "fine" but not following trends or adding innovation and "human-touch"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security: It might introduce vulnerabilities (SQL injection, insecure defaults).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance: It's rarely optimized for efficiency or scalability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration: It doesn't know how to fit neatly into your existing codebase, APIs, and CI/CD pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting &amp;amp; Context: The code must be "set" into its environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Business Logic: Does it actually fulfill the complex, often unstated, business rules?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintainability: Is it readable, documented, and follow team conventions?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing: It lacks comprehensive unit, integration, and end-to-end tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Perfect Workflow is a Collaboration:
&lt;/h2&gt;

&lt;p&gt;The real power is in combining the scale and speed of the miner with the expertise and judgment of the jeweler: A "Centaur-Developer"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Developer (Jeweler) says: "I need a function that securely authenticates a user via OAuth and returns a profile."&lt;/li&gt;
&lt;li&gt;LLM's (Miner) provides: A large, rough block of code with the basic OAuth flow, HTTP calls, and data parsing—saving hours of boilerplate writing.&lt;/li&gt;
&lt;li&gt;The Developer then: Refines it, adds input validation, error handling, logs, integrates it with the specific auth library, writes tests, and ensures it follows security protocols.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This evolution won't replace the expert, it will augment and elevate their work.** The most successful developers and companies will be those who master this new partnership, using AI to amplify their creativity and strategic impact.&lt;/p&gt;

&lt;p&gt;Right now, LLM's doesn't produce fully "ready for production" code, it produces "ready for refinement" code. &lt;/p&gt;

&lt;p&gt;They are an immensely powerful tool that drastically accelerates the initial phases of development, but the final responsibility for the "add-value" UI/UX, craftsmanship, security, and fit, for turning the raw diamond into a finished fashing ring remains firmly, with the human expert. &lt;/p&gt;

&lt;p&gt;This distintive "add-value" is precisely what will create lasting differentiation and quality for companies in the long run.&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;Blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>softwareengineering</category>
      <category>ai</category>
      <category>development</category>
      <category>code</category>
    </item>
    <item>
      <title>The Great Compression: Why AI isn't Replacing Developers, It's Refining Them</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Wed, 04 Feb 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/leolanese/the-great-compression-why-ai-isnt-replacing-developers-its-refining-them-3j0n</link>
      <guid>https://dev.to/leolanese/the-great-compression-why-ai-isnt-replacing-developers-its-refining-them-3j0n</guid>
      <description>&lt;p&gt;There is a loud, recurring narrative that AI is coming for the software engineer's job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/shorts/QZAz2oVZG6c" rel="noopener noreferrer"&gt;Link: Former Google CEO just revealed AI's scary timeline&lt;/a&gt;&lt;br&gt;
In this clip, Schmidt discusses the "San Francisco Consensus", the belief that within a year, AI will replace the vast majority of programmers as we know them. He points to "recursive self-improvement," where computers are now generating 10–20% of their own code.&lt;/p&gt;

&lt;p&gt;But let's talk about the reality on the ground.&lt;/p&gt;

&lt;p&gt;There's a difference between &lt;strong&gt;AI does lots of the coding work&lt;/strong&gt; and &lt;strong&gt;AI makes programmers irrelevant&lt;/strong&gt;. Right now, it's closer to the first than the second. The real shift isn't AI replacing Developers but about compressing work. Because, if you look at the actual workflow in modern Deveveloper shops, the reality is far more surgical. We are currently witnessing a massive shift in the industry, but it isn't an "obsolescence" event, it is a "compression" event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Augmentation vs. Replacement&lt;/strong&gt;&lt;br&gt;
Right now, we are firmly in the era of AI doing the "grunt work." AI handles the boilerplate, the unit-tests, e2e, and the repetitive syntax that used to consume hours.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;The Myth&lt;/code&gt;: AI writes the app while the human watches.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Reality&lt;/code&gt;: AI is a high-speed power tool. It "amplifies" the output of the person holding it, but it still requires an architect to ensure the structure is sound.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. The End of the "Easy Cash" Era&lt;/strong&gt;&lt;br&gt;
For the last decade, the high demand for code led to an influx of people entering the field strictly for the "high" salaries, often lacking a background, foundational interest in engineering or the "passion for resolving problems".&lt;/p&gt;

&lt;p&gt;When AI can generate (almost) functional code in seconds, the value of a Developer who just "follows instructions for a paycheck" drops to near zero.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;The Problem-Solver&lt;/code&gt;: Sees AI as a lever to solve bigger, more complex problems.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Paycheck-Seeker&lt;/code&gt;: Finds themselves competed against by a tool that is cheaper, faster, and doesn't mind repetitive tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. The "Compression" Effect&lt;/strong&gt;&lt;br&gt;
As AI amplifies productivity, the "middle" of the market starts to squeeze. When one senior engineer can produce the output of three due to AI assistance, the need for a large army of less-specialised "task-runners" diminishes.&lt;/p&gt;

&lt;p&gt;We are moving toward a world where specialisation and passion are the only true moats. If you aren't curious about how things work under the hood, AI will eventually automate your role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The Power of "Zooming Out" control&lt;/strong&gt;&lt;br&gt;
Being a "Centaur" Engineer means you no longer have to spend hours buried in the deatils of basic algorithms. You can "zoom out" to see the bigger picture. Because the AI manages the low-level execution, the engineer is free to focus on systemic efficiency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Understanding the "How"&lt;/code&gt;: You aren't just writing lines; you are understanding how the entire system breathes and scales.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Elevated Problem Solving&lt;/code&gt;: You spend your energy on architecture and high-level logic—ensuring the solution is elegant and efficient, rather than just "functional". &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Efficiency over Effort&lt;/code&gt;: The goal is no longer "hours spent coding," but the quality and performance of the final architecture. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Multiple hats in the same eco-system&lt;/strong&gt;: &lt;br&gt;
A Software Engineer has never been just a "coder", In fact, writing code is often the simplest part of the job. and in the AI era, this is more true than ever. We are well-rounded professionals who must navigate a complex ecosystem. Being a Centaur Engineer means having the versatility to wear multiple hats throughout the product lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;The Architect&lt;/code&gt;: Designing systems that are scalable and maintainable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Product Designer&lt;/code&gt;: Understanding UX and human behaviour to reduce friction.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Mentor &amp;amp; Communicator&lt;/code&gt;: Using soft skills to bridge the gap between stakeholders and the codebase.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Leader &amp;amp; Conflict resolver&lt;/code&gt;: Elevating the team through leadership, code reviews, deal with conflicts, and shared standards.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;The Business Strategist (ROI Guardian)&lt;/code&gt;: This is about looking at the CRO and KPIs. You ensure that every line of code serves a material business purpose and isn't just "tech for tech’s sake."&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;AI isn't making programmers irrelevant; it's making perfunctory programming irrelevant eventually&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The "easy cash" entry point is vanishing. The future belongs to the "Passion, eager to learn and curious Enginners". The "Centaur Enginners" (AI Body and Human Head). Those who use AI to compress months of work into weeks, zooming out to focus their human intellect on the "why" and the systemic efficiency, rather than just the "how".&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;h5&gt;
  
  
  🔘 linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 X / Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>development</category>
      <category>software</category>
    </item>
    <item>
      <title>The Operator's Manual: Navigating Angular Signals from v17.3 to v21</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Sun, 04 Jan 2026 21:02:24 +0000</pubDate>
      <link>https://dev.to/leolanese/the-operators-manual-navigating-angular-signals-from-v173-to-v21-25hj</link>
      <guid>https://dev.to/leolanese/the-operators-manual-navigating-angular-signals-from-v173-to-v21-25hj</guid>
      <description>&lt;h1&gt;
  
  
  The Operator's Manual: Navigating Angular Signals from v17.3 to v21
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A Comprehensive Guide to the Evolution of Reactivity in Angular&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Version 1.0&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Chapter 1: The Foundation (Angular 17.3) – Completing the Component API

&lt;ul&gt;
&lt;li&gt;1.1 Signal-Based Components: The Full Toolkit&lt;/li&gt;
&lt;li&gt;1.2 Operating with &lt;code&gt;output()&lt;/code&gt; and RxJS Interop&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Chapter 2: Stabilization and Architecture (Angular 18–20) – Production Readiness

&lt;ul&gt;
&lt;li&gt;2.1 From Preview to Prime Time: Graduating to Stable&lt;/li&gt;
&lt;li&gt;2.2 The Signal-Powered Service Pattern&lt;/li&gt;
&lt;li&gt;2.3 Enabling the Zoneless Future&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Chapter 3: The New Frontier (Angular 21 Experimental) – The Signal Ecosystem

&lt;ul&gt;
&lt;li&gt;3.1 Introducing Signal Forms: A Paradigm Shift&lt;/li&gt;
&lt;li&gt;3.2 Advanced Operations: Async Data and Linked State&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Chapter 4: The Operator's Field Guide – Best Practices &amp;amp; Migration

&lt;ul&gt;
&lt;li&gt;4.1 Core Principles of Signal-Based Code&lt;/li&gt;
&lt;li&gt;4.2 Upgrading Your Machinery: The Migration Path&lt;/li&gt;
&lt;li&gt;4.3 Migration Checklist: A Step-by-Step Guide&lt;/li&gt;
&lt;li&gt;4.4 Adopt signal components: Replace async pipes with direct signal calls&lt;/li&gt;
&lt;li&gt;4.5 Refactor services from BehaviorSubject to signals&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion: A New Era of Angular Reactivity&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Welcome, operator. You've been handed the keys to a machine that has undergone a profound transformation. What began as a new reactive primitive in Angular has evolved into a fully integrated system that redefines how we build, manage, and think about application state. This manual is your guide to mastering the evolution of Angular Signals, from the foundational APIs in version 17.3 to the experimental frontiers of version 21. Prepare to recalibrate your understanding of reactivity.&lt;/p&gt;


&lt;h2&gt;
  
  
  Chapter 1: The Foundation (Angular 17.3) – Completing the Component API
&lt;/h2&gt;

&lt;p&gt;Our journey begins with Angular 17.3, a release that delivered the final piece of the puzzle for creating fully decorator-less, signal-based components. This version marked the moment when the core mechanics for component communication were fully realised in the new signal paradigm.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1 Signal-Based Components: The Full Toolkit
&lt;/h3&gt;

&lt;p&gt;Prior to 17.3, the Angular team had already provided signal-based alternatives for inputs (&lt;code&gt;input()&lt;/code&gt;) and queries (&lt;code&gt;viewChild()&lt;/code&gt;). However, component outputs still relied on the traditional &lt;code&gt;@Output()&lt;/code&gt; decorator with &lt;code&gt;EventEmitter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Angular 17.3 completed this set by introducing the &lt;code&gt;output()&lt;/code&gt; function. This allowed developers to author components where all public-facing APIs, inputs, outputs, and queries, were defined as functions, creating a consistent and decorator-free experience. As noted by the Angular team, this was about creating &lt;a href="https://blog.angular.dev/meet-angulars-new-output-api-253a41ffa13c" rel="noopener noreferrer"&gt;conceptual alignment&lt;/a&gt; with the other new signal-based APIs.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 Operating with &lt;code&gt;output()&lt;/code&gt; and RxJS Interop
&lt;/h3&gt;

&lt;p&gt;The new &lt;code&gt;output()&lt;/code&gt; function provides a lightweight, RxJS-independent way to emit events. While &lt;code&gt;EventEmitter&lt;/code&gt; extended RxJS’s &lt;code&gt;Subject&lt;/code&gt;, the new &lt;code&gt;OutputEmitterRef&lt;/code&gt; returned by &lt;code&gt;output()&lt;/code&gt; is a simpler, purpose-built primitive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The transition from decorator-based outputs to function-based outputs streamlines component definitions and reduces dependency on RxJS for basic eventing.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: Angular &amp;lt;17.3&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;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&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="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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LegacyButtonComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;clicked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;onClick&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;clicked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&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="c1"&gt;// After: Angular 17.3+&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;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;output&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="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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SignalButtonComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;clicked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;onClick&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;clicked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&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;Crucially, the Angular team provided a bridge for the vast ecosystem of RxJS-based code. The @angular/core/rxjs-interop package was enhanced with outputFromObservable() and outputToObservable(). These utilities allow you to convert an RxJS stream into a component output and vice-versa, ensuring a smooth, incremental migration path without requiring a full rewrite of existing reactive logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Chapter 2: Stabilization and Architecture (Angular 18–20) – Production Readiness
&lt;/h2&gt;

&lt;p&gt;The period between Angular 18 and 20 was about hardening the new signal APIs and establishing new architectural patterns. What was once experimental became the recommended, stable foundation for modern Angular applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 From Preview to Prime Time: Graduating to Stable
&lt;/h3&gt;

&lt;p&gt;Throughout versions 18, 19, and 20, the core signal APIs, including input(), model() for 2-way binding, and signal-based queries like viewChild() and contentChildren(), graduated from developer preview to stable. According to the official Angular roadmap, v20 marked the milestone where all fundamental reactivity primitives were considered stable. This was the green light for enterprises and large-scale projects to adopt signals with confidence, knowing the API surface was reliable and supported for the long term.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The Signal-Powered Service Pattern
&lt;/h3&gt;

&lt;p&gt;With stable signals, a powerful new architectural pattern emerged for state management. Instead of relying on RxJS BehaviorSubject in services, developers began adopting a "signal-in-a-service" approach. This pattern involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A private, writable signal (e.g., _items = signal([])) to hold the state.&lt;/li&gt;
&lt;li&gt;Public, readonly or computed signals to expose state and derived values (e.g., items = this._items.asReadonly(), total = computed(() =&amp;gt; ...)).&lt;/li&gt;
&lt;li&gt;Public methods to orchestrate state changes via set() or update().&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture creates a clean, unidirectional data flow where the service is the single source of truth. Consumers can react to state changes without being able to mutate it directly. This pattern dramatically simplifies state management, improves testability due to the synchronous nature of signals, and eliminates boilerplate associated with RxJS subjects and subscriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Enabling the Zoneless Future
&lt;/h3&gt;

&lt;p&gt;The ultimate purpose of Signals extends beyond simplifying state management; it's the key to unlocking a zoneless Angular. Traditional Angular uses Zone.js to automatically trigger change detection in response to any async operation. While convenient, this can be inefficient.&lt;/p&gt;

&lt;p&gt;Signals provide a granular dependency graph. When a signal's value changes, Angular knows precisely which components or computed values depend on it and updates only them. This fine-grained reactivity makes Zone.js unnecessary. As of Angular v20.2, zoneless mode became stable, and with Angular v21, it is the default for new applications. This results in smaller bundle sizes, better performance, and more predictable application behavior.&lt;/p&gt;

&lt;p&gt;Demo example:&lt;br&gt;
&lt;a href="https://github.com/leolanese/Angular-Zoneless-Signals" rel="noopener noreferrer"&gt;https://github.com/leolanese/Angular-Zoneless-Signals&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Chapter 3: The New Frontier (Angular 21 Experimental) – The Signal Ecosystem
&lt;/h2&gt;

&lt;p&gt;With the core primitives stable, Angular 21 began exploring the next evolution: a rich ecosystem of signal-based tools that tackle some of the most complex areas of web development. These features, though experimental, offer a glimpse into a future where reactivity is seamlessly integrated into every part of the framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Introducing Signal Forms: A Paradigm Shift
&lt;/h3&gt;

&lt;p&gt;Perhaps the most anticipated feature is the new Signal Forms API, available experimentally in Angular 21 via @angular/forms/signals. It represents a fundamental rethinking of form handling, moving away from the boilerplate-heavy Reactive Forms.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signal Forms flip the script: instead of building a form structure to match your data, you start with your data model and let the form derive itself reactively.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  The core principles are:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Model-First Approach: You define your form's state as a signal, then create the form by passing it to the form() function.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define the data model as a signal&lt;/span&gt;
&lt;span class="nx"&gt;user&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="na"&gt;firstName&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;email&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="c1"&gt;// Create the form from the model&lt;/span&gt;
&lt;span class="nx"&gt;profileForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;form&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;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&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="c1"&gt;// ... validation rules&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Declarative Validation: Validation rules are defined as functions within the form's schema. This includes built-in validators (required, minLength, email), conditional validation (using a when property), and powerful cross-field validation. This replaces the imperative logic of adding/removing validators in traditional forms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplified Template Binding: The old formControlName is replaced by a new &lt;a href="https://dev.toor%20[control]%20in%20earlier%20previews"&gt;field&lt;/a&gt; directive, creating a direct, type-safe link between the template and the form field signal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built-in Submission Handling: The submit() helper function manages the submission process, automatically handling loading states (submitting()) and server-side errors, which can be mapped directly back to form fields.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This new API promises to drastically reduce boilerplate, improve type safety, and make complex validation logic far more intuitive and maintainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Advanced Operations: Async Data and Linked State
&lt;/h3&gt;

&lt;p&gt;Alongside forms, Angular introduced other advanced signal-based tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Resource API: The experimental resource and rxResource functions provide a declarative way to handle asynchronous data fetching. A resource automatically re-fetches data when its dependent signals (params) change and provides built-in signals for tracking loading, error, and value states. This eliminates manual subscription management and loading flags for API calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;linkedSignal(): This is an advanced primitive for niche scenarios. Unlike a read-only computed() signal, a linkedSignal is writable. It derives its initial value from a source signal but can also be updated manually. This is useful for cases like a dropdown selection that should reset when its options change, but still allow the user to make a manual selection.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Chapter 4: The Operator's Field Guide – Best Practices &amp;amp; Migration
&lt;/h2&gt;

&lt;p&gt;Mastering a new system requires understanding its rules of engagement. This chapter provides the essential principles and a strategic plan for upgrading your existing machinery.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Core Principles of Signal-Based Code
&lt;/h3&gt;

&lt;p&gt;Adhering to these best practices will ensure your signal-based applications are performant, predictable, and maintainable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use computed() for Derived State: This is the most critical rule. If you are calculating a value based on one or more other signals, always use computed(). Avoid using effect() to set another signal, as this is an anti-pattern that can lead to performance issues and unexpected behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use effect() for Side Effects Only: Effects are the bridge to the non-signal world. Use them for tasks like logging, syncing to localStorage, or custom DOM manipulation. Remember that effects run asynchronously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep State Flat: Avoid nesting signals within other signals or deep within objects. A flat state structure is easier to track and leads to more efficient change detection.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2 Upgrading Your Machinery &amp;amp; migrate: The Migration Path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Migrate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;
&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-input-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Migrate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="nx"&gt;outputs&lt;/span&gt;
&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-output-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Migrate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ViewChild&lt;/span&gt;&lt;span class="sr"&gt;/@ContentChild querie&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-queries-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;
&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-input-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;
&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-output-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;
&lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/core:signal-queries-migratio&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Incrementally Migrate to Signal Forms:
&lt;/h3&gt;

&lt;p&gt;For new features or during refactoring, adopt the experimental Signal Forms API. Start with simple forms and gradually tackle more complex ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify a form using traditional Reactive Forms.&lt;/li&gt;
&lt;li&gt;Define a signal for your data model: user = signal({name:'',email:''});&lt;/li&gt;
&lt;li&gt;Create the signal form: profileForm = form(this.user, ...);&lt;/li&gt;
&lt;li&gt;Update the template to use the [field] directive instead of formControlName.&lt;/li&gt;
&lt;li&gt;Replace imperative validation logic with declarative rules inside the form() function.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4 Adopt signal components: Replace async pipes with direct signal calls.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  4.5 Refactor services from BehaviorSubject to signals
&lt;/h3&gt;




&lt;h2&gt;
  
  
  Conclusion: A New Era of Angular Reactivity
&lt;/h2&gt;

&lt;p&gt;The journey from Angular 17.3 to 21 reveals a clear trajectory. Signals have evolved from a promising state primitive into the central nervous system of Angular's reactivity model. They have simplified component authoring, redefined state management architecture, unlocked a zoneless future, and are now poised to revolutionize form handling.&lt;/p&gt;

&lt;p&gt;As an operator of this modern framework, your mandate is clear: embrace this new model. By understanding its principles and leveraging its powerful ecosystem, you can build applications that are not only faster and more efficient but also simpler to write, easier to debug, and ready for the future of the web. The machinery is in your hands. Operate it with confidence.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.angularaddicts.com/p/whats-new-in-angular-17-3" rel="noopener noreferrer"&gt;What's new in Angular 17.3 – by Gergely Szerovay&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A detailed walkthrough of Angular 17.3 features including the new &lt;code&gt;output()&lt;/code&gt; API, RxJS interop helpers (&lt;code&gt;outputFromObservable&lt;/code&gt;, &lt;code&gt;outputToObservable&lt;/code&gt;), &lt;code&gt;HostAttributeToken&lt;/code&gt;, and TypeScript 5.4 support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.appsignal.com/2025/10/01/angular-signal-based-architecture-building-a-smarter-shopping-cart.html" rel="noopener noreferrer"&gt;Angular Signal-Based Architecture: Building a Smarter Shopping Cart&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Practical guide to refactoring state-heavy features using the "signal-in-a-service" pattern for cleaner, more testable, and performant applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/codewithrajat/angular-signal-based-forms-why-theyre-about-to-change-everything-you-know-about-form-handling-5an3"&gt;Angular Signal-Based Forms: Why They're About to Change Everything You Know About Form Handling&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
An early look at the experimental Signal Forms API in Angular 21, highlighting its model-first design, declarative validation, and improved developer ergonomics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://angular.schule/blog/2025-05-resource-api/" rel="noopener noreferrer"&gt;Reactive Angular: Loading Data with the Resource API&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Introduces the experimental &lt;code&gt;resource&lt;/code&gt; and &lt;code&gt;httpResource&lt;/code&gt; primitives for managing async data streams with built-in signals for loading, error, and value states.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://angular.dev/guide/signals/linked-signal" rel="noopener noreferrer"&gt;Dependent state with linkedSignal – Angular Official Guide&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Documentation on &lt;code&gt;linkedSignal()&lt;/code&gt;, a writable computed-like signal that resets when its source changes—ideal for dynamic UI controls like dependent dropdowns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/codewithrajat/angular-signals-effect-why-90-of-developers-use-it-wrong-4pl4"&gt;Angular Signals Effect(): Why 90% of Developers Use It Wrong&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Clarifies common anti-patterns with &lt;code&gt;effect()&lt;/code&gt; and emphasizes its correct use strictly for side effects (e.g., logging, &lt;code&gt;localStorage&lt;/code&gt;, DOM mutations).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://angular.dev/roadmap" rel="noopener noreferrer"&gt;Angular Roadmap – Official Angular.dev&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The canonical source for Angular’s strategic priorities, including status updates on Signals, zoneless Angular, Signal Forms, HMR, testing tooling, and future explorations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.angular.dev/meet-angulars-new-output-api-253a41ffa13c" rel="noopener noreferrer"&gt;Meet Angular's new output() API – Angular Blog&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Official announcement of the &lt;code&gt;output()&lt;/code&gt; function in Angular 17.3, explaining its type safety, alignment with signal inputs, and RxJS interop via &lt;code&gt;outputFromObservable()&lt;/code&gt; and &lt;code&gt;outputToObservable()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://push-based.io/article/angular-v21-goes-zoneless-by-default-what-changes-why-its-faster-and-how-to" rel="noopener noreferrer"&gt;Angular v21 Goes Zoneless by Default: What Changes, Why It’s Faster, and How To&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In-depth analysis of zoneless change detection becoming the default in Angular v21—covering performance gains, bundle size reduction, migration steps, and gotchas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Let's connect!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese%20%20" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink%2520%2520" alt="leolanese's GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linkedin&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blog&lt;/strong&gt;: &lt;a href="https://www.dev.to/leolanese"&gt;Dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact&lt;/strong&gt;: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Signals &amp; JS Event Loop: Rethinking Angular Reactive Sync</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Mon, 08 Sep 2025 16:14:35 +0000</pubDate>
      <link>https://dev.to/leolanese/signals-js-event-loop-rethinking-angular-reactive-sync-48bn</link>
      <guid>https://dev.to/leolanese/signals-js-event-loop-rethinking-angular-reactive-sync-48bn</guid>
      <description>&lt;p&gt;🟩 Signal definition&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signals are synchronous &lt;code&gt;reactive primitives&lt;/code&gt; containers, that hold an immutable single value &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🟩 Signals &amp;amp; Immutability&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signals are immutable, but the value they hold is not&lt;/p&gt;

&lt;p&gt;Signals in Angular are reactive primitives. Once you create a signal using signal(initialValue), that signal instance doesn't change. You don't replace the signal with another one; you update its internal state using the methods set() or update().&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🟩🟩 Immutability with signals means:&lt;br&gt;
🔸 The reference to the signal doesn't change.&lt;br&gt;
🔸 It encapsulates its reactive behavior and dependencies.&lt;br&gt;
🔸 Reactivity is predictable and traceable because the structure doesn’t change over time&lt;/p&gt;

&lt;p&gt;If the value of the Signal is a reference object (eg. an object or array) you can still modify that reference without calling the set() or update(). In practice, this means the absolute value of the Signal can change without alerting all the consumers of the Signal.&lt;/p&gt;

&lt;p&gt;🟩 Signal mutate immutability &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 Signals are immutable containers, but if the value they hold is a reference (like an object or array), that reference can be mutated directly, which bypasses Angular reactivity system.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&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="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// BAD &lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nf"&gt;user&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// GOOD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&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="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&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="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carol&lt;/span&gt;&lt;span class="dl"&gt;'&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="mi"&gt;35&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;// Update a user’s name immutably&lt;/span&gt;
&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;users&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;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&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="nx"&gt;user&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Robert&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;user&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;//  Add a new user immutably&lt;/span&gt;
&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nf"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dave&lt;/span&gt;&lt;span class="dl"&gt;'&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="mi"&gt;28&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Remove a user immutably&lt;/span&gt;
&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;users&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🟩 Angular Change-Detection &amp;amp; Signals&lt;/p&gt;

&lt;p&gt;Angular is transitioning to fine-grained reactivity. Because with default change detection, there is no way for Angular to know exactly what has changed on the page, so that is why we cannot make any "assumptions" about what happened, and &lt;strong&gt;we need to check everything.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signals are all about enabling &lt;strong&gt;very fine-grained updates&lt;/strong&gt; to the DOM that are just not possible with the current change detection systems that we have available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Simply put, a signal is a reactive primitive that represents a value and that allows us to granular change that same value in a controlled way and track its changes over time.&lt;/p&gt;




&lt;p&gt;🟩 JS Event-Loop and Signal &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Event-loop is critical for Angular reactivity and performance&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🟩🟩 Angular Change Detection &amp;amp; ZoneJS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zone.js Hooks: Zone.js patches both micro-and macrotask APIs so that every async callback (Observable emission included) triggers change detection.
&lt;/li&gt;
&lt;li&gt;Microtask Checkpoint:
Angular waits for the microtask queue to drain before running change detection, ensuring all Promise and Observable-driven state changes are applied consistently.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="nx"&gt;loop&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;microtask&lt;/span&gt; &lt;span class="nx"&gt;drained&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;Zone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;Angular&lt;/span&gt; &lt;span class="nx"&gt;runs&lt;/span&gt; &lt;span class="nx"&gt;change&lt;/span&gt; &lt;span class="nx"&gt;detection&lt;/span&gt; &lt;span class="nx"&gt;cycle&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🟩🟩 Where Signals Change the Story&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signals break the blanket dependency on event loop + Zone.js&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Signals step in by  &lt;strong&gt;breaking the blanket dependency&lt;/strong&gt; on the &lt;code&gt;event loop + ZoneJS&lt;/code&gt;. Instead of waiting for any microtask to finish, a Signal knows exactly which pieces of state are "watched" by which consumers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Blanket dependency" means Angular was completely dependent on the event loop + Zone.js for every single change detection cycle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When a signal changes, Angular doesn't need to run global change detection. It updates only the components (or computed values) that directly depend on that signal.&lt;/p&gt;

&lt;p&gt;This avoids unnecessary trips through the &lt;strong&gt;entire component tree&lt;/strong&gt; every time the event loop drains.&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout callback fired&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;stateSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeout update&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Promise callback fired&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;stateSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;promise update&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&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;🔸 Without Signals (Traditional Angular):&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="nx"&gt;Start&lt;/span&gt;
&lt;span class="nx"&gt;End&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="nx"&gt;fired&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;🔍&lt;/span&gt; &lt;span class="nx"&gt;Change&lt;/span&gt; &lt;span class="nc"&gt;Detection &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;WHOLE&lt;/span&gt; &lt;span class="nx"&gt;APP&lt;/span&gt; &lt;span class="nx"&gt;CHECKED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Timeout&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="nx"&gt;fired&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;🔍&lt;/span&gt; &lt;span class="nx"&gt;Change&lt;/span&gt; &lt;span class="nc"&gt;Detection &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;WHOLE&lt;/span&gt; &lt;span class="nx"&gt;APP&lt;/span&gt; &lt;span class="nx"&gt;CHECKED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 with signals:&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="nx"&gt;Start&lt;/span&gt;
&lt;span class="nx"&gt;End&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="nx"&gt;fired&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;🎯&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt; &lt;span class="nf"&gt;updated &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ONLY&lt;/span&gt; &lt;span class="nx"&gt;DEPENDENT&lt;/span&gt; &lt;span class="nx"&gt;COMPONENTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Timeout&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="nx"&gt;fired&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;🎯&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt; &lt;span class="nf"&gt;updated &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ONLY&lt;/span&gt; &lt;span class="nx"&gt;DEPENDENT&lt;/span&gt; &lt;span class="nx"&gt;COMPONENTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Signals let Angular ride on top of the event loop without being bound to Zone.js heavy blanket strategy. They reduce unnecessary CD cycles by updating only what is truly reactive.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🟩 Angular has 4 "kind" of signals and Angular Change Detection cycle&lt;/p&gt;

&lt;p&gt;🔸 &lt;code&gt;WritableSignal&lt;/code&gt; = read &amp;amp; write state. &lt;code&gt;Trigger CD&lt;/code&gt; when: &lt;code&gt;set&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;mutate&lt;/code&gt;. created by: signal()&lt;br&gt;
🔸 &lt;code&gt;Signal&lt;/code&gt; = read-only state. &lt;code&gt;No trigger CD&lt;/code&gt; (doesn’t mark the component as dirty) created by: .asReadonly() &lt;br&gt;
🔸 &lt;code&gt;ComputeSignal&lt;/code&gt; = Pure functions of other signals. No side effects (Never modify state (e.g., no set(), API calls, or DOM updates)). Signal that get from other signal. &lt;code&gt;No trigger CD (not directly)&lt;/code&gt;. created by: computed()&lt;br&gt;
🔸 &lt;code&gt;LinkedSignal()&lt;/code&gt; (experimental) = Hybrid: Starts as a computed signal (pure, memoized, lazy), but allows dynamic switching of its source signal. It's read-only and reactive, but the source can be writable.&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="c1"&gt;// WritableSignal&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&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="c1"&gt;// WritableSignal&amp;lt;number&amp;gt;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ✅ READ OPERATION (NO CD TRIGGER)&lt;/span&gt;

&lt;span class="c1"&gt;// WRITE OPERATIONS (TRIGGER CD)&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;            &lt;span class="c1"&gt;// 🚨 Replaces value → TRIGGER CD&lt;/span&gt;
&lt;span class="nx"&gt;ws&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;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&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="c1"&gt;// 🚨 Derives new value → TRIGGER CD&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mutate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prop&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="c1"&gt;// 🚨 In-place mutation → TRIGGER CD (if ws holds an object)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Signal&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asReadonly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Signal&amp;lt;number&amp;gt; (read-only)&lt;/span&gt;

&lt;span class="c1"&gt;// READ OPERATION (NO CD TRIGGER)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ros&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Reads value → No CD&lt;/span&gt;

&lt;span class="c1"&gt;// ATTEMPTED WRITES (BLOCKED)&lt;/span&gt;
&lt;span class="nx"&gt;ros&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// 🚨 Compile-time error (TypeScript protects you)&lt;/span&gt;
&lt;span class="nx"&gt;ros&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="c1"&gt;// 🚨 Compile-time error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ComputedSignal &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ComputedSignal&amp;lt;number&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Read (no CD trigger, but reacts to ws() changes)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 10 (if ws() is 5)&lt;/span&gt;

&lt;span class="c1"&gt;// 🚨 Write Attempts (Blocked)&lt;/span&gt;
&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ❌ TS Error: No 'set' method&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// LinkedSignal&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&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;2&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;linked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&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="nf"&gt;base&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;computation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&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;val&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="nx"&gt;linked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// can override&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🟩 Angular Signal Types &amp;amp; Change Detection Behavior&lt;/p&gt;

&lt;p&gt;This table summarizes the four core types of Angular Signals and how they interact with change detection.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal Type&lt;/th&gt;
&lt;th&gt;Writable&lt;/th&gt;
&lt;th&gt;Derived&lt;/th&gt;
&lt;th&gt;Triggers CD&lt;/th&gt;
&lt;th&gt;Created By&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WritableSignal&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;code&gt;signal()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readonly Signal&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.asReadonly()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ComputedSignal&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (indirect)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;computed()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedSignal&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;code&gt;linkedSignal()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🟩 Take away notes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WritableSignal&lt;/strong&gt;: Mutable state container. Triggers change detection on &lt;code&gt;.set()&lt;/code&gt;, &lt;code&gt;.update()&lt;/code&gt;, or &lt;code&gt;.mutate()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readonly Signal&lt;/strong&gt;: Exposes state without allowing mutation. Does not trigger change detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ComputedSignal&lt;/strong&gt;: Derived from other signals using pure functions. Angular tracks reads during render; does not directly trigger CD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedSignal&lt;/strong&gt;: Hybrid signal — behaves like a computed signal but can also be written to. Triggers change detection on write.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Use this table to guide architectural decisions when designing reactive state in Angular with Signals.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🟩 When to use which&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;signal()&lt;/code&gt; - WritableSignal
&lt;code&gt;❌ Pure&lt;/code&gt;, Can have side effects. You need to modify the value (set, update, mutate) 
&lt;code&gt;❌ Lazy&lt;/code&gt;, updates eagerly.
&lt;code&gt;❌ Memorized&lt;/code&gt; 
&lt;code&gt;✅ Trigger CD directly&lt;/code&gt;, on write (set, update, mutate) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔸 Think of it as: a plain reactive variable. Typical use: component-local state that changes often: flags&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="kd"&gt;const&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="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;signal.asReadonly()&lt;/code&gt; - asReadOnly()
&lt;code&gt;✅ Pure&lt;/code&gt;, read-only
&lt;code&gt;✅ Lazy&lt;/code&gt;
&lt;code&gt;✅ Memorized&lt;/code&gt; 
&lt;code&gt;❌ Triggers CD directly&lt;/code&gt;, but ✅ indirectly when the underlying writable changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔸Typically for Local component or service state (eg. form inputs, API responses, expose state from service)&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;writable&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;42&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;readonly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asReadonly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;computed()&lt;/code&gt; – pure derived from other signal
&lt;code&gt;✅ Pure&lt;/code&gt;, read-only derived from signals. 
&lt;code&gt;✅ Lazy&lt;/code&gt;, Angular only recalculates when you read it
&lt;code&gt;✅ Memorized&lt;/code&gt;
&lt;code&gt;❌ Triggers CD directly&lt;/code&gt;, but ✅ indirectly when the underlying writable changes.
🔸 Typical use: derived, reactive values that are always deterministic. Formatting, filtering, or combining signals.
🔸 Great when your value is purely reactive
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;LinkedSignal()&lt;/code&gt; - read-only reactive mirror signal
&lt;code&gt;✅ Pure&lt;/code&gt;  (read-only mirror)
&lt;code&gt;✅ Lazy&lt;/code&gt;
&lt;code&gt;✅ Memorized&lt;/code&gt;
&lt;code&gt;❌ Triggers CD directly&lt;/code&gt;, but ✅ indirectly when the underlying writable changes.
🔸It takes a source signal and returns a new signal that mirrors it.
🔸 Writable behaviour comes only from the sources, not the linkedSignal itself.
🔸 Use anywhere you need a signal that can change its dependency at runtime, like theming
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computation&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🟩 Observables &amp;amp; Signals: &lt;code&gt;A real analogy&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you're like me, coming from RxJS and reactive programming in Angular, this analogy helped things click quicker:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of &lt;code&gt;Observables like a water pipe&lt;/code&gt;: once you connect (subscribe), you start getting the flow. &lt;code&gt;Signals are more like a glass of water&lt;/code&gt;, always present, always filled with the latest value. When the value changes, it's like someone replaced the water, and everything watching it gets notified instantly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In UI terms, Observables stream events, Signals reflect state. Making it visible, so we can react granularly to what is, not just what is emitted.&lt;/p&gt;




&lt;p&gt;🟩 More about Angular Signals:&lt;br&gt;
🔸 Angular Reactive Forms with Signals (Angular 17+) and Signal-Based Forms (Angular 21+)&lt;br&gt;
&lt;a href="https://github.com/leolanese/Angular-Signal-ReactiveForms" rel="noopener noreferrer"&gt;https://github.com/leolanese/Angular-Signal-ReactiveForms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-BehaviorSubjects-to-Signals" rel="noopener noreferrer"&gt;Angular 20 BehaviorSubjects to Signals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-Forms-Strategies" rel="noopener noreferrer"&gt;Angular 20 Modern Forms Strategies and trends&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-Forms-Performance-Fetch-Search-Filtering" rel="noopener noreferrer"&gt;Angular 20 Forms Performance Fetch Search and Filtering&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-API-Observable-Signal" rel="noopener noreferrer"&gt;Angular 20 API Observable and Signal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-Component-Communication" rel="noopener noreferrer"&gt;Angular 19 Component Communication&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular19-Zoneless-standalone-webComponents-signals" rel="noopener noreferrer"&gt;Angular 19 Zoneless signals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular19-API-Signal" rel="noopener noreferrer"&gt;Angular 19 API Signal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-Signals-Theme?tab=readme-ov-file" rel="noopener noreferrer"&gt;Angular 19 Signals Theme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔸 &lt;a href="https://github.com/leolanese/Angular-Signals-StandAlone-Shopping-Cart?tab=readme-ov-file" rel="noopener noreferrer"&gt;Angular 17 Signals Shopping Cart&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Hey, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;Tech Blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>angular</category>
      <category>architecture</category>
      <category>javascript</category>
    </item>
    <item>
      <title>NestJS Performance</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Fri, 07 Feb 2025 17:36:21 +0000</pubDate>
      <link>https://dev.to/leolanese/nestjs-performance-2kcb</link>
      <guid>https://dev.to/leolanese/nestjs-performance-2kcb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Unlock Peak Performance for Your NestJS Application: A Comprehensive Guide&lt;/code&gt; [UPDATED: 09/02/2025]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Are you struggling with &lt;code&gt;slow response times&lt;/code&gt;, &lt;code&gt;high resource usage&lt;/code&gt;, or &lt;code&gt;scalability issues&lt;/code&gt; in your &lt;code&gt;NestJS&lt;/code&gt; application? What if you could fix 80% of your performance problems by optimising just 20% of your code?&lt;/p&gt;

&lt;p&gt;Welcome to the ultimate guide to supercharging your NestJS app! Here, we'll dive into actionable strategies, from identifying bottlenecks using the Pareto Principle to leveraging cutting-edge techniques.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why This Matters?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Performance optimisation isn't just about speed, it's about delivering a seamless user experience, reducing costs, and ensuring your application can scale effortlessly. By focusing on the most impactful areas, you can achieve dramatic improvements without wasting time on low-priority fixes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Technique
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Identify Bottlenecks using Pareto Principle (80/20 Rule)&lt;/li&gt;
&lt;li&gt;NodeJS version upgrade&lt;/li&gt;
&lt;li&gt;Enable HTTP/3 or HTTP/2&lt;/li&gt;
&lt;li&gt;NestJS logger performance&lt;/li&gt;
&lt;li&gt;Buffering logs improvement&lt;/li&gt;
&lt;li&gt;Request-Scoped injection - &lt;code&gt;@Injectable({ scope: Scope.REQUEST })&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use Fastify instead ExpressJS&lt;/li&gt;
&lt;li&gt;Use NodeJS compression middleware&lt;/li&gt;
&lt;li&gt;Caching Strategies types

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;In-Memory Caching&lt;/code&gt; = "CacheModule.register({"&lt;/li&gt;
&lt;li&gt;Redis-based Caching (Distributed) = &lt;code&gt;CacheModule.reguster({ store: redisStore,&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Browser HTTP Caching with Headers - &lt;code&gt;'Cache-Control':&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Proxy Caching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Db Query Caching&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Caching &lt;code&gt;environment variables&lt;/code&gt; at runtime = &lt;code&gt;ConfigModule()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Caching storage &lt;code&gt;cache-manager&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Caching Server Side External API Calls to Reduce Latency&lt;/li&gt;
&lt;li&gt;Redis CacheInterceptor Global implementation&lt;/li&gt;
&lt;li&gt;HTTP caching with @CacheKey and @CacheTTL&lt;/li&gt;
&lt;li&gt;Cache busting&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Db schema synchronise&lt;/li&gt;
&lt;li&gt;Define to the Module Class which repository to use
&lt;/li&gt;
&lt;li&gt;Use Lazy-loading:&lt;code&gt;route-based lazy loading&lt;/code&gt; + &lt;code&gt;Dynamic module loading&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use Compression&lt;/li&gt;
&lt;li&gt;Database Query Optimisation

&lt;ol&gt;
&lt;li&gt;Minimise the Number of Queries&lt;/li&gt;
&lt;li&gt;Use ORM Frameworks with Streaming Capabilities&lt;/li&gt;
&lt;li&gt;Reduce the Amount of Data Fetched&lt;/li&gt;
&lt;li&gt;Leverage Database Indexing&lt;/li&gt;
&lt;li&gt;Avoid N+1 Query Problem&lt;/li&gt;
&lt;li&gt;Caching query results&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Implement WebWorkers - WW&lt;/li&gt;
&lt;li&gt;Implement WebSockets - WS&lt;/li&gt;
&lt;li&gt;Implement true Load balancing across multiple servers = &lt;code&gt;NodeJS Clustering&lt;/code&gt; -&amp;gt; &lt;code&gt;Cloud-based Load Balancer&lt;/code&gt; + &lt;code&gt;Reverse Proxy&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;NodeJS Clustering&lt;/li&gt;
&lt;li&gt;Cloud-based Load Balancer&lt;/li&gt;
&lt;li&gt;Reverse Proxy&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Choose the most appropriate Dependency Injection Library&lt;/li&gt;
&lt;li&gt;API Architecture performance: 

&lt;ol&gt;
&lt;li&gt;API Composition pattern (efficient Microservice Communication)&lt;/li&gt;
&lt;li&gt;API caching&lt;/li&gt;
&lt;li&gt;Reverse Proxy&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Choose the most appropriate Dependency Injection Library&lt;/li&gt;
&lt;li&gt;API Architecture performance: 

&lt;ol&gt;
&lt;li&gt;API Composition pattern (efficient Microservice Communication)&lt;/li&gt;
&lt;li&gt;API caching&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Metric for insights
&lt;/li&gt;
&lt;li&gt;Documenting your API&lt;/li&gt;
&lt;li&gt;Adding Swagger annotations to DTOs and entities&lt;/li&gt;
&lt;li&gt;Metric for insights
&lt;/li&gt;
&lt;li&gt;Documenting your API&lt;/li&gt;
&lt;li&gt;Adding Swagger annotations to DTOs and entities&lt;/li&gt;
&lt;li&gt;Recomendations&lt;/li&gt;
&lt;/ul&gt;







&lt;h3&gt;
  
  
  Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pareto Principle (80/20)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;80/20 rule, is a powerful concept that can significantly improve efficiency and effectiveness in software development&lt;br&gt;
Identify bottlenecks using profiling tools  (e.g., Jaeger, Zipkin, ClinicJS) and prioritize critical optimisations&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- Where to look: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database Layer: Check Slow queries, connection pooling, caching.&lt;/li&gt;
&lt;li&gt;API Endpoints: High response times, unoptimized middleware, lack of caching.&lt;/li&gt;
&lt;li&gt;CPU-Intensive Operations: Heavy computation, unoptimized libraries, lack of offloading.&lt;/li&gt;
&lt;li&gt;Memory Usage: Memory leaks, large data structures.&lt;/li&gt;
&lt;li&gt;Third-Party Integrations: Slow API calls, unoptimized libraries, lack of caching.&lt;/li&gt;
&lt;li&gt;Event Loop Latency: Synchronous operations, unoptimized loops.&lt;/li&gt;
&lt;li&gt;Logging and Monitoring: Excessive logging, lack of monitoring.&lt;/li&gt;
&lt;li&gt;Deployment and Infrastructure: Resource limits, lack of scaling, unoptimised Docker images.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;NodeJS version upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;One of the performance wins I could achieve was by simply upgrading, the runtime version &lt;code&gt;from 16&lt;/code&gt; to &lt;code&gt;18&lt;/code&gt;, if even possible to &lt;code&gt;20&lt;/code&gt; while making little to no changes to NestJS code&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;This will, quickly, improved Performance: 
V8 Engine Updates
Optimised Garbage Collection&lt;/li&gt;
&lt;li&gt;TypeORM: Can indeed benefit from the performance improvements introduced in NodeJS 20+, especially when handling large datasets or complex queries:&lt;/li&gt;
&lt;li&gt;Native ECMAScript Modules (ESM) Support: This can lead to cleaner code, improved tree-shaking, and potentially better performance.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance Improvements in newer V8 engine: This can lead to faster execution of TypeORM's &lt;code&gt;query-building logic&lt;/code&gt; and &lt;code&gt;data manipulation operations&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data Fetching Strategies: &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When dealing with large datasets, consider &lt;code&gt;optimising the data-fetching strategies with TypeORM&lt;/code&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pagination: We can set limit the number of records retrieved in a single query.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selective Fetching: Retrieve only the necessary fields instead of entire entities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Batching: When fetching related entities, use batching to reduce the number of queries executed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To fully leverage these improvements, ensure the application is updated to use NodeJS 20+ and review the TypeORM configuration and database design. Regular profiling and performance testing will help identify bottlenecks and ensure your application scales efficiently with large datasets.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enable HTTP/3 or HTTP/2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiplexing:&lt;br&gt;
In HTTP/1.1, only one request can be processed at a time per connection (head-of-line blocking), meaning subsequent requests must wait until the first one is completed. With HTTP/2, multiple streams can be opened, allowing the server to send multiple responses at once without waiting for previous requests to finish&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved Resource Loading: &lt;br&gt;
Simultaneous loading of resources improves the overall time it takes for a page to become interactive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Fallback to HTTP/2: While HTTP/3 is preferable, if a client or network does not support HTTP/3, your server should fall back to HTTP/2&lt;/p&gt;

&lt;p&gt;If your server and infrastructure (like Azure) support HTTP/3, it's recommended to utilize it, as it generally offers better performance and user experience than HTTP/1.1&lt;/p&gt;

&lt;p&gt;Ensure that your Azure App Service is configured with a valid SSL certificate. This is necessary because HTTP/2 requires a secure connection (HTTPS)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ul&gt;
&lt;li&gt;NestJS logger performance&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NestJS comes with a default logger (Logger class) which internally writes logs to &lt;code&gt;process.stdout&lt;/code&gt; and &lt;code&gt;process.stderr&lt;/code&gt;. &lt;br&gt;
This can affect performance in NodeJS applications, including NestJS, particularly because most &lt;code&gt;I/O operations are asynchronously&lt;/code&gt;, but &lt;code&gt;process.stdout&lt;/code&gt; and &lt;code&gt;process.stderr&lt;/code&gt; are synchronous in certain conditions, which can block the event loop producing perfomance issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;In brief:
Most I/O operations in NodeJS are asynchronous, allowing the event loop to remain non-blocking.
However, &lt;code&gt;process.stdout&lt;/code&gt; + &lt;code&gt;process.stderr&lt;/code&gt; can behave synchronously under certain conditions, such as when their output is redirected (e.g., piped to a file), potentially blocking the event loop and impacting performance.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;Logger&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;@nestjs/common&lt;/span&gt;&lt;span class="dl"&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;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AppModule&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a log message&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;ul&gt;
&lt;li&gt;Alternatives:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Winston logger:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Winston logger will write logs asynchronously, which significantly improves performance by not blocking the event loop during I/O operations.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/winston winsto&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Buffering logs improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;All logs will be buffered until the custom logger is attached&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;NestFactory&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;@nestjs/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;AppModule&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;./app.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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Logger&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;nestjs-pino&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bufferLogs&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&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="nx"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Request-Scoped injection - &lt;code&gt;@Injectable({ scope: Scope.REQUEST })&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;is a design pattern&lt;/code&gt; used in Dependency Injection (DI) frameworks like NestJS, &lt;code&gt;where a service is instantiated once per incoming request&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;BENEFICIAL Request-Scoped Injection
-- Isolation = more safe
-- Concurrency Safety = no risk of shared mutable state
-- Lifecycle Management = simplify memory management&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Although it all sounds quite intimidating, a properly designed application that &lt;code&gt;leverages request-scoped providers&lt;/code&gt; should not slow down by more than ~5% latency-wise.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;NO BENEFITIAL 
Transactional Services:
Logging or Metrics Collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Increased Resource Consumption: Each request creates a new instance of the service, which can lead to increased memory usag&lt;/p&gt;

&lt;p&gt;Performance Impact: The overhead of instantiating services for each request can impact performance&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While Nest tries to cache as much metadata as possible, it will still have to create an instance of your class on each request. This approach means that I will be instantiating a new instance SomeBrokenLoggingService for each request, that would impact my application performance&lt;/p&gt;

&lt;p&gt;While this is useful for isolating, it adds "significant overhead" since each request requires creating, managing, and destroying service instances.&lt;/p&gt;

&lt;p&gt;In NestJS, you can define a service as &lt;code&gt;request-scoped&lt;/code&gt;, meaning a new instance of the service is created for every request. This Negatively impact performance because it creates a new instance of the service for every incoming request&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REQUEST&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;SomeBrokenLoggingService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// A new instance will be created for every request&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;REQUEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&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;ul&gt;
&lt;li&gt;&lt;p&gt;Alternative Approaches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use &lt;code&gt;Async Local Storage&lt;/code&gt; (ALS):&lt;br&gt;
AsyncLocalStorage is a NodeJS API that allows you to store and retrieve context for the duration of a specific request, making it ideal for tracking request-specific data like correlation IDs without creating new service instances.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;AsyncLocalStorage&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;async_hooks&lt;/span&gt;&lt;span class="dl"&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;asyncLocalStorage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AsyncLocalStorage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&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="nx"&gt;asyncLocalStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&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;Map&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// Set UserID for the request&lt;/span&gt;
    &lt;span class="nx"&gt;asyncLocalStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStore&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;generateUserId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nf"&gt;next&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="c1"&gt;// Retrieve UserId ID within a service&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;asyncLocalStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStore&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;UserId&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;LINK&lt;br&gt;
&lt;a href="https://docs.nestjs.com/fundamentals/injection-scopes#performance" rel="noopener noreferrer"&gt;https://docs.nestjs.com/fundamentals/injection-scopes#performance&lt;/a&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;Fastify&lt;/code&gt; instead &lt;code&gt;ExpressJS&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NestJS comes by default with Express platform, but it can be easily switched to Fastify, and the documentation did a great job explaining it on the "Performance (Fastify)" page&lt;/p&gt;

&lt;p&gt;Fastify is a fast and low memory overhead web framework for NodeJS, built with a focus on high performance and low memory usage. &lt;/p&gt;

&lt;p&gt;While ExpressJS remains the default option for most NestJS applications, Fastify offers superior performance, lower memory usage, and built-in features like JSON schema validation and logging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Why
&lt;code&gt;Low-memory overhead&lt;/code&gt;:
Processes requests faster than many other frameworks (like Express) due to its low-overhead design: Fastify is known for using less memory than Express, which is important in environments with constrained resources or applications that handle a high number of concurrent requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Built-in Logging&lt;/code&gt;: &lt;br&gt;
Fastify has built-in high-performance logging using the pino logger. Logging is asynchronous by default, reducing the performance hit caused by I/O operations, something ExpressJS does not handle as efficiently without additional configuration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Async/Await First&lt;/code&gt;:&lt;br&gt;
Fastify is designed around async/await, making it more modern and easier to use in newer JavaScript/TypeScript projects, Express does not.&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/platform-fastify fastif&lt;/span&gt;&lt;span class="err"&gt;y
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;NestFactory&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;@nestjs/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;AppModule&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;./app.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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;FastifyAdapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;NestFastifyApplication&lt;/span&gt;&lt;span class="p"&gt;,&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;@nestjs/platform-fastify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NestFastifyApplication&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;AppModule&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;FastifyAdapter&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;LINK
&lt;code&gt;NestJS Performance: Fastify&lt;/code&gt;
&lt;a href="https://docs.nestjs.com/techniques/performance#performance-fastify" rel="noopener noreferrer"&gt;https://docs.nestjs.com/techniques/performance#performance-fastify&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Avoiding NestJS performance bottlenecks&lt;/code&gt;&lt;br&gt;
&lt;a href="https://medium.com/@Fcmam5/avoiding-nestjs-performance-bottlenecks-78fa2bc66372" rel="noopener noreferrer"&gt;https://medium.com/@Fcmam5/avoiding-nestjs-performance-bottlenecks-78fa2bc66372&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Optimize Your NestJS App Performance With These Practices&lt;/code&gt;&lt;br&gt;
&lt;a href="https://www.brilworks.com/blog/optimize-your-nest-js-app-performance-with-these-practices/" rel="noopener noreferrer"&gt;https://www.brilworks.com/blog/optimize-your-nest-js-app-performance-with-these-practices/&lt;/a&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Use NodeJS compression middleware&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The compression package helps to compress HTTP responses, which can significantly improve performance, particularly for large files such as HTML, CSS, and JS &lt;/p&gt;

&lt;p&gt;Compress will help to maintain minimal data transfer during client interactions reducing the payload&lt;/p&gt;

&lt;p&gt;With compression enabled, responses from your NestJS App will be compressed before they are sent to the client, reducing the amount of data that needs to be transferred over the network and improving performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, by default, the compression() middleware will use the gzip compression algorithm. You can also pass in options to customize the behavior of the middleware, such as the threshold at which responses will be compressed, using the following syntax:&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt; &lt;span class="c1"&gt;// set the threshold to 512 bytes&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 javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="nx"&gt;compression&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This setup will compress responses sent from both your Angular and NestJS API&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;NestFactory&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;@nestjs/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;AppModule&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;./app.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;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;compression&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;compression&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Enable compression middleware&lt;/span&gt;
  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Caching Strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NodeJS itself &lt;code&gt;DOESNT provide built-in caching mechanisms&lt;/code&gt; (but it can be built), fortunately NestJS does provide &lt;code&gt;CacheModule&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. In-Memory Caching = &lt;code&gt;CacheModule.register({&lt;/code&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Like Post-it notes on your computer screen, it's quick to write and read, but disappears when you shut down&lt;/p&gt;

&lt;p&gt;Stores cache data in memory, local to the current instance of the application.&lt;/p&gt;

&lt;p&gt;NestJS provides a built-in CacheModule, which can be configured for in-memory caching using libraries like node-cache or redis for distributed caching.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Module&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;@nestjs/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;Module&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// seconds&lt;/span&gt;
      &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// maximum number of items in cache&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2. Redis-based Caching (Distributed) = &lt;code&gt;CacheModule.register({ store: redisStore,&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Provides distributed caching, ideal for scalable applications behind load balancers.&lt;/p&gt;

&lt;p&gt;to persist the cache across multiple instances or services&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Module&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;@nestjs/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="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;redisStore&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;cache-manager-redis-store&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;Module&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;redisStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// seconds&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;3. Browser HTTP Caching with Headers - &lt;code&gt;'Cache-Control':&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Res&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;@nestjs/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;Response&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;express&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;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductsController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Setting HTTP cache headers&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&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;public, max-age=3600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// cache for 1 hour&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;products&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;4. Proxy Caching&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Caches requests and responses at the proxy level to reduce the load on the server and speed up response times.&lt;/p&gt;

&lt;p&gt;Caching can also be handled at the reverse proxy level&lt;/p&gt;

&lt;p&gt;The reverse proxy caches responses and serves them from its cache to improve performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;5. Db Query Caching&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;More like a pocket notebook, this type of cache is stored in the database and is a bit more permanent&lt;/p&gt;

&lt;p&gt;TypeORM can cache database queries to reduce the load on your database server&lt;/p&gt;

&lt;p&gt;Caches the results of frequently queried database data to minimise database load.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedResults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;productRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;cache&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;6. Caching environment variables at runtime = &lt;code&gt;ConfigModule()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If we have a lot of frequent accesses to environment variables, we want to optimise the retrival of configuration data&lt;/p&gt;

&lt;p&gt;In a NestJS application, environment variables are commonly accessed through the ConfigService, which is used to retrieve configuration settings such as database credentials, API keys, and other sensitive information. Since accessing process.env can be relatively slow when done repeatedly, enabling caching can improve performance.&lt;/p&gt;

&lt;p&gt;Improved Performance: Reduces the overhead of accessing environment variables multiple times, which can lead to performance bottlenecks.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;ConfigModule&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;@nestjs/config&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;Module&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;ConfigModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forRoot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;cache&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;// Enable caching for better performance&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;LINK&lt;br&gt;
&lt;a href="https://docs.nestjs.com/techniques/configuration#cache-environment-variables" rel="noopener noreferrer"&gt;https://docs.nestjs.com/techniques/configuration#cache-environment-variables&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Caching storage &lt;code&gt;cache-manager&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This cache manager offers a unified interface that supports various &lt;code&gt;cache storage&lt;/code&gt; providers beyond just the default in-memory option.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;Module&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;@nestjs/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;CacheModule&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;@nestjs/cache-manager&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;AppController&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;./app.controller&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;Module&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt; &lt;span class="c1"&gt;// enable in-memory caching&lt;/span&gt;
  &lt;span class="na"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppController&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;AppModule&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 javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/cache-manager cache-manage&lt;/span&gt;&lt;span class="err"&gt;r
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LINK&lt;br&gt;
&lt;a href="https://docs.nestjs.com/techniques/caching" rel="noopener noreferrer"&gt;https://docs.nestjs.com/techniques/caching&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8. Caching Server Side External API Calls to Reduce Latency&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Cache external API responses to reduce response times and API call frequency, improving performance.&lt;/p&gt;

&lt;p&gt;We can significantly reduce latency and improve overall performance: In-Memory Caching with NodeJS: cache-manager, node-cache, redis, etc&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/cache-manager cache-manage&lt;/span&gt;&lt;span class="err"&gt;r
&lt;/span&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Only&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&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;CacheModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Time to live in seconds&lt;/span&gt;
      &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Maximum number of items in cache&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;HttpModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Import HttpModule to make HTTP requests&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppService&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 javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&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;AppService&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="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;httpService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpService&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="nd"&gt;Cacheable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;externalApi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="c1"&gt;// Use caching for this method&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getExternalData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;any&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;firstValueFrom&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;httpService&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;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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;ul&gt;
&lt;li&gt;9. Redis CacheInterceptor Global implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;: Think of this as taking a screenshot of a web page to quickly look at it later without reloading the entire thing&lt;/p&gt;

&lt;p&gt;NestJS's built-in CacheInterceptor allows automatic caching of responses based on decorators or globally for all requests.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ul&gt;
&lt;li&gt;11. HTTP caching with @CacheKey and @CacheTTL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NestJS also provides decorators such as @CacheKey() and @CacheTTL() that offer more granular&lt;br&gt;
control over caching at the method level. These can be particularly useful for caching the results of&lt;br&gt;
specific API calls.&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&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;@nestjs/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;CacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CacheTTL&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;@nestjs/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;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DataController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;CacheKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-custom-key&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;CacheTTL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;findAll&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&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;• @CacheKey: Assigns a custom key to the cached response, which can be useful when you&lt;br&gt;
need to cache similar data under different contexts&lt;br&gt;
• @CacheTTL: Overrides the default TTL, allowing you to specify how long the result of this&lt;br&gt;
specific method should be cached&lt;br&gt;
This level of control ensures that only the most critical data is cached, reducing unnecessary cache&lt;br&gt;
pollution and ensuring that your cache is as effective as possible.&lt;/p&gt;
&lt;h2&gt;
  
  
  12. Cache busting
&lt;/h2&gt;

&lt;p&gt;Caching is powerful, but stale data can be a significant drawback if not managed properly. Cache&lt;br&gt;
busting refers to the process of invalidating or refreshing the cache when the underlying data changes.&lt;br&gt;
In NestJS, you can manually clear the cache when necessary using the CacheManager service:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CacheService&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;@nestjs/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;Injectable&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;MyService&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="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;cacheManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CacheService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
 &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c1"&gt;// Update data logic&lt;/span&gt;
&lt;span class="nx"&gt;Profiling&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;load&lt;/span&gt; &lt;span class="nx"&gt;testing&lt;/span&gt; &lt;span class="mi"&gt;529&lt;/span&gt;
 &lt;span class="k"&gt;await&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;cacheManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-custom-key&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method removes the cached data associated with the specified key, ensuring that the next request&lt;br&gt;
retrieves fresh data. Using cache-busting strategies ensures that your users always receive up-to-date information without&lt;br&gt;
sacrificing the performance benefits of caching.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;database schema synchronise&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;database schema should be auto created on every application launch&lt;/p&gt;

&lt;p&gt;synchronise ensures that out TypeORM entitites will be sync with the DB every time we run our App&lt;/p&gt;

&lt;p&gt;This is GREAT for development, BUT disable this on Production!&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;TypeOrmModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forRoot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;autoLoadEntities&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;synchronize&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;// disable in Prod&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// test postgres&lt;/span&gt;
&lt;span class="nx"&gt;psql&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Nest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;18032&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;     &lt;span class="nx"&gt;LOG&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;InstanceLoader&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;TypeOrmModule&lt;/span&gt; &lt;span class="nx"&gt;dependencies&lt;/span&gt; &lt;span class="nx"&gt;initialized&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;181&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Nest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;18032&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;     &lt;span class="nx"&gt;LOG&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;InstanceLoader&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;TypeOrmCoreModule&lt;/span&gt; &lt;span class="nx"&gt;dependencies&lt;/span&gt; &lt;span class="nx"&gt;initialized&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Define to the Module Class which repository to use&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Define to the Module Class which repository to use
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;We need to specify to the Module class, we are working which repository to use in the current scope (the product module's scope).&lt;/p&gt;

&lt;p&gt;By doing so, we are telling the ProductModule module which repository we need for this scope. &lt;br&gt;
NestJS does this to avoid having to load all the repositories present in the project, which would impact &lt;br&gt;
the app's overall performance&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// products/products.module.ts&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&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;TypeOrmModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forFeature&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;Product&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="c1"&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;ProductsModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Use Lazy-loading:&lt;code&gt;route-based lazy loading&lt;/code&gt; + &lt;code&gt;Dynamic module loading&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Lazy loading is a powerful design pattern that &lt;code&gt;delays the initialization of resources until they are actually needed&lt;/code&gt;. &lt;code&gt;Then it will be cache and any consecutive invocation&lt;/code&gt; will be very fast&lt;/p&gt;

&lt;p&gt;Rather than loading all objects at once, it allows the application to load the necessary data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Routing Level: &lt;code&gt;lazyModuleLoader&lt;/code&gt; route-based lazy loading&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;LOading a Module from RouterModule&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;Module&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;@nestjs/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;RouterModule&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;@nestjs/core&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;Module&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="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lazy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lazy/lazy.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LazyModule&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="c1"&gt;// other imports&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="c1"&gt;// controllers, providers&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;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Dynamic module loading within a service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.controller.ts&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;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&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;@nestjs/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;LazyModuleLoader&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;@nestjs/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;ReportsModule&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;./reports/reports.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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReportsService&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;./reports/reports.service&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;Controller&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;AppController&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="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;lazyModuleLoader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LazyModuleLoader&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="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getLazyReport&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&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="c1"&gt;// use console.time() and console.timeEnd() &lt;/span&gt;
    &lt;span class="c1"&gt;//to get the initialization time of ReportsModule&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&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;moduleRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;lazyModuleLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&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;ReportsModule&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;reportsService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;moduleRef&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="nx"&gt;ReportsService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&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;reportsService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getReport&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;-LINK&lt;br&gt;
&lt;a href="https://docs.nestjs.com/fundamentals/lazy-loading-modules" rel="noopener noreferrer"&gt;https://docs.nestjs.com/fundamentals/lazy-loading-modules&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@Abdelrahman_Rezk/lazy-loading-in-nestjs-boosting-performance-and-efficiency-2c6350a6ab84" rel="noopener noreferrer"&gt;https://medium.com/@Abdelrahman_Rezk/lazy-loading-in-nestjs-boosting-performance-and-efficiency-2c6350a6ab84&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.devgenius.io/mastering-lazy-loading-in-nestjs-enhancing-application-performance-863612abaea0" rel="noopener noreferrer"&gt;https://blog.devgenius.io/mastering-lazy-loading-in-nestjs-enhancing-application-performance-863612abaea0&lt;/a&gt;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Database Query Optimisation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Optimize database queries effectively&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;1. Minimize the Number of Queries:
Problem: 
If you make multiple small queries to the database for each part of your logic, you can introduce performance bottlenecks. Each query adds network latency, processing overhead, and can overwhelm the database with many individual requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SOLUTION:&lt;br&gt;
&lt;code&gt;Use Batch Queries&lt;/code&gt;:&lt;br&gt;
Instead of making multiple separate queries, you can batch them together. This reduces the round trips between your server and the database.&lt;/p&gt;

&lt;p&gt;For example, in NestJS using TypeORM, you can retrieve all the required data in a single query using joins or relations, rather than multiple separate queries.&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="c1"&gt;// TypeORM&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersWithPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;relations&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;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Fetches users along with their related posts in a single query&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2. Use ORM Streaming Capabilities:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem: When dealing with &lt;code&gt;large datasets&lt;/code&gt;, retrieving all data at once can overwhelm both the server's memory and the database. Loading huge result sets in one go can slow down the system significantly.&lt;/p&gt;

&lt;p&gt;SOLUTION:&lt;br&gt;
    TypeORM can help: &lt;code&gt;Use streaming to fetch data in chunks&lt;/code&gt; or &lt;code&gt;pagination to limit number of resuts&lt;/code&gt; or &lt;code&gt;cursor-based fetching to load data incrementally&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3. Reduce the Amount of Data Fetched:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem: &lt;br&gt;
Fetching all columns or related data when you only need a subset can unnecessarily overhead the database and increase the response time.&lt;/p&gt;

&lt;p&gt;Solution: &lt;br&gt;
&lt;code&gt;Fetch only the necessary data&lt;/code&gt;&lt;br&gt;
Retrieve only the necessary fields or rows using selective querying&lt;/p&gt;

&lt;p&gt;For example, if you only need a user's name and email, don't fetch the entire user object.&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="c1"&gt;// TypeORM&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;select&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;name&lt;/span&gt;&lt;span class="dl"&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;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Fetch only the fields you need&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;4. Leverage Database Indexing:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem: &lt;br&gt;
When the database has to scan all rows in a table to find matching results (a full table scan), performance decreases significantly, especially with large datasets.&lt;/p&gt;

&lt;p&gt;Solution: &lt;br&gt;
&lt;code&gt;Leverage indexing&lt;/code&gt;&lt;br&gt;
Use indexes to make querying faster by creating indexes on columns that are frequently used in WHERE clauses or joins. Indexes allow the database to find matching rows faster without scanning the entire table.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5. Avoid N+1 Query Problem:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PROBLEM&lt;br&gt;
The N+1 query problem happends when you first fetch a list of entities (eg N users), and then for each user, you make an additional query to fetch related data (eg their posts). This results in N+1 total queries, leading to performance issues and increases load times &lt;/p&gt;

&lt;p&gt;SOLUTION: &lt;br&gt;
Avoid the N+1 query problem by &lt;code&gt;using eager loading&lt;/code&gt; or &lt;code&gt;joins&lt;/code&gt; to retrieve related data in a single query, reducing the number of queries. We can use TypeORM to do these.&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="c1"&gt;// TypeORM&lt;/span&gt;
&lt;span class="c1"&gt;// Instead of fetching users first and then fetching posts in separate queries&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usersWithPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;relations&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;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Fetch users and their posts in one query&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;6. Caching query results&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Temporarily storing the results of expensive database queries, and later Serve Cached Results&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ul&gt;
&lt;li&gt;Handling Malicious Request Data &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- Validate DTO&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NestJS automaticly validate, whitelist and STOP DTOs requests&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;validator&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;transformer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useGlobalPipes&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;ValidationPipe&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// .dt.ts&lt;/span&gt;
&lt;span class="c1"&gt;// validate&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;IsString&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;class-validator&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateCoffeeDto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;each&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="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;flavors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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;-- whitelist&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="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="c1"&gt;// whitelist&lt;/span&gt;
  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useGlobalPipes&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;ValidationPipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;whitelist&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="p"&gt;));&lt;/span&gt;
&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/.%2FDTO-whitelist.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/.%2FDTO-whitelist.png" alt="DTO-whitelist" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-- forbidNonWhiteListed&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="c1"&gt;// main/ts&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useGlobalPipes&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;ValidationPipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;whitelist&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;forbidNonWhitelisted&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="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;-- PartialType&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Avoid redundant CRUD code&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/mapped-type&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// udpate.dto.ts&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;PartialType&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;@nestjs/mapped-types&lt;/span&gt;&lt;span class="dl"&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;CreateCoffeeDto&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;../create-cofee.dto/create-cofee.dto&lt;/span&gt;&lt;span class="dl"&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;UpdateDto&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PartialType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CreateCoffeeDto&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;ul&gt;
&lt;li&gt;Implement WebWorkers - WW&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;web workers enable multitasking and can run without interfering with the main event loop.&lt;/p&gt;

&lt;p&gt;Web Workers are a way to run scripts in a separate thread from the main thread of a web application.&lt;/p&gt;

&lt;p&gt;NestJS provides built-in support for Web Workers through the worker_threads module that comes with NodeJS&lt;/p&gt;

&lt;p&gt;Web workers can be a powerful tool for improving the performance and scalability of web applications, especially for long-running or computationally-intensive tasks&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// worker.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parentPort&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker_threads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;parentPort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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;message&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Worker thread received message: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;parentPort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Worker thread received message: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.controller.ts&lt;/span&gt;
&lt;span class="c1"&gt;// This will start the NestJS application and create a new worker thread to the root endpoint&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;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&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;@nestjs/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;Worker&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;worker_threads&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;Controller&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;AppController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getHello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./../worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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;message&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Main thread received message: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from main thread!&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;ul&gt;
&lt;li&gt;Implement WebSockets - WS&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NestJS provides a built-in module, "@nestjs/platform-socket.io", for Socket.IO-based applications&lt;/p&gt;

&lt;p&gt;We can create real-time-communication, WebSocket gateways, handle events, and manage connections directly within your NestJS application. It handles the underlying Socket.IO implementation, making it easier to work with real-time data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement true Load balancing across multiple servers &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;from native but basic &lt;code&gt;NodeJS Clustering&lt;/code&gt; -&amp;gt; true: &lt;code&gt;Cloud-based Load Balancer&lt;/code&gt; + &lt;code&gt;Reverse Proxy&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Load balancing is a technique of evenly distributing incoming network traffic among &lt;code&gt;multiple servers&lt;/code&gt; to prevent any single server from becoming overloaded &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- 1. NodeJS Clustering &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Although not a full load balancer, NodeJS itself provides a way to distribute requests across multiple processes using the &lt;code&gt;clustering module&lt;/code&gt;. NestJS, being built on top of NodeJS, supports this natively.&lt;/p&gt;

&lt;p&gt;NodeJS clustering can help implement load balancing, but it operates in a more limited capacity compared to traditional load balancers&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;--- Distribution limitation&lt;/p&gt;

&lt;p&gt;As requests come in a new instance is created and assigned to different worker, helping to utilise CPU cores efficiently. This is limited to the resources of a single machine. It CANNOT distribute requests "across multiple servers or containers" for a &lt;code&gt;true load balancing across multiple servers&lt;/code&gt; we need: &lt;code&gt;Cloud-based Load Balancer&lt;/code&gt; + &lt;code&gt;Reverse Proxy&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;--- 2. Clouds Load Balancers &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cloud load balancers often come with built-in scalability features and can easily handle failover and health checks.&lt;/p&gt;

&lt;p&gt;Combining (Azure) Cloud Load Balancers + Reverse Proxy = is a common and effective approach to managing traffic in cloud-based applications. This architecture can help you achieve a scalable, reliable, and performant application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;--- 3. Reverse Proxy&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A common approach it to use &lt;code&gt;a reverse proxy&lt;/code&gt; in your NestJS application with ExpressJS, you can implement load balancing effectively&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/platform-express http-proxy-middlewar&lt;/span&gt;&lt;span class="err"&gt;e
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The reverse proxy is mounted on the /api path, so any incoming requests to /api will be forwarded to one of the upstream servers.&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;NestFactory&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;@nestjs/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;ExpressAdapter&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;@nestjs/platform-express&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;AppModule&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;./app.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;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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;createProxyMiddleware&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;http-proxy-middleware&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;AppModule&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;ExpressAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&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;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;http://localhost:3001&amp;gt;&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="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;http://localhost:3002&amp;gt;&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;servers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;createProxyMiddleware&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;changeOrigin&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;pathRewrite&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;^/api&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;bootstrap&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start the reverse proxy server:&lt;/span&gt;
&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start the upstream servers:&lt;/span&gt;
&lt;span class="c1"&gt;// This will start two upstream servers on ports 3001 and 3002.&lt;/span&gt;
&lt;span class="c1"&gt;// That's it. You now have a reverse proxy load balancer that will distribute incoming traffic across multiple servers using ExpressJS in NestJS.&lt;/span&gt;
&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;server1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;server2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Choose the most appropriate Dependency Injection Library&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NestJS provides built-in support for dependency injection (DI), however, you can look beyond in-build options and use other DI libraries. &lt;br&gt;
There are several popular DI libraries that are compatible with NestJS, including: &lt;code&gt;InversifyJS&lt;/code&gt;, &lt;code&gt;Awilix&lt;/code&gt;, &lt;code&gt;TypeDI&lt;/code&gt;, &lt;code&gt;tsyringe&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conclusion:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fastest Option: tsyringe is likely the fastest due to its lightweight design and simplicity, making it ideal for performance-critical applications.&lt;/li&gt;
&lt;li&gt;Balanced Performance and Features: Awilix is also very fast and strikes a good balance between simplicity and the features it offers.&lt;/li&gt;
&lt;li&gt;For Advanced DI Needs: If you need more flexibility and advanced DI features, InversifyJS and TypeDI are great choices, though they come with slightly more overhead.&lt;/li&gt;
&lt;li&gt;If raw performance is your top priority, tsyringe would be the best choice&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;API Architecture performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- 1. API Composition pattern (efficient  Microservice Communication)&lt;/p&gt;

&lt;p&gt;We have a high latency because of multiple network calls being made from client, to get the data from different backend services. This Pattern is particularly helpful when you are dealing with multiple microservices that need to be composed into a single API response. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esentially API Composer acts as a gateway or orchestrator that manages and distributes requests to different API services, especially in microservice architectures.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- 2. API caching using Redis&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using Redis for API Caching in NestJS&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;CacheModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;redisStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-redis-hostname.redis.cache.windows.net&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6380&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// default SSL port for Azure Redis&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-redis-access-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// seconds&lt;/span&gt;
  &lt;span class="na"&gt;db&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;ssl&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;// Enable SSL for Azure Redis&lt;/span&gt;
&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Metric for insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider the following metrics to get useful insights on your application's state:&lt;/p&gt;

&lt;p&gt;• Logging and monitoring: Keep an eye on your application metrics. Tools such as Grafana and Prometheus can give you insights that are crucial for scaling.&lt;br&gt;
• Performance metrics: Response times, error rates, and other key performance indicators (KPIs) should be monitored to understand how well your application is scaling.&lt;br&gt;
• Monitor with NestJS DevTools and profilers: Use NestJS DevTools or integrated APM solutions, such as Jaeger or Zipkin, to monitor the performance of your services. These tools can provide insights into inter-service communication, response times, and bottlenecks&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="c1"&gt;// visualize real-time performance metrics and identify areas where communication delays are occurring&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/terminus @nestjs/&lt;/span&gt;&lt;span class="nx"&gt;devtool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Documenting your API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--- Key components of effective API documentation&lt;/p&gt;

&lt;p&gt;Overview of the API: Start with a high-level overview of what the API does, its main features,&lt;br&gt;
and its potential use cases.&lt;/p&gt;

&lt;p&gt;• Authentication and authorization: Clearly explain how clients should authenticate and authorise with your API. Include any keys or tokens they might need.&lt;br&gt;
• Endpoint descriptions: Each endpoint should be thoroughly documented with its purpose, URI, required headers, request and response formats, and any query or path parameters.&lt;br&gt;
• Error codes and messages: Document common error responses and what they mean to help users troubleshoot issues.&lt;br&gt;
• Examples and use cases: Provide practical examples of requests and responses. Real-world scenarios or use cases can significantly enhance understanding.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Adding Swagger annotations to DTOs and entities&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To enhance your API documentation using Swagger in NestJS, you can use the &lt;code&gt;@ApiProperty&lt;/code&gt; decorator from the &lt;code&gt;@nestjs/swagger&lt;/code&gt; package. This decorator allows you to add metadata to your DTOs (Data Transfer Objects) and entities, making your API documentation more descriptive and user-friendly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;--- Key Benefits of Using Swagger Annotations:&lt;br&gt;
• Improved API Documentation: Clearly describe your API endpoints, request/response structures, and expected behavior.&lt;br&gt;
• Interactive Testing: Swagger UI allows developers to test API endpoints directly from the documentation&lt;br&gt;
• Consistency: Ensures that your API documentation stays in sync with your codebase.&lt;br&gt;
• Onboarding: Makes it easier for new developers to understand and use your API&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="c1"&gt;// Install @nestjs/swagger&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nestjs&lt;/span&gt;&lt;span class="sr"&gt;/swagge&lt;/span&gt;&lt;span class="err"&gt;r
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add Swagger Decorators to DTOs&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;CreateUserDto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The email address of the 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;example&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@example.com&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="nd"&gt;IsEmail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The password of the 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;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;minLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&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="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;MinLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The full name of the 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;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add Swagger Decorators to Entities&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Entity&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;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The unique identifier of the 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;example&lt;/span&gt;&lt;span class="p"&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;span class="nd"&gt;PrimaryGeneratedColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email address of the 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;example&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@example.com&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="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The full name of the 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;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John Doe&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="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiProperty&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The date the user was created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2023-10-01T12:00:00Z&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="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Document API Endpoints in Controllers&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiTags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Groups endpoints under "users" in Swagger UI&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsersController&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="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UsersService&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="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiOperation&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Create a new user&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;ApiBody&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CreateUserDto&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ApiResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The user has been successfully created.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&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="nd"&gt;ApiResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bad Request.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;createUserDto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CreateUserDto&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&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;return&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;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createUserDto&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="nd"&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;:id&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;ApiOperation&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Get a user by ID&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;ApiParam&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&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 ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="p"&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="nd"&gt;ApiResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The user has been successfully retrieved.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&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="nd"&gt;ApiResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&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 not found.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&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;return&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;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="c1"&gt;// Swagger configuration&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;NestFactory&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;@nestjs/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;AppModule&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;./app.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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SwaggerModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentBuilder&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;@nestjs/swagger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Swagger configuration&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DocumentBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&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 Management API&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;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;API for managing users&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;setVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0&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;addTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&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;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SwaggerModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;SwaggerModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ul&gt;
&lt;li&gt;Recomendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last but no least, I recommend you to read the great book: &lt;code&gt;Scalable Application Development with NestJS&lt;/code&gt;, by (Pacifique Linjanaja)&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%2F1fxbsfj2vz3lq6obrw2h.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%2F1fxbsfj2vz3lq6obrw2h.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;







&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 gitroll: &lt;a href="https://gitroll.io/profile/uCOZ9SM8b7ne9h17NuPuKVky9uFh2" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestions / Recommendations: &lt;code&gt;developer@leolanese.com&lt;/code&gt; email me: &lt;a href="mailto:developer@leolanese.com"&gt;&lt;/a&gt;&lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>nestjs</category>
      <category>typescript</category>
      <category>fullstack</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Engineering in the AI age</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Mon, 27 Jan 2025 11:07:54 +0000</pubDate>
      <link>https://dev.to/leolanese/developing-in-the-ai-age-1k35</link>
      <guid>https://dev.to/leolanese/developing-in-the-ai-age-1k35</guid>
      <description>&lt;p&gt;As a software developer with over 15 years of experience, I can appreciate the tangible benefits of AI. From Googling errors, to browsing Stack Overflow, Reddit threads, and more, we now have AI-powered IDE assistants that help resolve issues across a vast range of programming languages and paradigms—seemingly without limits.&lt;/p&gt;

&lt;p&gt;Having an IDE "assistant" that advises you in real-time on strategies to choose, paths to follow, and best practices to adhere to is a game-changer. However, there's a catch: AI, while incredibly helpful, can sometimes suggest too many things. Its capacity is enormous, and it often provides solutions too quickly, leaving us with little time to process the ideas before blindly accepting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge of Too Many Suggestions
&lt;/h2&gt;

&lt;p&gt;While having numerous suggestions is great and saves time, it can also be overwhelming. If you don't fully understand why these suggestions are being made, how can you decide which option is the best? You risk ending up with a "blind solution" code that you don't fully comprehend or control. This lack of understanding can escalate into deploying solutions that operate in the "unknown zone," where the scope and impact of our changes are unclear.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Issue of Quick Suggestions
&lt;/h2&gt;

&lt;p&gt;Quick suggestions are fantastic, especially at first. After all, our goal is to solve problems efficiently. However, the danger lies in skipping the critical steps of understanding the problem, comprehending the solution, and learning from the resolution. Without this process, you're not truly learning you are just finding "quick fixes". Over time, this can lead to a lack of growth and a "AI dependency" to do the thinking for (or over) us.&lt;/p&gt;

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

&lt;p&gt;In the past, developers would deeply think, investigate previous similar solutions, and debate the best approaches before settling on a well-voted or widely accepted answer.&lt;/p&gt;

&lt;p&gt;Today, we often assume that AI will immediately provide the best solution without requiring our own investigation or critical thinking. Consequently, generating a long term dependency.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI is, with no doubt, here to stay, and as software developers, we must adapt and evolve to thrive in this new modern AI-driven era.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, we must also remain "mindful and curious". As, while AI can be an incredible tool, it should complement our skills and knowledge—not replace them. The key is to strike a balance: leveraging AI's power while ensuring "we maintain control, deepen our understanding, and continue to grow as developers". By doing so, we can harness the benefits of AI without losing the "critical thinking" and "problem-solving skills" that define great software engineering.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 X/Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.
&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Angular (17+) Signals Theme</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Tue, 13 Feb 2024 12:20:53 +0000</pubDate>
      <link>https://dev.to/leolanese/angular-17-signals-theme-pk8</link>
      <guid>https://dev.to/leolanese/angular-17-signals-theme-pk8</guid>
      <description>&lt;h2&gt;
  
  
  Angular Signal as Reactive theme
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Signals Rule! Re-imagine Dynamic Theming with Angular Signals&lt;/li&gt;
&lt;li&gt;Dynamic Themes, Simplified: The Power of Angular Signals. Upgrade easily your theming game to Reactive Style Changes with Angular Signals&lt;/li&gt;
&lt;li&gt;Simplify and Enhance Your Styling: Go Reactive with Angular Signals. Boost Theme Flexibility: Leverage Angular Signals for Dynamic Styling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Streamlined Service: Leveraging Angular Signals, we simplified our service by employing the signal function to create a theme signal, eliminating the necessity for a &lt;code&gt;BehaviorSubject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reactive Theme Switching: Within the component, we now have direct access to the theme through the signal. This guarantees that our component template promptly responds to any changes in the theme.&lt;/li&gt;
&lt;li&gt;Coordinated State Access: Using &lt;code&gt;themeService.themeSignal()&lt;/code&gt;, we can directly retrieve the current theme, ensuring seamless synchronization of the theme state throughout the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/edit/stackblitz-starters-f2lzzc" rel="noopener noreferrer"&gt;Angular Signal Theme&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code (Github)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese/Angular-Signals-Theme/tree/main" rel="noopener noreferrer"&gt;Angular Signal Theme&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>angular</category>
      <category>themes</category>
      <category>signal</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Pull-Request Etiquette</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Fri, 09 Feb 2024 16:46:45 +0000</pubDate>
      <link>https://dev.to/leolanese/pull-request-etiquette-4e78</link>
      <guid>https://dev.to/leolanese/pull-request-etiquette-4e78</guid>
      <description>&lt;h2&gt;
  
  
  Compendium of the best non-written code-review (Pull-Request or Merge-Request) etiquette rules
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;These rules encourage a collaborative and constructive approach to reviewing code within a team. The guidelines provide a helpful framework for effective communication during the code review process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;[Updated 14/02/2025]&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pull-Request structure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It is (highly) recommended to have one PR per commit
Either squash your commits to a single commit or
Amend the last commit every time you add a new commit.&lt;/li&gt;
&lt;li&gt;Pull requests are not the place for (very) long architecture discussions: Focus on what's important.&lt;/li&gt;
&lt;li&gt;Keep it simple: Small ticket = Small Pull-Requests.&lt;/li&gt;
&lt;li&gt;Having tools like SonarQube, TSLint, Prettier, hooks, etc also helps to speed up PR/MR. These are tools to encourage best practices and security code that are already agreed to be used.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pull-Request manners
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ownership of code: No one owns the code; the Company does. &lt;/li&gt;
&lt;li&gt;Every pull request is an opportunity to share knowledge and demonstrate practical skills. Approach it with humility and openness to discussion.&lt;/li&gt;
&lt;li&gt;Ask questions; don't make demands. &lt;/li&gt;
&lt;li&gt;Conflicts are part of the job and will always exist: Solve conflicts as a Team. Avoid Ego.&lt;/li&gt;
&lt;li&gt;Having tools like SonarQube, TSLint, Prettier, hooks, etc also helps to speed up PR/MR. These are tools to encourage best practices and security code that are already agreed to be used.&lt;/li&gt;
&lt;li&gt;Explain your reasons with examples to simplify the suggested idea in advance while offering ways to simplify or improve. &lt;/li&gt;
&lt;li&gt;Respond to every comment, be agile and pro-active, more importantly, look for a quick positive resolution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pull-Request persons envolved
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We are all reviewers; we are invited to review, and we should and must act proactively.&lt;/li&gt;
&lt;li&gt;Don't make it a teaching session.&lt;/li&gt;
&lt;li&gt;Don't make it a blaming game.&lt;/li&gt;
&lt;li&gt;Don't be too serious. Pull requests are an open "short" discussion with your team members. &lt;/li&gt;
&lt;li&gt;Avoid passive-aggressive comments, always keep positive.&lt;/li&gt;
&lt;li&gt;Don't use sarcasm, be polite and avoid using derogatory terms.&lt;/li&gt;
&lt;li&gt;Be humble. Humility it is crucial in both submitting and reviewing code&lt;/li&gt;
&lt;li&gt;Be grateful for the reviewer's suggestions. ("Nice Spotted! I'll make that change.")&lt;/li&gt;
&lt;li&gt;Be understanding. Communication online (like using Slack) is complex, GitLab PR line is even harder. &lt;/li&gt;
&lt;li&gt;Code reviewers should provide feedback, not to be a gatekeeper.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pull-Request Conflicts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your PR review is not about you.&lt;/li&gt;
&lt;li&gt;Always keep in mind: assume the best intention from the reviewer's comments.&lt;/li&gt;
&lt;li&gt;If the discussion on the pull-request is becoming long and doesn’t seem helpful for others, it is better to resolve it in-person, or in a different line, and close it with a summary on the pull-request.&lt;/li&gt;
&lt;li&gt;Acknowledgment of Difficulty: Be aware of how hard it is to convey emotion online and how easy it is to misinterpret feedback. If a review seems aggressive or angry or otherwise personal, consider if it is intended to be read that way and ask the person for clarification of intent, in person if possible.&lt;/li&gt;
&lt;li&gt;If you disagree strongly, consider giving it a few minutes before responding; think before you react. &lt;/li&gt;
&lt;li&gt;Gratitude: Remember always please and thank-you as, even with or without conflicts, there is another co-workers giving us their time to approve a PR.&lt;/li&gt;
&lt;li&gt;Whenever there's a disagreement, we should seek a third person's opinion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pull-Request Golden Rule
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pull requests should be dynamic and agile, quick and short chat to share knowledge.&lt;/li&gt;
&lt;li&gt;Don't take it personally. The review is of the "code", "not of you".&lt;/li&gt;
&lt;li&gt;It is not the reviewers' responsibility to test the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code Reviews in the Age of AI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Human interaction: "I fear the day that technology will surpass our human interaction. The world will have a generation of idiots. - Albert Einstein"&lt;/li&gt;
&lt;li&gt;Critical Thinking: AI can be a useful tool for catching errors, suggesting improvements, and ensuring consistency, but it shouldn't replace human judgment and critical thinking (please check an article about this: &lt;a href="https://dev.to/leolanese/developing-in-the-ai-age-1k35"&gt;https://dev.to/leolanese/developing-in-the-ai-age-1k35&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AI as an Assistant, not a replacement: Use AI to speed up reviews but ensure human reviewers validate and discuss changes; otherwise, more than having false positive/negatives we miss the essence of the pull-request, which is the sharing and learning opportunity.&lt;/li&gt;
&lt;li&gt;Transparency: Let contributors know if AI was used, so they can factor that into the discussion.&lt;/li&gt;
&lt;li&gt;Balance: Encourage human judgment for complex refactors, architecture decisions, and deeper code understanding.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be a stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 gitroll: &lt;a href="https://gitroll.io/profile/uCOZ9SM8b7ne9h17NuPuKVky9uFh2" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestions / Recommendations: &lt;code&gt;developer@leolanese.com&lt;/code&gt; email me: &lt;a href="mailto:developer@leolanese.com"&gt;&lt;/a&gt;&lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.
&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>agile</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Angular (17+) + NodeJS Users Rest API</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Fri, 09 Feb 2024 16:04:00 +0000</pubDate>
      <link>https://dev.to/leolanese/angular-nodejs-users-rest-api-5b7i</link>
      <guid>https://dev.to/leolanese/angular-nodejs-users-rest-api-5b7i</guid>
      <description>&lt;h1&gt;
  
  
  Angular + NodeJS Users Rest API. Full-Stack Development Workflow
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;Show the use of Angular services to consume local and remote end-points, provided localy by &lt;code&gt;NodeJS&lt;/code&gt; &amp;amp; &lt;code&gt;ExpressJS&lt;/code&gt; and remotly using &lt;code&gt;JsonPlaceHolder&lt;/code&gt; Services. We will be using Angular (17+) with stand-alone component and services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fetching Users from my NodeJS (and ExpressJS) Rest API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Front-End&lt;/span&gt;
&lt;span class="err"&gt;🅰️&lt;/span&gt; &lt;span class="nx"&gt;Creating&lt;/span&gt; &lt;span class="nx"&gt;an&lt;/span&gt; &lt;span class="nx"&gt;Angular&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;Angular&lt;/span&gt; &lt;span class="nx"&gt;Material&lt;/span&gt;
 &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Initialise&lt;/span&gt; &lt;span class="nx"&gt;GIT&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;GITHUB&lt;/span&gt;
 &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Create&lt;/span&gt; &lt;span class="nx"&gt;APP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;
&lt;span class="err"&gt;🚉&lt;/span&gt; &lt;span class="nx"&gt;Adding&lt;/span&gt; &lt;span class="nx"&gt;Angular&lt;/span&gt; &lt;span class="nx"&gt;Material&lt;/span&gt; &lt;span class="nx"&gt;UI&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;angular&lt;/span&gt;&lt;span class="sr"&gt;/materia&lt;/span&gt;&lt;span class="err"&gt;l
🚙&lt;/span&gt; &lt;span class="nx"&gt;Adding&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ng&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;HTTP&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;
&lt;span class="err"&gt;🛴&lt;/span&gt; &lt;span class="nx"&gt;Defining&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="nc"&gt;Interface &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;based&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="s2"&gt;`https://jsonplaceholder.typicode.com/users`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;👥&lt;/span&gt; &lt;span class="nx"&gt;Fetching&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;Displaying&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Back-End&lt;/span&gt;
&lt;span class="err"&gt;🧨&lt;/span&gt; &lt;span class="nx"&gt;Endpoint&lt;/span&gt; &lt;span class="nx"&gt;Customisation&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Moving&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;`jsonplaceholder`&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;local&lt;/span&gt; &lt;span class="nx"&gt;NodeJS&lt;/span&gt; &lt;span class="nx"&gt;Rest&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nodejs&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nodejs&lt;/span&gt;
&lt;span class="err"&gt;✨&lt;/span&gt; &lt;span class="nx"&gt;initialising&lt;/span&gt; &lt;span class="nx"&gt;NodeJS&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;ExpressJS&lt;/span&gt; 
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;morgan&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;notepad&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;js &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;loader&lt;/span&gt; &lt;span class="nx"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;esm&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mjs&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Adjust&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="s2"&gt;`package.json`&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;imports&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Test&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:3000/users&lt;/span&gt;
&lt;span class="err"&gt;🎇&lt;/span&gt; &lt;span class="nx"&gt;Adding&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;Source&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;Users&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Using&lt;/span&gt; &lt;span class="s2"&gt;`RoboHash`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;random&lt;/span&gt; &lt;span class="nf"&gt;images &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//robohash.org/${user.id}.png?set=set1&amp;amp;size=45x4)&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Test&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:4200/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;a href="https://github.com/leolanese/Angular-NodeJS-RestAPI" rel="noopener noreferrer"&gt;Angular-NodeJS-RestAPI&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Local mock users locally to be served
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.mjs&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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="nx"&gt;cors&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;cors&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&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;users&lt;/span&gt; &lt;span class="o"&gt;=&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="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Leanne Graham&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bret&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sincere@april.biz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kulas Light&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Apt. 556&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Gwenborough&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zipcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;92998-3874&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geo&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-37.3159&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lng&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;81.1496&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1-770-736-8031 x56442&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hildegard.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Romaguera-Crona&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catchPhrase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Multi-layered client-server neural-net&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;harness real-time e-markets&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ervin Howell&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Antonette&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Shanna@melissa.tv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Victor Plains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Suite 879&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wisokyburgh&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zipcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;90566-7771&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geo&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-43.9509&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lng&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-34.4618&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;010-692-6593 x09125&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anastasia.net&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deckow-Crist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catchPhrase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Proactive didactic contingency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;synergize scalable supply-chains&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clementine Bauch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Samantha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nathan@yesenia.net&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Douglas Extension&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Suite 847&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;McKenziehaven&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zipcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;59590-4157&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geo&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-68.6102&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lng&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-47.0653&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1-463-123-4447&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ramiro.info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Romaguera-Jacobson&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catchPhrase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Face to face bifurcated interface&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;e-enable strategic applications&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Patricia Lebsack&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Karianne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Julianne.OConner@kory.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hoeger Mall&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Apt. 692&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;South Elvis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zipcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;53919-4257&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geo&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;29.4572&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lng&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-164.2990&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;493-170-9623 x156&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kale.biz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Robel-Corkery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catchPhrase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Multi-tiered zero tolerance productivity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transition cutting-edge web services&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Chelsey Dietrich&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kamren&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lucio_Hettinger@annie.ca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Skiles Walks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Suite 351&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Roscoeview&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zipcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;33263&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geo&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-31.8129&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lng&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;62.5342&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;(254)954-1289&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demarco.info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;company&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Keebler LLC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;catchPhrase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User-centric fault-tolerant solution&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;revolutionize end-to-end systems&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Enable CORS for all routes&lt;/span&gt;

&lt;span class="c1"&gt;// Checking if the application is in development mode&lt;/span&gt;
&lt;span class="c1"&gt;// If it is, morgan middleware is added to the express application to log HTTP requests&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MODE&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;morgan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dev&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&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;/users&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Starting the express server and listening for connections on the specified port.&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed to start server: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server running on: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;This project was generated with &lt;a href="https://github.com/angular/angular-cli" rel="noopener noreferrer"&gt;Angular CLI&lt;/a&gt; version 17.0.9.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development server
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;ng serve&lt;/code&gt; for a dev server. Navigate to &lt;code&gt;http://localhost:4200/&lt;/code&gt;. The application will automatically reload if you change any of the source files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code scaffolding
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;ng generate component component-name&lt;/code&gt; to generate a new component. You can also use &lt;code&gt;ng generate directive|pipe|service|class|guard|interface|enum|module&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;ng build&lt;/code&gt; to build the project. The build artifacts will be stored in the &lt;code&gt;dist/&lt;/code&gt; directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running unit tests
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;ng test&lt;/code&gt; to execute the unit tests via &lt;a href="https://karma-runner.github.io" rel="noopener noreferrer"&gt;Karma&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;Run &lt;code&gt;ng e2e&lt;/code&gt; to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further help
&lt;/h2&gt;

&lt;p&gt;To get more help on the Angular CLI use &lt;code&gt;ng help&lt;/code&gt; or go check out the &lt;a href="https://angular.io/cli" rel="noopener noreferrer"&gt;Angular CLI Overview and Command Reference&lt;/a&gt; page.&lt;/p&gt;

</description>
      <category>node</category>
      <category>angular</category>
      <category>restapi</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Angular (17+) Reactive Forms + Signals &amp; StandAlone Components</title>
      <dc:creator>Leo Lanese</dc:creator>
      <pubDate>Thu, 08 Feb 2024 10:55:06 +0000</pubDate>
      <link>https://dev.to/leolanese/angular-17-reactive-forms-signals-standalone-components-nib</link>
      <guid>https://dev.to/leolanese/angular-17-reactive-forms-signals-standalone-components-nib</guid>
      <description>&lt;h1&gt;
  
  
  Angular (17+) Reactive-Forms with Signals and StandAlone Components
&lt;/h1&gt;

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

&lt;p&gt;&lt;a href="https://github.com/leolanese/Angular-Signal-ReactiveForm" rel="noopener noreferrer"&gt;GitHub / Angular Reactive Forms with Signals and StandAlon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/edit/stackblitz-starters-nlf4hf?file=src%2Fmain.ts" rel="noopener noreferrer"&gt;StackBlitz / Angular Reactive Forms with Signals and StandAlone&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;Lets Create an standAlone component, with reactive-forms (&lt;a href="https://angular.io/guide/reactive-forms" rel="noopener noreferrer"&gt;https://angular.io/guide/reactive-forms&lt;/a&gt;) using Signals. In this example we use Angular Signals to represent form control values as signals. &lt;code&gt;firstNameSignal&lt;/code&gt; is created using the toSignal function. Represents the value of the 'firstName' form control, so now, instead of manually subscribing to the valueChanges of the form control, we can directly use the signal in our template.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using signals in a reactive form with Angular has several benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Efficient Updates
&lt;/h3&gt;

&lt;p&gt;Signals allow you to represent form control values as signals. This means that only relevant components or parts of your application react to changes in form values. Instead of using traditional subscriptions where all changes trigger an update, signals provide a more efficient way to handle updates, especially in large and complex applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seamless Integration with Reactive Forms
&lt;/h3&gt;

&lt;p&gt;Angular Signals can seamlessly integrate with reactive forms, making it easy to represent the state of form controls as signals. This integration enhances the overall reactivity and performance of your forms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clearer Code Structure
&lt;/h3&gt;

&lt;p&gt;Signals provide a clear and declarative way to handle updates in your application. By using signals, you can organise your code in a way that reflects the flow of data and updates, leading to cleaner and more maintainable code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplified State Management
&lt;/h3&gt;

&lt;p&gt;Angular Signals abstract away some of the complexities of state management. By representing form control values as signals, you can simplify the way your application handles and reacts to changes, making the code more readable and maintainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improved Debugging
&lt;/h3&gt;

&lt;p&gt;Signals make it easier to trace the flow of data and identify where updates are originating. This can be beneficial during debugging, as you have a clear structure for handling and responding to changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easily apply RxJS Operators (Debouncing, Throttling, etc)
&lt;/h3&gt;

&lt;p&gt;With signals, you can easily apply operators like debounceTime or throttleTime to control the rate of updates. This is particularly useful in scenarios where you want to delay the reaction to user input or prevent unnecessary updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selective Rendering
&lt;/h3&gt;

&lt;p&gt;Only the parts of your application that rely on a specific signal will update when its value alters. While not a virtual DOM like React, it does offer focused template updates. This means that when a signal changes, only the components or templates that depend on that particular signal will be re-rendered or updated. This is in contrast to a full re-render of the entire DOM, which can be more resource-intensive. Angular Signals achieves selective rendering by leveraging a reactive approach to data. When a signal is updated, Angular Signals intelligently identifies the parts of the application that are directly affected by that signal and updates only those parts, avoiding unnecessary updates to unrelated components.&lt;/p&gt;

&lt;h3&gt;
  
  
  In brief
&lt;/h3&gt;

&lt;p&gt;Using Angular Signals in reactive forms enhances the reactivity, performance, and maintainability of your Angular applications by providing a streamlined way to handle updates and manage the state of form controls. &lt;/p&gt;




&lt;h3&gt;
  
  
  💯 Thanks!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Now, don't be an stranger. Let's stay in touch!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/leolanese" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscastiel.dev%2Fapi%2Fimage%2Fleolanese%3Fdark%26removeLink" alt="leolanese’s GitHub image" width="1200" height="628"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  🔘 Linkedin: &lt;a href="https://www.linkedin.com/in/leolanese/" rel="noopener noreferrer"&gt;LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Twitter: &lt;a href="https://twitter.com/LeoLanese" rel="noopener noreferrer"&gt;@LeoLanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Portfolio: &lt;a href="https://www.leolanese.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.leolanese.com" rel="noopener noreferrer"&gt;www.leolanese.com&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 DEV.to: &lt;a href="https://www.dev.to/leolanese"&gt;dev.to/leolanese&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Blog: &lt;a href="https://www.leolanese.com/blog" rel="noopener noreferrer"&gt;leolanese.com/blog&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  🔘 Questions / Suggestion / Recommendation: &lt;a href="mailto:developer@leolanese.com"&gt;developer@leolanese.com&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
