<?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>Forem: Tapajyoti Bose</title>
    <description>The latest articles on Forem by Tapajyoti Bose (@ruppysuppy).</description>
    <link>https://forem.com/ruppysuppy</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%2F530414%2F941751d8-06b8-41bd-9de9-6ea056b7199f.png</url>
      <title>Forem: Tapajyoti Bose</title>
      <link>https://forem.com/ruppysuppy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ruppysuppy"/>
    <language>en</language>
    <item>
      <title>Sell yourself as a developer - creating a personal brand 🚀💼✨</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 25 May 2025 14:42:51 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/sell-yourself-as-a-developer-creating-a-personal-brand-2pe6</link>
      <guid>https://forem.com/ruppysuppy/sell-yourself-as-a-developer-creating-a-personal-brand-2pe6</guid>
      <description>&lt;p&gt;The world of tech has always been extremely &lt;strong&gt;fast-paced&lt;/strong&gt;, especially after the advent of &lt;strong&gt;AI-based tools&lt;/strong&gt;. Now, simply being incredible at programming is no longer sufficient — to &lt;strong&gt;get customers for a product&lt;/strong&gt; you have built or simply &lt;strong&gt;get approached for jobs&lt;/strong&gt;, standing out as a developer is crucial!&lt;/p&gt;

&lt;p&gt;Does &lt;strong&gt;creating a personal brand&lt;/strong&gt; feel like a gigantic, insurmountable task? Don't worry - this article will &lt;strong&gt;demystify the steps&lt;/strong&gt; &amp;amp; help you build an image that is &lt;strong&gt;authentic to yourself&lt;/strong&gt;, which will lead to &lt;strong&gt;recruiters lining up to hire you&lt;/strong&gt;!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What is branding?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Branding&lt;/strong&gt; is the art of crafting an identity of &lt;strong&gt;how people perceive a product&lt;/strong&gt;. In terms of &lt;strong&gt;personal branding&lt;/strong&gt;, it refers to encapsulating your skills, experiences &amp;amp; values and showcasing them such that makes people want to work with you, collaborate on projects, or seek your expertise.&lt;/p&gt;

&lt;p&gt;When it comes to &lt;strong&gt;personal branding&lt;/strong&gt;, &lt;strong&gt;authenticity is the key&lt;/strong&gt; - your brand should be a reflection of who you are and should be consistent across various touch points on numerous platforms.&lt;/p&gt;

&lt;p&gt;For example, I take great pride in delivering &lt;strong&gt;sleek UI/UX&lt;/strong&gt; that works without much hassle - if you visit &lt;a href="https://tapajyoti-bose.vercel.app/" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;, you will find the &lt;strong&gt;theme&lt;/strong&gt; to be consistent with what I claim to deliver!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yovgzuxst6klagjmxwc.gif" 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%2F1yovgzuxst6klagjmxwc.gif" alt="portfolio" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How others perceive you is crucial too - being &lt;strong&gt;true to your word&lt;/strong&gt;, a stupid simple task, &lt;strong&gt;is a superpower&lt;/strong&gt;. We live in a world where the majority &lt;strong&gt;overpromise &amp;amp; under-deliver&lt;/strong&gt;, so if you can say what you are going to do &amp;amp; do what you said you would do, there's nothing in the world that can stop you from being an incredibly high-demand developer, who can charge much above market rates.&lt;/p&gt;

&lt;p&gt;Take my &lt;a href="https://www.upwork.com/freelancers/~01c12e516ee1d35044" rel="noopener noreferrer"&gt;Upwork profile&lt;/a&gt; as an example. For each of my clients, I delivered on time with the promised results &amp;amp; they were happy to leave a good review which led to building trust in me delivering to future clients - this creates an &lt;strong&gt;upward spiral&lt;/strong&gt;, allowing me to get clients in the future far more easily (even though I primarily DON'T use &lt;strong&gt;Upwork&lt;/strong&gt; anymore), and I get to charge much above market rates - in &lt;strong&gt;India&lt;/strong&gt;, the &lt;strong&gt;average software developer salary is $5/hour&lt;/strong&gt;, and I can say no to any clients offering me less than &lt;strong&gt;$75/hour&lt;/strong&gt; without thinking twice!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a personal brand
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;We know what &lt;strong&gt;branding&lt;/strong&gt; is - tell me how to create a &lt;strong&gt;personal brand&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Glad you asked!&lt;/p&gt;

&lt;h3&gt;
  
  
  Know your strengths
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You should always be playing to your strengths&lt;/strong&gt; - highlighting what you are good at, it can be hard technical skills or soft skills that enable you to land better opportunities, any skill that you are extremely good at works, even if the skill is fairly common!&lt;/p&gt;

&lt;p&gt;For example, most of the developers I have encountered in the past few years - hate the idea of working on styling in &lt;strong&gt;front-end development&lt;/strong&gt;, but I love it. It comes easy to me &amp;amp; building layouts, regardless of whether it's &lt;strong&gt;Yoga&lt;/strong&gt; (&lt;strong&gt;React Native&lt;/strong&gt;) or basic &lt;strong&gt;web-based CSS/SCSS&lt;/strong&gt;. As a result, in my early days, doing only &lt;strong&gt;front-end development&lt;/strong&gt; got me to the &lt;strong&gt;$50/hour&lt;/strong&gt; mark!&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminate or work on your weaknesses
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9c6wf4h6hfuz1ycq838z.gif" 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%2F9c6wf4h6hfuz1ycq838z.gif" alt="weakness" width="306" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No matter what most people say, you should &lt;strong&gt;NOT work on improving (most of) your weaknesses&lt;/strong&gt;, but eliminate working on them altogether!&lt;/p&gt;

&lt;p&gt;Let me explain: weaknesses are skills that don't come to you naturally (even after spending countless hours actively focusing on honing them) - even though &lt;strong&gt;it's possible to get world-class at these through repeated practice&lt;/strong&gt;, you will hate the process &amp;amp; someone who enjoys the grind of developing the skill would easily beat you!&lt;/p&gt;

&lt;p&gt;For example, when I was trying to decide which niche of tech I should be joining, I was keen on getting into &lt;strong&gt;data science&lt;/strong&gt; as &lt;strong&gt;it had the highest average salary&lt;/strong&gt; - but it took me months to understand some of the basic concepts &amp;amp; realized it was not for me. NOTE: I spent hours each day focusing solely on &lt;strong&gt;data science&lt;/strong&gt; without any distractions, studying it - &lt;strong&gt;you shouldn't give up until you spent at least approximately 100 hours of active undivided attention on a topic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;one exception to this rule&lt;/strong&gt; - if the weakness is something that is &lt;strong&gt;actively holding you back from achieving the results you want&lt;/strong&gt;, no &lt;em&gt;ifs&lt;/em&gt;, no &lt;em&gt;buts&lt;/em&gt;, you need to work on the skill.&lt;/p&gt;

&lt;p&gt;For example, if you don't have the necessary &lt;strong&gt;negotiation skills&lt;/strong&gt; but exceptional &lt;strong&gt;development skills&lt;/strong&gt;, you will always receive &lt;strong&gt;low-ball offers&lt;/strong&gt; &amp;amp; will &lt;strong&gt;not be able to negotiate the compensation&lt;/strong&gt;. Here it's crucial to learn how to negotiate &amp;amp; get to a point where you can charge what you are worth. I once had a client who &lt;strong&gt;increased their budget by 50%&lt;/strong&gt; to ensure I got paid what I was asking for - money is rarely the problem as long as &lt;strong&gt;you are providing more value to the client than what they are paying you&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define your target audience
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzfwhpcxvbirsvg975c0.gif" 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%2Fzzfwhpcxvbirsvg975c0.gif" alt="target-acquired" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have identified your strengths &amp;amp; weaknesses, you need to &lt;strong&gt;identify your target audience&lt;/strong&gt; too &amp;amp; build up your brand image such that it caters to their desires - &lt;strong&gt;instead of chasing the people you want, you want to start attracting them&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;For example, my brand is built specifically for potential clients, looking for sleek websites or native apps who &lt;strong&gt;prefer tasks done fast and well, instead of cheap&lt;/strong&gt; &amp;amp; who enjoy injecting occasional light-hearted fun in the mix of work&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting noticed
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ldj1cvtcwtb8aqr08fo.gif" 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%2F3ldj1cvtcwtb8aqr08fo.gif" alt="see-me" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is probably the most important tool for building a personal brand - &lt;strong&gt;you may be the best developer in the world, but nobody is going to hire you if they don't know you exist&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;You need to &lt;strong&gt;actively get in front of people's eyeballs&lt;/strong&gt; to get noticed &amp;amp; be considered a viable candidate for the roles you want. I found &lt;strong&gt;blogging&lt;/strong&gt; and &lt;strong&gt;open source contributions&lt;/strong&gt; exceptionally useful for this purpose - even though I had quit for a few years &amp;amp; started rebuilding my blogs recently, in the early days, I received &lt;strong&gt;2.8M+ views&lt;/strong&gt;. It gave me &lt;strong&gt;credibility for providing value for free&lt;/strong&gt; to others consistently for years! The contributions I had made to large projects like &lt;strong&gt;Material UI&lt;/strong&gt; &amp;amp; &lt;strong&gt;Microsoft&lt;/strong&gt; ages ago on &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, still make potential clients take me seriously.&lt;/p&gt;

&lt;p&gt;You don't have to start &lt;strong&gt;blogging&lt;/strong&gt;, but ensure you have a platform where you &lt;strong&gt;regularly provide value to others in the developer community&lt;/strong&gt;, it may be &lt;strong&gt;posting on LinkedIn&lt;/strong&gt;, making &lt;strong&gt;Youtube videos&lt;/strong&gt;, &lt;strong&gt;answering questions on Stack Overflow&lt;/strong&gt; or even &lt;strong&gt;contributing to open source projects&lt;/strong&gt; - you get to choose what resonates the most with you!&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Building a personal brand as a developer is a long and arduous journey&lt;/strong&gt; that requires self-awareness, consistency, and a willingness to put yourself out there. &lt;strong&gt;It's not going to be easy, but when done consistently, it will yield dividends you never imagined&lt;/strong&gt; - earning crores while working part-time anywhere in the world. It's not easy by any stretch, but given I was able to do it (&lt;strong&gt;someone people used to label as stupid &amp;amp; delusional&lt;/strong&gt;) I am sure that with proper effort anyone can achieve the same and even surpass me.&lt;/p&gt;

&lt;p&gt;By following these steps, you'll not only stand out in a crowded field but also attract opportunities that align with your values. &lt;strong&gt;Best of luck&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr2he5fj5rv3klwk7vo0.gif" 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%2Frr2he5fj5rv3klwk7vo0.gif" alt="good-luck" width="392" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>9 tricks that separate a pro Typescript developer from an noob 😎</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 11 May 2025 05:06:32 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/9-tricks-that-separate-a-pro-typescript-developer-from-an-noob-jpd</link>
      <guid>https://forem.com/ruppysuppy/9-tricks-that-separate-a-pro-typescript-developer-from-an-noob-jpd</guid>
      <description>&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt; is a must-know tool if you plan to master web development in 2025, regardless of whether it's for &lt;strong&gt;Frontend&lt;/strong&gt; or &lt;strong&gt;Backend&lt;/strong&gt; (or &lt;strong&gt;Fullstack&lt;/strong&gt;). It's one of the best tools for avoiding the pitfalls of &lt;strong&gt;JavaScript&lt;/strong&gt;, but it can be a bit overwhelming for beginners. Here are &lt;strong&gt;9 tricks&lt;/strong&gt; that will kick start your journey from a noob to a pro &lt;strong&gt;Typescript developer&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78d4d5xi3uxrlpdnthst.gif" 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%2F78d4d5xi3uxrlpdnthst.gif" alt="let's get started" width="400" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Type inference
&lt;/h2&gt;

&lt;p&gt;Unlike what most beginners think, you don't need to define &lt;strong&gt;types&lt;/strong&gt; for everything explicitly. &lt;strong&gt;Typescript&lt;/strong&gt; is smart enough to infer the &lt;strong&gt;data types&lt;/strong&gt; if you help narrow it down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Basic cases&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// auto-inferred to be a boolean&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&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;// auto-inferred to be a boolean&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// auto-inferred to be a boolean&lt;/span&gt;

&lt;span class="c1"&gt;// Niche cases in certain blocks&lt;/span&gt;
&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;IncrementBy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INCREMENT_BY&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IncrementAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IncrementByAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IncrementBy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CounterAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;IncrementAction&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;IncrementByAction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterAction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;// TS infers that the action is IncrementAction&lt;/span&gt;
      &lt;span class="c1"&gt;// &amp;amp; has no payload when the code in this case is&lt;/span&gt;
      &lt;span class="c1"&gt;// being executed&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&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="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IncrementBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;// TS infers that the action is IncrementByAction&lt;/span&gt;
      &lt;span class="c1"&gt;// &amp;amp; has a number as a payload when the code in this&lt;/span&gt;
      &lt;span class="c1"&gt;// case is being executed&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;default&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;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Literal types
&lt;/h2&gt;

&lt;p&gt;When you need a variable to hold specific values, the &lt;code&gt;literal types&lt;/code&gt; come in handy. Consider you are building a &lt;strong&gt;native library&lt;/strong&gt; that informs the user about the &lt;strong&gt;permissions status&lt;/strong&gt;, you could implement it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PermissionStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;undetermined&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;permissionStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PermissionStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;permissionStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PermissionStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;random&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// ❌&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Literal types&lt;/code&gt; are not only limited to &lt;strong&gt;strings&lt;/strong&gt;, but work for &lt;strong&gt;numbers&lt;/strong&gt; and &lt;strong&gt;booleans&lt;/strong&gt;, too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UnauthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
 &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="kd"&gt;type&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;UnauthenticatedUser&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&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;user&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;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;isAuthenticated&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="c1"&gt;// ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NOTE: To make realistic examples above, we have used &lt;code&gt;Union&lt;/code&gt; with the &lt;code&gt;literal types&lt;/code&gt;. You can use them as standalone &lt;strong&gt;types&lt;/strong&gt;, too, but that makes them somewhat redundant (act as a &lt;code&gt;type alias&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UnauthenticatedUserData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Enums
&lt;/h2&gt;

&lt;p&gt;As &lt;strong&gt;TypeScript&lt;/strong&gt; docs define them:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enums are one of the few features TypeScript has which is not a type-level extension of JavaScript.&lt;/p&gt;

&lt;p&gt;Enums allow a developer to define a set of named constants. Using enums can make it easier to document intent or create a set of distinct cases. TypeScript provides both numeric and string-based enums.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can define &lt;code&gt;enums&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PrivacyStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Private&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;As an added functionality, you can also define &lt;strong&gt;string&lt;/strong&gt; or &lt;strong&gt;number&lt;/strong&gt; &lt;code&gt;enums&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PrivacyStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Public&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Private&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;private&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default (if unspecified), enums are mapped to numbers starting from 0. Taking the example above, the default &lt;code&gt;enum&lt;/code&gt; values would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PrivacyStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;But if we introduce a new enum value, the values of the existing &lt;code&gt;enums&lt;/code&gt; will change too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PrivacyStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;OnlyWith&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="nx"&gt;OnlyExcept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you plan to store the enum values in a &lt;strong&gt;database&lt;/strong&gt;, it's strongly recommended to define the values each &lt;code&gt;enum&lt;/code&gt; should map to, instead of leaving them with the default numbers - else it's easy to run into a plethora of bugs when the list of values the &lt;code&gt;enum&lt;/code&gt; contains changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Type guards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type guards&lt;/strong&gt; are a way to narrow down the type of a &lt;strong&gt;variable&lt;/strong&gt;. They are functions that help you to check which &lt;strong&gt;type&lt;/strong&gt; a value is at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// continuing from the previous example&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UnauthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
 &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAuthenticatedUser&lt;/span&gt; &lt;span class="o"&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="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&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;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isAuthenticatedUser&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="c1"&gt;// user is AuthenticatedUser &amp;amp; you can access the data property&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="nx"&gt;user&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;p&gt;You can define custom &lt;strong&gt;type guards&lt;/strong&gt; as per your requirement, but if you are lazy like me, try out &lt;a href="https://www.npmjs.com/package/@rnw-community/shared" rel="noopener noreferrer"&gt;@rnw-community/shared&lt;/a&gt; for some commonly used type guards such as &lt;code&gt;isDefined&lt;/code&gt;, &lt;code&gt;isEmptyString&lt;/code&gt;, &lt;code&gt;isEmptyArray&lt;/code&gt;, etc&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Index Signatures and Records
&lt;/h2&gt;

&lt;p&gt;When you have &lt;strong&gt;dynamic keys&lt;/strong&gt; in an object, you can use an &lt;strong&gt;index signature&lt;/strong&gt; or &lt;code&gt;Record&lt;/code&gt; to define its type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Joined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JOINED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LEFT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Pending&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PENDING&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="c1"&gt;// Using index signature&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ParticipantData&lt;/span&gt; &lt;span class="p"&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Using Record&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ParticipantData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&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;participants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ParticipantData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Joined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Pending&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NOTE: In the code above, you should use either &lt;strong&gt;index signature&lt;/strong&gt; or &lt;code&gt;Record&lt;/code&gt;, not both - having both in will cause an error saying &lt;code&gt;Duplicate identifier 'ParticipantData'&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Generics
&lt;/h2&gt;

&lt;p&gt;Occasionally, you may want to create a &lt;strong&gt;function&lt;/strong&gt; or a &lt;strong&gt;class&lt;/strong&gt; that is not restricted to work with multiple types of data. &lt;strong&gt;Generics&lt;/strong&gt; allow you to handle just that. You can define a &lt;strong&gt;generic type&lt;/strong&gt; by using angle brackets &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getJsonString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&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;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&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;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&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="kc"&gt;null&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="c1"&gt;// usage&lt;/span&gt;
&lt;span class="nf"&gt;getJsonString&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="s2"&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="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="nf"&gt;getJsonString&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="mi"&gt;2&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="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="nf"&gt;getJsonString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Generics&lt;/strong&gt; also allow you to define constraints on the type of data you want to work with. For example, if you want to create a &lt;strong&gt;function&lt;/strong&gt; that only works with &lt;strong&gt;objects with ids&lt;/strong&gt;, you can do it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;removeItemFromArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&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="kr"&gt;string&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;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&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="kr"&gt;string&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;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&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="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;!==&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;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// usage&lt;/span&gt;
&lt;span class="nf"&gt;removeItemFromArray&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="na"&gt;id&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&lt;/span&gt;&lt;span class="dl"&gt;"&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="s2"&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&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="s2"&gt;Jane 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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;                                   &lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="nf"&gt;removeItemFromArray&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="mi"&gt;2&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;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ❌&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Immutable types
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Immutable types&lt;/strong&gt; are a way to ensure that the data in your objects or arrays cannot be modified, thus you can prevent unintended side effects and make your code predictable and easy to debug.&lt;/p&gt;

&lt;p&gt;You can use &lt;code&gt;Readonly&lt;/code&gt; and &lt;code&gt;ReadonlyArray&lt;/code&gt; to enforce immutability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using &lt;code&gt;Readonly&lt;/code&gt; for objects
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Readonly&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="o"&gt;=&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="s2"&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;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="nx"&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="s2"&gt;Jane Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Error: Cannot assign to 'name' because it is a read-only property&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using &lt;code&gt;ReadonlyArray&lt;/code&gt; for arrays
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReadonlyArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&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="mi"&gt;2&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="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&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="c1"&gt;// ❌ Error: Property 'push' does not exist on type 'readonly number[]'&lt;/span&gt;
&lt;span class="nx"&gt;numbers&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="o"&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;// ❌ Error: Index signature in type 'readonly number[]' only permits reading&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deep immutability
&lt;/h3&gt;

&lt;p&gt;If you need &lt;strong&gt;deep immutability&lt;/strong&gt; (ensuring nested objects are also immutable), you can use libraries like &lt;a href="https://www.npmjs.com/package/deep-freeze" rel="noopener noreferrer"&gt;&lt;code&gt;deep-freeze&lt;/code&gt;&lt;/a&gt; or create custom utility types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;DeepReadonly&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;DeepReadonly&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&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;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kd"&gt;const&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;DeepReadonly&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="o"&gt;=&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="s2"&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;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;New York&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USA&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Los Angeles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Error: Cannot assign to 'city' because it is a read-only property&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can start off by making the &lt;strong&gt;constant objects read only&lt;/strong&gt; - there are hundreds of utilities for using the &lt;strong&gt;immutable pattern&lt;/strong&gt;, eg: allows you to use &lt;strong&gt;time travel debugging&lt;/strong&gt; in &lt;code&gt;Redux&lt;/code&gt;, but they would require a lot deeper dive to explain in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Utility types
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt; introduces several utility types to generate &lt;strong&gt;types&lt;/strong&gt; with niche characteristics using &lt;strong&gt;pre-existing types&lt;/strong&gt;. These &lt;strong&gt;utility types&lt;/strong&gt; are extremely useful when you need to generate a new type that is similar to an already existing type with minor alterations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Pick&lt;/code&gt;: Pick the necessary properties from an &lt;strong&gt;object type&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Omit&lt;/code&gt;: Pick all the properties from an &lt;strong&gt;object type&lt;/strong&gt;, omitting the &lt;strong&gt;selected keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Partial&lt;/code&gt;: Make all properties of an &lt;strong&gt;object type&lt;/strong&gt; optional&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Required&lt;/code&gt;: Make all properties of an &lt;strong&gt;object type&lt;/strong&gt; required
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PickUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&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="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="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&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;type&lt;/span&gt; &lt;span class="nx"&gt;OmitUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Omit&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&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;type&lt;/span&gt; &lt;span class="nx"&gt;PartialUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&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="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RequiredUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Required&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="c1"&gt;// PickUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface PickUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age?: number;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// OmitUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface OmitUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   email: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// PartialUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface PartialUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name?: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age?: number;&lt;/span&gt;
&lt;span class="c1"&gt;//   email?: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// RequiredUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface RequiredUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age: number;&lt;/span&gt;
&lt;span class="c1"&gt;//   email: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Union &amp;amp; Intersection types
&lt;/h2&gt;

&lt;p&gt;As already explored above, we can combine 2 or more &lt;strong&gt;types&lt;/strong&gt; using &lt;code&gt;Union types&lt;/code&gt; - &lt;code&gt;Union types&lt;/code&gt; are defined using the &lt;code&gt;|&lt;/code&gt; operator and combine multiple &lt;strong&gt;types&lt;/strong&gt; into a &lt;strong&gt;single type&lt;/strong&gt;. This is useful when you want to create a type that can be one of multiple &lt;strong&gt;different types&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UnauthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
 &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nl"&gt;isAuthenticated&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="c1"&gt;// Union - user type allows both unauthenticated users and authenticated users to be stored&lt;/span&gt;
&lt;span class="kd"&gt;type&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;UnauthenticatedUser&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;AuthenticatedUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;intersection operator&lt;/code&gt; uses the &lt;code&gt;&amp;amp;&lt;/code&gt; operator and combines the &lt;strong&gt;object types&lt;/strong&gt; into a &lt;strong&gt;single type&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserMetaData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;lastSignedInAt&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="nl"&gt;signInLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserFullData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UserData&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;UserMetaData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// UserFullData is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface UserFullData {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   email: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   phoneNumber: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   lastSignedInAt: Date;&lt;/span&gt;
&lt;span class="c1"&gt;//   signInLocation: {&lt;/span&gt;
&lt;span class="c1"&gt;//     country: string;&lt;/span&gt;
&lt;span class="c1"&gt;//     city: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   };&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;Now you know how pros use &lt;strong&gt;TypeScript&lt;/strong&gt;! Give yourself a &lt;strong&gt;pat on the back&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vy0xij3kt5frd7hld6m.gif" 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%2F0vy0xij3kt5frd7hld6m.gif" alt="pat on the back" width="220" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 skill you must know to call yourself HTML master in 2025 🚀</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 27 Apr 2025 03:23:28 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-skill-you-must-know-to-call-yourself-html-master-in-2025-199e</link>
      <guid>https://forem.com/ruppysuppy/7-skill-you-must-know-to-call-yourself-html-master-in-2025-199e</guid>
      <description>&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt; is the backbone of &lt;strong&gt;web development&lt;/strong&gt;, and it's not changing anytime soon. Even though &lt;strong&gt;HTML&lt;/strong&gt; is a simple &lt;strong&gt;markup language&lt;/strong&gt;, and you can easily get a reasonable grasp of it within a few hours, knowing the nitty-gritty details of &lt;strong&gt;HTML&lt;/strong&gt; is what separates an average developer from a great one!&lt;/p&gt;

&lt;p&gt;Here are &lt;strong&gt;7 HTML skills&lt;/strong&gt; you should know to become an exceptional developer in 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Semantic HTML
&lt;/h2&gt;

&lt;p&gt;As &lt;strong&gt;Google&lt;/strong&gt; spits out&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Semantic HTML&lt;/strong&gt; refers to using &lt;strong&gt;HTML&lt;/strong&gt; elements that clearly define the purpose and meaning of the content they contain, making your website code more understandable for both humans and machines. This is important because it enhances &lt;strong&gt;readability&lt;/strong&gt;, &lt;strong&gt;accessibility&lt;/strong&gt;, and &lt;strong&gt;search engine optimization&lt;/strong&gt; (&lt;strong&gt;SEO&lt;/strong&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Though picking up &lt;strong&gt;Semantic HTML&lt;/strong&gt; is a tad difficult for beginners, once you get the hang of things, using &lt;strong&gt;Semantic HTML&lt;/strong&gt; becomes almost unconscious.&lt;/p&gt;

&lt;p&gt;Common &lt;strong&gt;Semantic HTML&lt;/strong&gt; Tags are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;section&lt;/code&gt;: The &lt;code&gt;section&lt;/code&gt; tag groups the content into different &lt;strong&gt;sections&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;header&lt;/code&gt;: The &lt;code&gt;header&lt;/code&gt; tag is used to define the &lt;strong&gt;header&lt;/strong&gt; for a document&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nav&lt;/code&gt;: The &lt;code&gt;nav&lt;/code&gt; element defines a set of &lt;strong&gt;navigation links&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;footer&lt;/code&gt;: Just like the &lt;code&gt;header&lt;/code&gt;, the &lt;code&gt;footer&lt;/code&gt; tag is used to define the &lt;strong&gt;footer&lt;/strong&gt; for a document&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aside&lt;/code&gt;: The &lt;code&gt;aside&lt;/code&gt; element defines some content &lt;strong&gt;aside from the main content&lt;/strong&gt; (eg: placed in a &lt;strong&gt;sidebar&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt;: The &lt;code&gt;main&lt;/code&gt; element specifies the &lt;strong&gt;main content&lt;/strong&gt; of the document&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's an example of how to use &lt;strong&gt;Semantic HTML&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"brand-logo.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;aside&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#sec-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Section 1&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#sec-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Section 2&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"sec-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Section 1&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
      tempor incididunt ut labore et dolore magna aliqua.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"sec-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Section 2&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"http://ext-1.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;External Link 1&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"http://ext-2.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;External Link 2&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Lazy loading assets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt; is a technique that defers the loading of non-essential resources at the point the page is initially loaded. Deferring the loading of images and videos can significantly improve the &lt;strong&gt;initial load speed&lt;/strong&gt; of your website.&lt;/p&gt;

&lt;p&gt;One important note - you should only &lt;strong&gt;lazy load&lt;/strong&gt; images and videos that are below the &lt;code&gt;fold&lt;/code&gt; (fancy term for elements that are not visible in the viewport when the page is loaded, you have to manually scroll down to view the elements that are below the &lt;code&gt;fold&lt;/code&gt;). &lt;strong&gt;Lazy loading&lt;/strong&gt; of images and videos that are above the &lt;code&gt;fold&lt;/code&gt; (ie: visible on visiting the website) can lead to a poor user experience as the user will have to wait for the images and videos to load after the page is loaded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n71hz3gzot30gztxhiz.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%2F6n71hz3gzot30gztxhiz.png" alt="website fold view" width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's an example of how to &lt;strong&gt;lazy load&lt;/strong&gt; images and videos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- image --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.png"&lt;/span&gt; &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- video --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;preload=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"video.mp4"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/mp4"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Preloading assets
&lt;/h2&gt;

&lt;p&gt;This is the opposite of &lt;strong&gt;lazy loading&lt;/strong&gt;. &lt;strong&gt;Preloading&lt;/strong&gt; is a technique that allows you to load essential resources before the page is fully loaded. This can significantly improve the performance of your website, especially for resources that are critical for rendering the page.&lt;/p&gt;

&lt;p&gt;The most common use case for &lt;strong&gt;preloading&lt;/strong&gt; is to load up content that is above the &lt;code&gt;fold&lt;/code&gt; (ie: visible on visiting the website).&lt;/p&gt;

&lt;p&gt;Here's an example of how to &lt;strong&gt;preload&lt;/strong&gt; images - the tag should be placed in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of your &lt;strong&gt;HTML document&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/asset.png"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For videos, you can reuse the &lt;code&gt;preload&lt;/code&gt; attribute in the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;preload=&lt;/span&gt;&lt;span class="s"&gt;"auto"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"video.mp4"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/mp4"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Custom link previews
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyjphkuthgtl3qa0l0kr.jpeg" 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%2Fgyjphkuthgtl3qa0l0kr.jpeg" alt="whatsapp link" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever wondered how &lt;strong&gt;WhatsApp&lt;/strong&gt; shows a preview of the link you are sharing? It's as simple as slapping in a few tags in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of your &lt;strong&gt;HTML&lt;/strong&gt; document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WhatsApp&lt;/strong&gt; (&amp;amp; other platforms from &lt;strong&gt;Meta&lt;/strong&gt;) uses the &lt;strong&gt;Open Graph protocol&lt;/strong&gt; (&lt;code&gt;og&lt;/code&gt;) to generate link previews, whereas &lt;strong&gt;Twitter&lt;/strong&gt; uses the &lt;strong&gt;Twitter Card protocol&lt;/strong&gt;. You can (&amp;amp; should) use both protocols to generate link previews for your website.&lt;/p&gt;

&lt;p&gt;This is what I use for my &lt;strong&gt;portfolio&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Basic meta tags --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;
  &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"I am Tapajyoti Bose, a 5-Star &amp;amp; Top Rated Freelance Frontend Web Developer specializing in React. This is my portfolio."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"/card-image.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"thumbnail"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"/card-image.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Tapajyoti Bose: Personal Portfolio"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Twitter --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:card"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"summary"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:description"&lt;/span&gt;
  &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"I am Tapajyoti Bose, a 5-Star &amp;amp; Top Rated Freelance Frontend Web Developer specializing in React. This is my personal portfolio."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"/card-image.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Tapajyoti Bose: Personal Portfolio"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Open Graph (Facebook, Whatsapp, Instagram, Pinterest, etc) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
  &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt;
  &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"I am Tapajyoti Bose, a 5-Star &amp;amp; Top Rated Freelance Frontend Web Developer specializing in React. This is my personal portfolio."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"/card-image.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:site_name"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Tapajyoti Bose"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Tapajyoti Bose: Personal Portfolio"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:type"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"website"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://tapajyoti-bose.vercel.app/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are hundreds of &lt;strong&gt;meta tag generators&lt;/strong&gt; available online, but I found &lt;a href="https://metatags.io/" rel="noopener noreferrer"&gt;Meta Tags&lt;/a&gt; to be the best one so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make a call or send an email
&lt;/h2&gt;

&lt;p&gt;These days, most devices (including laptops &amp;amp; desktops) allow you to place calls. You can use the &lt;code&gt;tel:&lt;/code&gt; links to make a call from your device simply using &lt;strong&gt;HTML&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you want to send an email, &lt;code&gt;mailto:&lt;/code&gt; links got your back! It will open the default email client on the user's device and pre-fill the recipient's email address.&lt;/p&gt;

&lt;p&gt;Here's an example of how to use &lt;code&gt;tel:&lt;/code&gt; and &lt;code&gt;mailto:&lt;/code&gt; links:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"tel:+919876543210"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Call someone&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:user@email.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send an email&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Responsive images
&lt;/h2&gt;

&lt;p&gt;Ever run into a slow website that takes ages to fully load due to humongous images? Well, you can avoid that in your next awesome website by using &lt;strong&gt;responsive images&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Art Direction&lt;/strong&gt; is an incredible optimization technique that saves a huge amount of bandwidth by loading the &lt;strong&gt;optimally sized images&lt;/strong&gt; based on some &lt;code&gt;media queries&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 1200px)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"link-to-img"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 2560px)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"link-to-img@2x"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(min-width: 2560px)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"link-to-imgl@3x"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"link-to-img@3x"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, the browser will load the required image based on the &lt;code&gt;media query&lt;/code&gt; that matches the user's device. This is a great way to optimize the load time of your website for different devices and screen sizes.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Preformatted text
&lt;/h2&gt;

&lt;p&gt;Are you building an app where the text formatting a user enters needs to be preserved, but &lt;strong&gt;HTML&lt;/strong&gt; keeps reverting to the default formatting?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbrprbg7ubims4iqrnwm.gif" 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%2Fkbrprbg7ubims4iqrnwm.gif" alt="tired" width="400" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fret not my friend, all you need to do is wrap the content with a &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; tag to preserve the formatting of the text. Text in a &lt;code&gt;pre&lt;/code&gt; element is displayed in a fixed-width font by default (does allow manual styling), and the text preserves both spaces and line breaks.&lt;br&gt;
&lt;/p&gt;

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

 Ipsum   dolor sit             amet.
&lt;span class="nt"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>html</category>
      <category>beginners</category>
    </item>
    <item>
      <title>11 Interview Questions You Should Know as a React Native Developer in 2025 📈🚀</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 13 Apr 2025 12:40:15 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/11-interview-questions-you-should-know-as-a-react-native-developer-in-2025-1m6l</link>
      <guid>https://forem.com/ruppysuppy/11-interview-questions-you-should-know-as-a-react-native-developer-in-2025-1m6l</guid>
      <description>&lt;p&gt;&lt;sup&gt;&lt;em&gt;Originally published on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;This is the second part of the interview questions series. If you are looking for &lt;strong&gt;React Developer&lt;/strong&gt; interview questions, check out my previous article &lt;a href="https://medium.com/@tapajyoti-bose/17-interview-questions-you-must-know-as-a-react-developer-in-2025-20920fd26e37" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are the &lt;strong&gt;11 React Native Interview Questions&lt;/strong&gt; you should know in 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How does React Native achieve native-like performance?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; achieves native-like performance through several key features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direct native rendering
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; components map directly to &lt;strong&gt;native UI components&lt;/strong&gt;, allowing the app to render &lt;strong&gt;UI&lt;/strong&gt; elements using the &lt;strong&gt;platform's native APIs&lt;/strong&gt;. This results in a &lt;strong&gt;UI&lt;/strong&gt; that's indistinguishable from one built using native code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native threads
&lt;/h3&gt;

&lt;p&gt;There are 3 threads commonly used in &lt;strong&gt;React Native&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI thread&lt;/strong&gt;: This is the &lt;strong&gt;main thread&lt;/strong&gt; responsible for initializing the app, rendering the &lt;strong&gt;UI&lt;/strong&gt;, managing touch events, and invoking the &lt;strong&gt;JavaScript thread&lt;/strong&gt;. The biggest advantage of this &lt;strong&gt;thread&lt;/strong&gt; is that it can run in parallel with the &lt;strong&gt;JavaScript thread&lt;/strong&gt;, enabling &lt;strong&gt;smooth UX&lt;/strong&gt; even when an intensive computation is running on the &lt;strong&gt;JavaScript thread&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript thread&lt;/strong&gt;: This &lt;strong&gt;thread&lt;/strong&gt; runs the &lt;strong&gt;JavaScript code&lt;/strong&gt;, including the &lt;strong&gt;React Native&lt;/strong&gt; app logic. It communicates with the &lt;strong&gt;UI&lt;/strong&gt; thread to update the &lt;strong&gt;UI&lt;/strong&gt; based on user interactions and app state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow thread&lt;/strong&gt;: This thread is responsible for performing &lt;strong&gt;UI&lt;/strong&gt; layout and measurements. Before its introduction, the &lt;strong&gt;UI thread&lt;/strong&gt; was responsible for layout and measurements. Due to the segregation of responsibilities between the &lt;strong&gt;UI&lt;/strong&gt; and &lt;strong&gt;shadow threads&lt;/strong&gt;, &lt;strong&gt;React Native&lt;/strong&gt; can now deliver a much smoother experience, especially when dealing with complex layouts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsx6dw8656fffdur7fm6o.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%2Fsx6dw8656fffdur7fm6o.png" alt="threads" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimized UI updates
&lt;/h3&gt;

&lt;p&gt;By using &lt;strong&gt;React&lt;/strong&gt; under the hood, &lt;strong&gt;React Native's reconciliation process&lt;/strong&gt; (read: a fancy term for detecting the minimum changes to the actual &lt;strong&gt;DOM&lt;/strong&gt; to sync it with the &lt;strong&gt;Virtual DOM&lt;/strong&gt;) intelligently updates only the necessary parts of the &lt;strong&gt;UI&lt;/strong&gt;, reducing unnecessary rendering and enhancing performance.&lt;/p&gt;

&lt;p&gt;If you want to dive deeper into the differences between &lt;strong&gt;Virtual DOM&lt;/strong&gt;, &lt;strong&gt;real DOM&lt;/strong&gt; &amp;amp; the &lt;strong&gt;Shadow DOM&lt;/strong&gt;, check out &lt;a href="https://medium.com/@tapajyoti-bose/doms-decoded-dom-shadow-dom-virtual-dom-f4bf7a0d539a" rel="noopener noreferrer"&gt;this article&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is the role of the bridge in React Native?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;bridge&lt;/strong&gt; in &lt;strong&gt;React Native&lt;/strong&gt; is a crucial component that facilitates communication between the &lt;strong&gt;JavaScript&lt;/strong&gt; code and the &lt;strong&gt;native modules&lt;/strong&gt;. It acts as a two-way communication channel, allowing &lt;strong&gt;JavaScript&lt;/strong&gt; to call &lt;strong&gt;native APIs&lt;/strong&gt; and vice versa.&lt;/p&gt;

&lt;p&gt;When &lt;strong&gt;JavaScript code&lt;/strong&gt; needs to access a &lt;strong&gt;native module&lt;/strong&gt;, it sends a message to the &lt;strong&gt;bridge&lt;/strong&gt;, which then forwards the request to the appropriate &lt;strong&gt;native code&lt;/strong&gt;. The native code processes the request and sends the result back through the &lt;strong&gt;bridge&lt;/strong&gt; to the &lt;strong&gt;JavaScript&lt;/strong&gt; side. The communication through the &lt;strong&gt;bridge&lt;/strong&gt; is asynchronous and batched.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvkpvalqraqawceaxj1l.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%2Fcvkpvalqraqawceaxj1l.png" alt="react-native-bridge" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data is serialized and deserialized into a &lt;strong&gt;JSON-like format&lt;/strong&gt; as it passes through the &lt;strong&gt;bridge&lt;/strong&gt;. The huge advantage is that the two sides can communicate effectively despite being written in different languages (&lt;strong&gt;JavaScript&lt;/strong&gt; and &lt;strong&gt;native code&lt;/strong&gt;). One of the major challenges of the &lt;strong&gt;bridge&lt;/strong&gt; is that it can introduce latency, due to the additional overhead of serialization and deserialization, especially when dealing with huge amounts of data, frequent communication, and complex objects.&lt;/p&gt;

&lt;p&gt;PS: The &lt;strong&gt;bridge&lt;/strong&gt; primarily runs on the &lt;strong&gt;Main/UI thread&lt;/strong&gt; and doesn't have its own thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What is the new architecture in React native?
&lt;/h2&gt;

&lt;p&gt;The new architecture in &lt;strong&gt;React Native&lt;/strong&gt; is a complete rewrite of the major systems such as rendering, communication between native &amp;amp; &lt;strong&gt;Javascript code&lt;/strong&gt;, etc. It is aimed at improving performance, flexibility, and developer experience.&lt;/p&gt;

&lt;p&gt;The biggest change is the removal of the &lt;strong&gt;bridge&lt;/strong&gt; - previously, the &lt;strong&gt;bridge&lt;/strong&gt; was a major bottleneck, leading to performance issues and laggy experiences. The new architecture drastically improves &lt;strong&gt;JavaScript&lt;/strong&gt; abstractions and communicates with native code using &lt;strong&gt;JavaScript Interface (JSI)&lt;/strong&gt;, which allows for direct access to native &lt;strong&gt;APIs&lt;/strong&gt; without the need for serialization and deserialization. So now it's possible to call native code synchronously from &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One of the most common issues developers can recreate due to this infamous &lt;strong&gt;bridge&lt;/strong&gt; overhead is typing fast in a controlled input field. The &lt;strong&gt;bridge&lt;/strong&gt; is unable to keep up with the rapid changes, leading to a buggy experience, where the cursor lags behind what the user is typing. The source of the issue is that after each keystroke the data had to be sent over the &lt;strong&gt;bridge&lt;/strong&gt; to that native side requesting the value to be updated to the new state value.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fast typing in a controlled input using the new architecture
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mwk598t51rh0slmtonr.gif" 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%2F4mwk598t51rh0slmtonr.gif" alt="new-architecture" width="725" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fast typing in a controlled input using the old architecture
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgxu9jbm72hl5p0ue7r7.gif" 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%2Fpgxu9jbm72hl5p0ue7r7.gif" alt="old-architecture" width="725" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What are the differences between using React Native CLI vs Expo?
&lt;/h2&gt;

&lt;p&gt;To create a &lt;strong&gt;React Native&lt;/strong&gt; app, you have two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the &lt;strong&gt;React Native CLI&lt;/strong&gt; (&lt;strong&gt;Command Line Interface&lt;/strong&gt;) to set up a project from scratch. This comes with full control and flexibility over project setup &amp;amp; native code integration.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Expo&lt;/strong&gt;, a framework built on top of &lt;strong&gt;React Native&lt;/strong&gt; that provides a streamlined experience for building and deploying apps, but comes with limited access to native modules and &lt;strong&gt;APIs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here are the key differences:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;React Native CLI&lt;/th&gt;
&lt;th&gt;Expo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development Workflow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;More flexible and customizable, but requires more setup&lt;/td&gt;
&lt;td&gt;Streamlined and managed, simplifies development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full access to native code and modules&lt;/td&gt;
&lt;td&gt;Limited access to native modules - requires &lt;code&gt;prebuild&lt;/code&gt; for full control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Process&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers manage the build process&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Expo&lt;/strong&gt; handles the build process (via &lt;strong&gt;EAS&lt;/strong&gt; - &lt;strong&gt;Expo Application Services&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Difficult to pick up for beginners&lt;/td&gt;
&lt;td&gt;Easier for beginners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal Use Cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex applications which require extensive customization&lt;/td&gt;
&lt;td&gt;Quick prototyping and smaller projects, for rapid development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;NOTE: Even though to use &lt;strong&gt;Expo&lt;/strong&gt; for complex apps you require additional workarounds, it is possible to develop complicated apps with &lt;strong&gt;Expo&lt;/strong&gt;. I personally have used &lt;strong&gt;Expo&lt;/strong&gt; to build apps with &lt;strong&gt;App Clips&lt;/strong&gt; &amp;amp; &lt;strong&gt;Widgets&lt;/strong&gt;, by combining &lt;strong&gt;React Native&lt;/strong&gt; with native code in &lt;strong&gt;Swift&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Explain the role of managed and bare workflows in Expo.
&lt;/h2&gt;

&lt;p&gt;As mentioned above, &lt;strong&gt;Expo&lt;/strong&gt; makes it easy for developers to build and deploy &lt;strong&gt;React Native&lt;/strong&gt; apps but comes with limited access to native modules and &lt;strong&gt;APIs&lt;/strong&gt;. To get full access to Native modules, you need to &lt;em&gt;"eject"&lt;/em&gt; from the managed &lt;strong&gt;Expo&lt;/strong&gt; workflow and use the bare workflow. This can be done using a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;expo prebuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;prebuild&lt;/code&gt; command would generate the necessary files, and convert the managed workflow into a bare workflow where you have access to the &lt;code&gt;android&lt;/code&gt; &amp;amp; &lt;code&gt;ios&lt;/code&gt; folders, allowing you to write custom native code.&lt;/p&gt;

&lt;p&gt;The managed workflow is easier to use as &lt;strong&gt;Expo&lt;/strong&gt; handles the native code for you, but it has limited customization options for the native code. The bare workflow gives you full control over the native code, allowing you to write your native functionalities (eg: &lt;strong&gt;App Clips&lt;/strong&gt;, &lt;strong&gt;Widgets&lt;/strong&gt;, custom logic) but it requires more setup and maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. How to style a component in React Native?
&lt;/h2&gt;

&lt;p&gt;Similar to React, &lt;strong&gt;React Native&lt;/strong&gt; provides a bunch of methods to style components.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inline styles
&lt;/h3&gt;

&lt;p&gt;Similar to &lt;strong&gt;React&lt;/strong&gt;, this is the quickest (&amp;amp; dirtiest) way to style a component. You can pass a style object directly to the &lt;code&gt;style&lt;/code&gt; prop of a component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#F43596&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS-in-JS Modules (Styled Components)
&lt;/h3&gt;

&lt;p&gt;Using the same &lt;strong&gt;CSS-in-JS&lt;/strong&gt; approach as &lt;strong&gt;React&lt;/strong&gt;, you can use libraries like &lt;a href="https://styled-components.com/" rel="noopener noreferrer"&gt;Styled Components&lt;/a&gt; to style your components. This allows you to write &lt;strong&gt;CSS&lt;/strong&gt; directly in your &lt;strong&gt;JavaScript&lt;/strong&gt; files (personally not a fan of using these).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StyledText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="s2"&gt;`
  color: #bf4f74;
`&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="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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StyledText&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello World!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;StyledText&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  React Native StyleSheet
&lt;/h3&gt;

&lt;p&gt;This is the suggested way to style components in React Native. The &lt;code&gt;StyleSheet&lt;/code&gt; &lt;strong&gt;API&lt;/strong&gt; allows you to create a stylesheet object that can be reused across multiple components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&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="s2"&gt;react-native&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;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#F43596&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&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="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;center&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="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="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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello World!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suggestion: keep the styles in a separate file and import them into the component file. This keeps the code clean and easy to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;strong&gt;React Native&lt;/strong&gt; uses &lt;a href="https://www.yogalayout.dev/" rel="noopener noreferrer"&gt;Yoga&lt;/a&gt; for layout, which has access to a smaller subset of the &lt;strong&gt;CSS&lt;/strong&gt; properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. How do you handle platform-specific code in React Native?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; provides a few ways to handle platform-specific code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform.OS
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Platform.OS&lt;/code&gt; &lt;strong&gt;API&lt;/strong&gt; allows you to check the current platform (&lt;strong&gt;iOS&lt;/strong&gt;, &lt;strong&gt;Android&lt;/strong&gt;, or &lt;strong&gt;web&lt;/strong&gt;) and is commonly used to conditionally render components or styles based on the platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&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="s2"&gt;react-native&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="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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OS&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ios&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;iOS&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;Android&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Platform.select
&lt;/h3&gt;

&lt;p&gt;If you plan on supporting multiple platforms, the &lt;code&gt;Platform.select&lt;/code&gt; method might be easier to use - create a single object that contains conditional code for each platform, and &lt;strong&gt;React Native&lt;/strong&gt; will automatically select the correct one based on the current platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&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="s2"&gt;react-native&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="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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello iOS 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;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello Android 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;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello 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="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;native&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are on native&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are on web&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="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;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;h3&gt;
  
  
  Platform-specific file extensions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; allows you to create platform-specific files by using file extensions. For example, if you have a component that needs to behave differently on &lt;strong&gt;iOS&lt;/strong&gt; and &lt;strong&gt;Android&lt;/strong&gt;, you can create two separate files with the same name but different extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Component.js&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;Text&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="s2"&gt;react-native&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;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello user&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Component.web.js&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;Text&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="s2"&gt;react-native&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;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello Web user&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you import the &lt;code&gt;Component&lt;/code&gt;, &lt;strong&gt;React Native&lt;/strong&gt; will automatically select the correct file based on the current platform. Other extensions include &lt;code&gt;.ios.js&lt;/code&gt;, &lt;code&gt;.android.js&lt;/code&gt;, and &lt;code&gt;.native.js&lt;/code&gt; (or &lt;code&gt;.jsx&lt;/code&gt; &amp;amp; &lt;code&gt;.tsx&lt;/code&gt; equivalents).&lt;/p&gt;

&lt;p&gt;This approach is most useful for handling a codebase that targets both &lt;strong&gt;native&lt;/strong&gt; &amp;amp; &lt;strong&gt;web&lt;/strong&gt; - quite often trying to use components with underlying native modules can lead to crashes on the &lt;strong&gt;web&lt;/strong&gt;, which can be bypassed by using the platform-specific file extensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What is the difference between Flatlist and Scrollview when would you use one over the other?
&lt;/h2&gt;

&lt;p&gt;Both &lt;code&gt;FlatList&lt;/code&gt; and &lt;code&gt;ScrollView&lt;/code&gt; are used to render lists of items in &lt;strong&gt;React Native&lt;/strong&gt;, but they have different use cases and performance characteristics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ScrollView&lt;/code&gt; is a simple component that renders its &lt;strong&gt;children&lt;/strong&gt; in a scrollable view. It is best suited for small lists of items - it renders all its &lt;strong&gt;children&lt;/strong&gt; at once, which can lead to performance issues when dealing with large lists.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FlatList&lt;/code&gt; is a more advanced component that is optimized for rendering large lists of items. It only renders a set number of items on the screen &amp;amp; loads more items as the user scrolls through the list, which improves performance and reduces memory usage.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ScrollView&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Item 1&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Item 2&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Item 3&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// FlatList&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FlatList&lt;/span&gt;
   &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
   &lt;span class="na"&gt;renderItem&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;item&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
   &lt;span class="na"&gt;keyExtractor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For any real-world use case, most people find that even &lt;code&gt;FlatList&lt;/code&gt; is not performant enough. So the folks at &lt;strong&gt;Shopify&lt;/strong&gt; created a new component called &lt;code&gt;FlashList&lt;/code&gt; which is almost a drop-in replacement for &lt;code&gt;FlatList&lt;/code&gt; and is much more performant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw16zcxogck445us8bvw2.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%2Fw16zcxogck445us8bvw2.png" alt="flashlist-vs-flatlist" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;FlashList&lt;/code&gt; uses a different technique called &lt;em&gt;"cell recycling"&lt;/em&gt; that only renders the visible portion of a list and reuses those views as the user scrolls, reducing memory usage and improving performance. It takes in a few additional props such as &lt;code&gt;estimatedItemSize&lt;/code&gt; and &lt;code&gt;estimatedListSize&lt;/code&gt; to efficiently generate the &lt;strong&gt;UI&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FlashList&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;renderItem&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;item&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;keyExtractor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;estimatedItemSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;estimatedListSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;height&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="nl"&gt;width&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="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. What is the use of Native modules in React Native?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; allows developers to use &lt;strong&gt;platform-specific APIs&lt;/strong&gt;, libraries, and native features written in the platform's native language (eg: &lt;strong&gt;Java&lt;/strong&gt;/&lt;strong&gt;Swift&lt;/strong&gt;/&lt;strong&gt;Objective-C&lt;/strong&gt;) to add custom functionality to their apps in case the existing &lt;strong&gt;React Native&lt;/strong&gt; modules do not support them out of the box. The NativeModule system exposes instances of native classes to &lt;strong&gt;JavaScript&lt;/strong&gt; as &lt;strong&gt;JS&lt;/strong&gt; objects, thereby allowing you to execute arbitrary native code from within &lt;strong&gt;JS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The communication between &lt;strong&gt;JavaScript&lt;/strong&gt; and native code is done through the &lt;strong&gt;bridge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The new architecture introduces Turbo Native Module, which is similar to how &lt;strong&gt;React Native&lt;/strong&gt; uses Native Modules but uses JSI for direct synchronous calls between JavaScript and native code, resulting in much-improved performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. What are the benefits of React Native?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Native&lt;/strong&gt; is one of the most popular cross-platform frameworks. There are massive benefits of using &lt;strong&gt;React Native&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform development&lt;/strong&gt;: &lt;strong&gt;React Native&lt;/strong&gt; is extremely adept at the write once, run everywhere philosophy, it allows developers to write code that can be used on both &lt;strong&gt;iOS&lt;/strong&gt; and &lt;strong&gt;Android&lt;/strong&gt; platforms, reducing development time and effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community&lt;/strong&gt;: &lt;strong&gt;React Native&lt;/strong&gt; has the largest active community, which means there are plenty of resources, libraries, and third-party plugins available to reduce development time. If you run into any issues, chances are, you will find a solution for the problem on &lt;strong&gt;Stack Overflow&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds upon existing React knowledge&lt;/strong&gt;: If you are already familiar with &lt;strong&gt;React&lt;/strong&gt;, you can easily pick up &lt;strong&gt;React Native&lt;/strong&gt; and start building mobile apps. The component-based architecture and the use of &lt;strong&gt;JavaScript&lt;/strong&gt; make it easy to transition from web development to mobile development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native-like performance and UX&lt;/strong&gt;: It goes without saying, that unless &lt;strong&gt;React Native&lt;/strong&gt; can deliver native-like performance and UX, it would not be as popular as it is today. Innumerable apps like WhatsApp, Instagram, Facebook, etc. are built using &lt;strong&gt;React Native&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. What are the limitations of React Native?
&lt;/h2&gt;

&lt;p&gt;Just like everything in the universe, &lt;strong&gt;React Native&lt;/strong&gt; has its cons too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native-LIKE performance&lt;/strong&gt;: Though &lt;strong&gt;React Native&lt;/strong&gt; does provide close to native performance, especially after the introduction of the new architecture, it is still not as performant as fully native apps (or even Flutter). This is especially true for complex animations and heavy computations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency hell&lt;/strong&gt;: Managing dependencies for &lt;strong&gt;React Native&lt;/strong&gt; projects is something every developer dreams of, the dream just happens to be a nightmare! When you are upgrading to a new version of &lt;strong&gt;React Native&lt;/strong&gt; (or potentially Expo), you need to ensure that all your dependencies are compatible with the new version. This can be a tedious and time-consuming process, and can occasionally result in days' worth of work adding patches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native knowledge is still required&lt;/strong&gt;: This is highly dependent on what you are building, but if you need some native features such as &lt;strong&gt;App Clips&lt;/strong&gt;, &lt;strong&gt;Widgets&lt;/strong&gt;, etc. you will need to write native code - there's no way around it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though &lt;strong&gt;React Native&lt;/strong&gt; is a cross-platform framework, it is not a silver bullet for all mobile development needs. It is best suited for teams who are already familiar with React and for projects that require a quick turnaround time. For complex applications that require extensive customization or native features, there might be better development alternatives available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>17 React Interview Questions You Must Know as a Developer in 2025</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 30 Mar 2025 05:47:58 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/17-react-interview-questions-you-must-know-as-a-developer-in-2025-1o6f</link>
      <guid>https://forem.com/ruppysuppy/17-react-interview-questions-you-must-know-as-a-developer-in-2025-1o6f</guid>
      <description>&lt;p&gt;&lt;sup&gt;&lt;em&gt;Originally published on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; is one of the most in-demand skills for &lt;strong&gt;Frontend Developers&lt;/strong&gt; in &lt;strong&gt;2025&lt;/strong&gt;. If you're preparing for a &lt;strong&gt;React&lt;/strong&gt; developer interview in &lt;strong&gt;2025&lt;/strong&gt;, it's crucial to stay ahead of the curve with the latest best practices, patterns, and concepts.&lt;/p&gt;

&lt;p&gt;This article compiles a list of &lt;strong&gt;17 React interview questions&lt;/strong&gt; that cover everything from core &lt;strong&gt;React&lt;/strong&gt; principles to advanced performance optimizations that will help you ace your next &lt;strong&gt;React&lt;/strong&gt; developer interview.&lt;/p&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnex2u2gm4xy91p6mdgq.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%2Fqnex2u2gm4xy91p6mdgq.png" alt="dive-in" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is the React Virtual DOM? How is it different from the real DOM &amp;amp; Shadow DOM?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Virtual DOM&lt;/strong&gt; is a concept where a virtual representation of the &lt;strong&gt;real DOM&lt;/strong&gt; is kept inside the memory and is synced with the actual &lt;strong&gt;DOM&lt;/strong&gt; by a library such as &lt;strong&gt;ReactDOM&lt;/strong&gt; only when necessary.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Virtual DOM&lt;/strong&gt; is an object that represents the &lt;strong&gt;real DOM&lt;/strong&gt; in the memory. Since &lt;strong&gt;DOM&lt;/strong&gt; updates are an integral part of any web app but are the costliest operation in frontend development, the &lt;strong&gt;Virtual DOM&lt;/strong&gt; is utilized to check for parts of the app that need to be updated &amp;amp; update only those parts, thus significantly boosting performance.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Virtual DOM&lt;/strong&gt; is a completely different concept from the &lt;strong&gt;real DOM&lt;/strong&gt; and &lt;strong&gt;shadow DOM&lt;/strong&gt;. The &lt;strong&gt;real DOM&lt;/strong&gt; is the actual representation of the &lt;strong&gt;HTML document&lt;/strong&gt; in a &lt;strong&gt;tree-like structure&lt;/strong&gt; that browsers use to track the contents of a web page, and the &lt;strong&gt;Shadow DOM&lt;/strong&gt; is a programming practice that allows developers to create isolated reusable components for web applications.&lt;/p&gt;

&lt;p&gt;If you want to dive deeper into the differences between &lt;strong&gt;Virtual DOM&lt;/strong&gt;, &lt;strong&gt;real DOM&lt;/strong&gt; &amp;amp; the &lt;strong&gt;Shadow DOM&lt;/strong&gt;, check out &lt;a href="https://medium.com/@tapajyoti-bose/doms-decoded-dom-shadow-dom-virtual-dom-f4bf7a0d539a" rel="noopener noreferrer"&gt;this article&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What are the 2 types of components in React? Where should we use them?
&lt;/h2&gt;

&lt;p&gt;There are 2 types of components in &lt;strong&gt;React&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Class Components&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functional Components&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Previously, &lt;strong&gt;class components&lt;/strong&gt; were the only way to create components with any functionality in &lt;strong&gt;React&lt;/strong&gt;, with the &lt;strong&gt;functional components&lt;/strong&gt; being used only as &lt;strong&gt;presentational components&lt;/strong&gt; and often being referred to as &lt;em&gt;"dumb"&lt;/em&gt; components.&lt;/p&gt;

&lt;p&gt;But, with the release of &lt;strong&gt;React 16.8&lt;/strong&gt; and the introduction of &lt;strong&gt;React Hooks&lt;/strong&gt;, &lt;strong&gt;functional components&lt;/strong&gt; can now have state &amp;amp; &lt;strong&gt;lifecycle methods&lt;/strong&gt;, making them the preferred way to create components in &lt;strong&gt;React&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Functional components&lt;/strong&gt; are much faster than &lt;strong&gt;class components&lt;/strong&gt; with less overhead &amp;amp; boilerplate code, so it's recommended to use &lt;strong&gt;functional components&lt;/strong&gt; wherever possible. However some of the &lt;strong&gt;lifecycle methods&lt;/strong&gt; are still available only in &lt;strong&gt;class components&lt;/strong&gt;, so you might need to use &lt;strong&gt;class components&lt;/strong&gt; in some niche cases like creating your custom &lt;strong&gt;error boundaries&lt;/strong&gt; (eg: using the &lt;code&gt;componentDidCatch&lt;/code&gt; &lt;strong&gt;lifecycle method&lt;/strong&gt; in &lt;strong&gt;class components&lt;/strong&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why do we need keys in React? Can we use keys without lists in React?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feio6ls71vx7aejq8mfb9.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%2Feio6ls71vx7aejq8mfb9.png" alt="keys" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Keys&lt;/code&gt; in &lt;strong&gt;React&lt;/strong&gt; are used to identify unique &lt;strong&gt;Virtual DOM Elements&lt;/strong&gt; with their corresponding data driving the &lt;strong&gt;UI&lt;/strong&gt;. Using &lt;code&gt;keys&lt;/code&gt; helps &lt;strong&gt;React&lt;/strong&gt; optimize rendering by recycling existing &lt;strong&gt;DOM elements&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Keys&lt;/code&gt; help &lt;strong&gt;React&lt;/strong&gt; identify which items have changed, are added, or are removed, enabling it to reuse already existing &lt;strong&gt;DOM elements&lt;/strong&gt;, thus providing a performance boost.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;todos&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todos&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;todo&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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 would cause new &lt;strong&gt;DOM Elements&lt;/strong&gt; to be created every time todos change, but adding the &lt;code&gt;key&lt;/code&gt; prop (ie: &lt;code&gt;&amp;lt;li key={todo.id}&amp;gt;{todo.text}&amp;lt;/li&amp;gt;&lt;/code&gt;) would result in &lt;em&gt;"dragging"&lt;/em&gt; around the &lt;strong&gt;DOM Elements&lt;/strong&gt; inside the &lt;code&gt;ul&lt;/code&gt; tag &amp;amp; updating only the necessary &lt;code&gt;li&lt;/code&gt;s&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Keys&lt;/code&gt; can be used with any element in &lt;strong&gt;React&lt;/strong&gt; &amp;amp; does not necessarily need to be used with lists, but it's most commonly used with lists to optimize rendering. Some non-standard (&amp;amp; non-recommended) use cases of &lt;code&gt;keys&lt;/code&gt; include using them to force the re-rendering of components like the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TimeNow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&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;setKey&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prevKey&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;prevKey&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="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &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;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&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;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As mentioned, code like this should definitely be avoided &amp;amp; you are better off using the state to store the time instead of the key to &lt;strong&gt;force re-rendering&lt;/strong&gt;. Using &lt;code&gt;keys&lt;/code&gt; to &lt;strong&gt;force re-rendering&lt;/strong&gt; is an anti-pattern &amp;amp; can lead to severe performance issues unless you know exactly what you are doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Difference between controlled and uncontrolled input in React
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Controlled components&lt;/strong&gt; rely on the &lt;strong&gt;React state&lt;/strong&gt; to manage the form data, while &lt;strong&gt;uncontrolled components&lt;/strong&gt; use the &lt;strong&gt;DOM&lt;/strong&gt; itself to handle form data.&lt;/p&gt;

&lt;p&gt;In most cases, &lt;strong&gt;controlled components&lt;/strong&gt; are preferred because they provide a single source of truth for the form data, making it easier to manage, validate, and submit the form data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ControlledInputForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="nx"&gt;value&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&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="nx"&gt;value&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UncontrolledInputForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&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="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Why do we need to transpile JSX code?
&lt;/h2&gt;

&lt;p&gt;Unless you hurt your head, you are NOT using &lt;strong&gt;React&lt;/strong&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;createElement&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="s2"&gt;react&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;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h1&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;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;greeting&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;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yet, this is what the browser reads - it is simply unable to understand the &lt;strong&gt;JSX syntax&lt;/strong&gt; commonly used to write &lt;strong&gt;React components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Thus we are required to use tools like &lt;strong&gt;Babel&lt;/strong&gt; to &lt;strong&gt;transpile JSX&lt;/strong&gt; to &lt;strong&gt;JavaScript&lt;/strong&gt; so that the browser can execute it. So when you write the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"greeting"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's &lt;strong&gt;transpiled&lt;/strong&gt; to the former code snippet so that the browser can interpret it &amp;amp; render the component.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. How does JSX prevent injection attacks?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujkyiyvlgp66wvjvkxfq.gif" 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%2Fujkyiyvlgp66wvjvkxfq.gif" alt="injection" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since &lt;strong&gt;JSX&lt;/strong&gt; renders content as text, any &lt;strong&gt;element&lt;/strong&gt; in user input is not treated as &lt;strong&gt;HTML&lt;/strong&gt;, just as plain text. For example, the following &lt;code&gt;script&lt;/code&gt; tag would be rendered as text and not executed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;strong&gt;NOTE&lt;/strong&gt;: You can override this behavior by using &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; but it's not recommended unless you are absolutely sure about the source of the input (&amp;amp; would strongly suggest &lt;strong&gt;sanitizing&lt;/strong&gt; the content before &lt;strong&gt;injecting&lt;/strong&gt; it).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. How can we add styling to React components?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CSS Files
&lt;/h3&gt;

&lt;p&gt;Using &lt;strong&gt;CSS&lt;/strong&gt; files is one of the most common ways to style &lt;strong&gt;React components&lt;/strong&gt;. It allows for the use of all &lt;strong&gt;CSS&lt;/strong&gt; features and is set up by default with the &lt;strong&gt;Create React App&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Button.css */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&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 jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Button.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Button.css&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;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inline CSS
&lt;/h3&gt;

&lt;p&gt;Styling &lt;strong&gt;React elements&lt;/strong&gt; using inline &lt;strong&gt;CSS&lt;/strong&gt; allows styles to be completely scoped to an element. However, certain styling features are not available with &lt;strong&gt;inline styles&lt;/strong&gt;. For example, the styling of &lt;strong&gt;pseudo-classes&lt;/strong&gt; like &lt;code&gt;:hover&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Click me
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h3&gt;
  
  
  CSS-in-JS Modules (Styled Components, Emotion, and Styled-jsx)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CSS-in-JS&lt;/strong&gt; modules are a popular option for styling &lt;strong&gt;React applications&lt;/strong&gt; because they integrate closely with &lt;strong&gt;React components&lt;/strong&gt;. For example, they allow styles to change based on &lt;strong&gt;React props&lt;/strong&gt; at runtime. Also, by default, most of these systems scope all styles to the respective component being styled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&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;styled-components&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;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;`
  background-color: blue;
  color: white;
`&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="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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS Modules
&lt;/h3&gt;

&lt;p&gt;My personal favorite styling method, &lt;strong&gt;CSS Modules&lt;/strong&gt; allow styles to be scoped to a single component. It's a great way to avoid &lt;strong&gt;class name collisions&lt;/strong&gt; (fancy term for 2 &lt;strong&gt;classes&lt;/strong&gt; ending up with the same name - quite common in a &lt;strong&gt;large scale project&lt;/strong&gt;), keep styles organized &amp;amp; add shared styles to multiple components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Button.module.css */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&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 jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Button.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&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;./Button.module.css&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;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. What are synthetic events in React?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Synthetic events&lt;/strong&gt; combine the response of different browser's native events into &lt;strong&gt;one API&lt;/strong&gt;, ensuring that the events are consistent across different browsers. The application is consistent regardless of the browser it is running in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// synthetic event&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;link clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. What is the strict mode in React?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;StrictMode /&amp;gt;&lt;/code&gt; is a component included with &lt;strong&gt;React&lt;/strong&gt; to provide additional visibility of potential issues in components. If the application is running in &lt;strong&gt;development mode&lt;/strong&gt;, any arising issue is logged to the &lt;strong&gt;development console&lt;/strong&gt;, but these warnings are not shown if the application is running in &lt;strong&gt;production mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers use &lt;code&gt;&amp;lt;StrictMode /&amp;gt;&lt;/code&gt; to find problems such as &lt;strong&gt;deprecated lifecycle methods&lt;/strong&gt; and &lt;strong&gt;legacy patterns&lt;/strong&gt;, to ensure that all &lt;strong&gt;React components&lt;/strong&gt; follow current best practices.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;StrictMode /&amp;gt;&lt;/code&gt; can be applied at any level of an application component hierarchy, which allows it to be adopted incrementally within a codebase.&lt;/p&gt;

&lt;p&gt;The docs for &lt;code&gt;&amp;lt;StrictMode /&amp;gt;&lt;/code&gt; are added below&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Strict Mode&lt;/strong&gt; enables the following development-only behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your components will &lt;a href="https://react.dev/reference/react/StrictMode#fixing-bugs-found-by-double-rendering-in-development" rel="noopener noreferrer"&gt;re-render an extra time&lt;/a&gt; to find bugs caused by impure rendering.&lt;/li&gt;
&lt;li&gt;Your components will &lt;a href="https://react.dev/reference/react/StrictMode#fixing-bugs-found-by-re-running-effects-in-development" rel="noopener noreferrer"&gt;re-run Effects an extra time&lt;/a&gt; to find bugs caused by missing Effect cleanup.&lt;/li&gt;
&lt;li&gt;Your components will &lt;a href="https://react.dev/reference/react/StrictMode#fixing-bugs-found-by-re-running-ref-callbacks-in-development" rel="noopener noreferrer"&gt;re-run refs callbacks an extra time&lt;/a&gt; to find bugs caused by missing ref cleanup.&lt;/li&gt;
&lt;li&gt;Your components will &lt;a href="https://react.dev/reference/react/StrictMode#fixing-deprecation-warnings-enabled-by-strict-mode" rel="noopener noreferrer"&gt;be checked for usage of deprecated APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  10. How to gracefully handle errors in React?
&lt;/h2&gt;

&lt;p&gt;By default, if a &lt;strong&gt;React app&lt;/strong&gt; throws an error during rendering, &lt;strong&gt;React&lt;/strong&gt; will remove its UI from the screen. To prevent this, we can wrap a part of the UI into an &lt;strong&gt;error boundary&lt;/strong&gt;, which would allow us to catch the error &amp;amp; display a &lt;strong&gt;fallback UI&lt;/strong&gt; instead of crashing the entire app.&lt;/p&gt;

&lt;p&gt;You can build your custom error boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ErrorBoundary&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&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="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;hasError&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="kd"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;getDerivedStateFromError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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 state so the next render will show the fallback UI.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;hasError&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="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// You can render any custom fallback UI, or even accept it as a prop&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FallbackComponent&lt;/span&gt; &lt;span class="p"&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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;But for most cases, you can use the &lt;code&gt;react-error-boundary&lt;/code&gt; package which provides the necessary components to handle errors in &lt;strong&gt;React applications&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;ErrorBoundary&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="s2"&gt;react-error-boundary&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="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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ErrorBoundary&lt;/span&gt; &lt;span class="na"&gt;FallbackComponent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;FallbackComponent&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MyComponent&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ErrorBoundary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. What are the rules of React Hooks?
&lt;/h2&gt;

&lt;p&gt;There are 3 main rules of &lt;strong&gt;React Hooks&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Only call hooks from React Functions&lt;/strong&gt;: &lt;strong&gt;Hooks&lt;/strong&gt; can only be called within a &lt;strong&gt;React Function Component&lt;/strong&gt; or from within another &lt;strong&gt;hook&lt;/strong&gt;. Calling &lt;strong&gt;hooks&lt;/strong&gt; within regular &lt;strong&gt;JS&lt;/strong&gt;/&lt;strong&gt;TS&lt;/strong&gt; functions will be treated as a regular function call &amp;amp; will not work as expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only call hooks at the Top Level&lt;/strong&gt;: &lt;strong&gt;Hooks&lt;/strong&gt; can only be called at the top level of a &lt;strong&gt;React Function Component&lt;/strong&gt; or a &lt;strong&gt;custom hook&lt;/strong&gt;. This is to ensure that &lt;strong&gt;hooks&lt;/strong&gt; are called in the same order each time a component renders. Using &lt;strong&gt;hooks&lt;/strong&gt; inside &lt;strong&gt;loops&lt;/strong&gt;, &lt;strong&gt;conditions&lt;/strong&gt;, or &lt;strong&gt;nested functions&lt;/strong&gt; will result in errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks must start with 'use'&lt;/strong&gt;: All &lt;strong&gt;hook&lt;/strong&gt; names (including &lt;strong&gt;custom hooks&lt;/strong&gt;) must begin with the word &lt;em&gt;"use"&lt;/em&gt;. This is to ensure that &lt;strong&gt;React&lt;/strong&gt; can identify &lt;strong&gt;hooks&lt;/strong&gt; and enforce the rules of &lt;strong&gt;hooks&lt;/strong&gt;. For example, &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, &lt;code&gt;useContext&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  12. How to handle the common lifecycle methods in React Functional Components?
&lt;/h2&gt;

&lt;p&gt;The common &lt;strong&gt;lifecycle methods&lt;/strong&gt; in &lt;strong&gt;React&lt;/strong&gt; are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;componentDidMount&lt;/code&gt;: called after the component is mounted on the &lt;strong&gt;DOM&lt;/strong&gt;. Commonly used to &lt;strong&gt;fetch data&lt;/strong&gt; or perform side effects like &lt;strong&gt;adding event listeners&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;componentDidUpdate&lt;/code&gt;: called after some specific value in the component is updated. Commonly used to &lt;strong&gt;perform side effects&lt;/strong&gt; based on the updated value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;componentWillUnmount&lt;/code&gt;: a cleanup method called before the component is unmounted from the &lt;strong&gt;DOM&lt;/strong&gt;. Commonly used to &lt;strong&gt;remove event listeners&lt;/strong&gt; or &lt;strong&gt;cancel network requests&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;strong&gt;functional components&lt;/strong&gt;, these &lt;strong&gt;lifecycle methods&lt;/strong&gt; can be handled using the &lt;code&gt;useEffect&lt;/code&gt; hook. The &lt;code&gt;useEffect&lt;/code&gt; hook takes a function as its first argument and an &lt;strong&gt;array of dependencies&lt;/strong&gt; as its second argument.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&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;// componentDidMount&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;Component mounted&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="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;// componentWillUnmount&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;Component unmounted&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;span class="c1"&gt;// empty dependency array implies this effect runs only once when the component mounts&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;// componentDidUpdate&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;Component updated&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="cm"&gt;/* dependencies - changes to these values should trigger the function to re-run */&lt;/span&gt;
      &lt;span class="cm"&gt;/* NOTE: This function will run during mount too */&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Fragment&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  13. What are refs in React?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Refs&lt;/code&gt; are variables that allow you to &lt;strong&gt;persist data between renders&lt;/strong&gt;, just like &lt;code&gt;state&lt;/code&gt; variables, but unlike &lt;code&gt;state&lt;/code&gt; variables, updating &lt;code&gt;refs&lt;/code&gt; does NOT cause the &lt;strong&gt;component to re-render&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Refs&lt;/code&gt; are usually used to (but not restricted to) store references to &lt;strong&gt;DOM elements&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Focus Input&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  14. What is prop drilling in React? How can we avoid it?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapkyczu47s6e6skbpvh2.gif" 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%2Fapkyczu47s6e6skbpvh2.gif" alt="drill" width="497" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While developing &lt;strong&gt;React applications&lt;/strong&gt;, there is often a need to pass data from a component that is higher in the hierarchy to a component that is deeply nested. &lt;strong&gt;Prop drilling&lt;/strong&gt; refers to the process of passing &lt;strong&gt;props&lt;/strong&gt; from a source component to the deeply nested component &lt;strong&gt;through all the intermediate components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The disadvantage of using &lt;strong&gt;prop drilling&lt;/strong&gt; is that the components that should otherwise be not aware of the data have access to the data, moreover, the code becomes harder to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prop drilling&lt;/strong&gt; can be avoided using the &lt;strong&gt;Context API&lt;/strong&gt; or some form of &lt;strong&gt;State Management library&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Describe some of the optimization techniques in React
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using memoization
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; is a &lt;strong&gt;React hook&lt;/strong&gt; that is used for caching &lt;strong&gt;CPU-Expensive functions&lt;/strong&gt;. A &lt;strong&gt;CPU-Expensive function&lt;/strong&gt; called repeatedly due to re-renders of a component can lead to &lt;strong&gt;severe performance issues&lt;/strong&gt; &amp;amp; &lt;strong&gt;UX degradation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;useMemo&lt;/code&gt; &lt;strong&gt;hook&lt;/strong&gt; can be used to cache the results from such functions. By using &lt;code&gt;useMemo&lt;/code&gt;, the &lt;strong&gt;CPU-Expensive function&lt;/strong&gt; gets called only when it is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lazy Loading
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt; is a technique used to reduce the &lt;strong&gt;initial load time&lt;/strong&gt; of a &lt;strong&gt;React app&lt;/strong&gt;. It helps reduce the risk of web app performances to a minimum, by loading up the components as the user navigates through the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Throttling and Debouncing
&lt;/h3&gt;

&lt;p&gt;Although this is not a &lt;strong&gt;React-specific optimization technique&lt;/strong&gt;, it is often used in &lt;strong&gt;React applications&lt;/strong&gt; to improve performance. &lt;strong&gt;Throttling&lt;/strong&gt; and &lt;strong&gt;debouncing&lt;/strong&gt; are techniques used to limit the number of times a function is called in response to an event - they are often used with inputs that provide real-time feedback to the user (eg: typing in a search field with auto-suggestions - the &lt;strong&gt;API call&lt;/strong&gt; to fetch the suggestions can be &lt;strong&gt;throttled&lt;/strong&gt; or &lt;strong&gt;debounced&lt;/strong&gt; to avoid making unnecessary &lt;strong&gt;API calls&lt;/strong&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  16. What are portals?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0clfvl398j20rumhd2g.gif" 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%2Fh0clfvl398j20rumhd2g.gif" alt="portal" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portal&lt;/strong&gt; is a recommended way to &lt;strong&gt;render children&lt;/strong&gt; into a &lt;strong&gt;DOM node&lt;/strong&gt; that exists outside the &lt;strong&gt;DOM hierarchy&lt;/strong&gt; of the parent component. It is advisable to create a new &lt;strong&gt;DOM node&lt;/strong&gt; for the &lt;strong&gt;portal&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Portal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&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;// NOTE: it is assumed that the portal root is already present in the HTML file&lt;/span&gt;
  &lt;span class="c1"&gt;//       &amp;lt;div id="portal-root" /&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;portalRoot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;portal-root&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;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createPortal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;portalRoot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  17. What is React Fiber?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Fiber&lt;/strong&gt; is a concept of &lt;strong&gt;ReactJS&lt;/strong&gt; that is used to render a system faster and smoother. It is an internal engine change aimed at making &lt;strong&gt;React&lt;/strong&gt; faster &amp;amp; somewhat &lt;em&gt;"smarter"&lt;/em&gt;. The &lt;strong&gt;Fiber reconciler&lt;/strong&gt;, which became the default &lt;strong&gt;reconciler&lt;/strong&gt; for &lt;strong&gt;React 16&lt;/strong&gt; and above, is a complete rewrite of &lt;strong&gt;React’s reconciliation algorithm&lt;/strong&gt; to solve some long-standing issues in &lt;strong&gt;React&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because &lt;strong&gt;Fiber&lt;/strong&gt; is &lt;strong&gt;asynchronous&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt; can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pause&lt;/strong&gt;, &lt;strong&gt;resume&lt;/strong&gt;, and &lt;strong&gt;restart&lt;/strong&gt; rendering work on components as new updates come in&lt;/li&gt;
&lt;li&gt;Reuse previously completed work and even &lt;strong&gt;abort&lt;/strong&gt; it if not needed&lt;/li&gt;
&lt;li&gt;Split work into &lt;strong&gt;chunks&lt;/strong&gt; and &lt;strong&gt;prioritize tasks&lt;/strong&gt; based on importance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This change allows &lt;strong&gt;React&lt;/strong&gt; to break away from the limits of the previous synchronous &lt;strong&gt;Stack Reconciler&lt;/strong&gt;, where tasks couldn’t be interrupted. This change also allows &lt;strong&gt;React&lt;/strong&gt; to fine-tune rendering components, ensuring that the most important updates happen as soon as possible.&lt;/p&gt;

&lt;p&gt;Are you scratching your head, wondering what &lt;em&gt;"reconciliation"&lt;/em&gt; is?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi575zja0xcyv6lk5mzk.gif" 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%2Fhi575zja0xcyv6lk5mzk.gif" alt="head-scratch" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't worry, we got you covered! In &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;reconciliation&lt;/strong&gt; is the core mechanism responsible for efficiently updating the &lt;strong&gt;UI&lt;/strong&gt; in response to changes in a component's state or props. It determines the minimal set of operations needed to transform the actual &lt;strong&gt;DOM&lt;/strong&gt; to match the desired state represented by the &lt;strong&gt;virtual DOM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want a list of interview questions for &lt;strong&gt;React Native&lt;/strong&gt;, stay tuned for the next article!&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>7 Tools that Make Me Productive as a Software Engineer</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 16 Mar 2025 05:54:46 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-tools-that-make-me-productive-as-a-software-engineer-4p3l</link>
      <guid>https://forem.com/ruppysuppy/7-tools-that-make-me-productive-as-a-software-engineer-4p3l</guid>
      <description>&lt;p&gt;&lt;sup&gt;&lt;em&gt;Originally published on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;software engineer&lt;/strong&gt; working at a start-up, my days are a whirlwind of &lt;strong&gt;coding&lt;/strong&gt;, &lt;strong&gt;debugging&lt;/strong&gt;, &lt;strong&gt;planning&lt;/strong&gt;, and numerous &lt;strong&gt;discussions&lt;/strong&gt; with the team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3ncgx2v35gm8vqasyd9.gif" 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%2Fe3ncgx2v35gm8vqasyd9.gif" alt="too-much-work" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this fast-paced environment, productivity isn't just a nice-to-have but an essential component for delivering &lt;strong&gt;high-quality code&lt;/strong&gt; efficiently and &lt;strong&gt;maintaining sanity&lt;/strong&gt;. Being skilled is valuable, but the right tools can amplify those skills, leading to better output for the same effort.&lt;/p&gt;

&lt;p&gt;Here are the indispensable tools I use daily that have immensely helped me boost my productivity over the years!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Calendar
&lt;/h3&gt;

&lt;p&gt;You probably didn't think I would start off with such a basic tool that everyone has on their phones, but at the end of the day, generating exceptional results doesn't require some fancy magic pill - it simply requires doing the basic mundane tasks efficiently and reliably.&lt;/p&gt;

&lt;p&gt;If you are forgetful like me, &lt;strong&gt;Google Calendar&lt;/strong&gt; is a lifesaver! Whether it's creating a meeting, a reminder, or a plan for the day, it enables you to stay on top of your tasks and ensures that missing deadlines becomes a relic of the past&lt;/p&gt;

&lt;p&gt;This is actually what my calendar looks like for &lt;strong&gt;March 2025&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpri2c6rjf14aut4n745e.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%2Fpri2c6rjf14aut4n745e.png" alt="google-calendar" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These days I find myself using &lt;strong&gt;Apple Reminders&lt;/strong&gt; a lot more than I used to though, due to the seamless integration of voice commands with &lt;strong&gt;Siri&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pomodoro
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Be Focused&lt;/strong&gt; is a time management app that uses the &lt;strong&gt;Pomodoro Technique&lt;/strong&gt; to help you stay focused and productive. It breaks down your work into &lt;strong&gt;intervals&lt;/strong&gt;, separated by &lt;strong&gt;short breaks&lt;/strong&gt;. This technique has been a game-changer in terms of productivity &amp;amp; focus and also ensures that you don't burn out by working for long hours at a stretch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqmnzxcxggre41gip4xu.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%2Fqqmnzxcxggre41gip4xu.png" alt="be-focused" width="618" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if you are not using a &lt;strong&gt;Mac&lt;/strong&gt;, you can get any &lt;strong&gt;Pomodoro timer app&lt;/strong&gt; from the internet, personal suggestions being &lt;a href="https://pomofocus.io/" rel="noopener noreferrer"&gt;Pomofocus&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Product Management Tool
&lt;/h3&gt;

&lt;p&gt;This one might be controversial - most people prefer using &lt;strong&gt;Notion&lt;/strong&gt; over &lt;strong&gt;Jira&lt;/strong&gt;, but since I started using &lt;strong&gt;Jira&lt;/strong&gt; much before &lt;strong&gt;Notion&lt;/strong&gt; became popular, I stuck to my guns&lt;/p&gt;

&lt;p&gt;Regardless whether it's integration with &lt;strong&gt;GitHub&lt;/strong&gt; and &lt;strong&gt;Slack&lt;/strong&gt;, keeping track of the sprints, or simply documenting various guidelines, &lt;strong&gt;Jira&lt;/strong&gt; has never let me down so far.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbno83brcfozfjdgrub4.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%2Fpbno83brcfozfjdgrub4.png" alt="Jira" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Notes App
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Keep&lt;/strong&gt; is a free note-taking app by &lt;strong&gt;Google&lt;/strong&gt; that helps you capture ideas, organize lists, and even set reminders. Whenever I need to jot down ideas or break down tasks, &lt;strong&gt;Google Keep&lt;/strong&gt; is my go-to tool.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  5. IDE
&lt;/h3&gt;

&lt;p&gt;Have you heard of anyone using &lt;strong&gt;Notepad&lt;/strong&gt; (on &lt;strong&gt;Windows&lt;/strong&gt;) or &lt;strong&gt;TextEdit&lt;/strong&gt; (on &lt;strong&gt;Mac&lt;/strong&gt;) for coding? Me neither!&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;IDE&lt;/strong&gt; is a developer's best friend, and &lt;strong&gt;VS Code&lt;/strong&gt; is the most popular one out there. With its vast library of extensions, themes, and &lt;strong&gt;Git integration&lt;/strong&gt;, it's a non-negotiable for any developer. The best part is that it's &lt;strong&gt;free&lt;/strong&gt; &amp;amp; &lt;strong&gt;open-source&lt;/strong&gt;, so if you feel like you need a new feature, you can always build it yourself!&lt;/p&gt;

&lt;p&gt;There are hundreds of &lt;strong&gt;IDEs&lt;/strong&gt; available on the market, but the level of customization and ease of use that &lt;strong&gt;VS Code&lt;/strong&gt; provides is unparalleled because it supports all programming languages unlike &lt;strong&gt;PyCharm&lt;/strong&gt; or &lt;strong&gt;WebStorm&lt;/strong&gt;, which are language-specific (but considered superior to &lt;strong&gt;VS Code&lt;/strong&gt; for their respective use-cases).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmevc8xrdm5vk5x44tw0o.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%2Fmevc8xrdm5vk5x44tw0o.png" alt="vs-code" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Tools
&lt;/h3&gt;

&lt;p&gt;After the hype with &lt;strong&gt;AI&lt;/strong&gt;, it should be evident by now that &lt;strong&gt;AI&lt;/strong&gt; is here to stay. As a reminder of the popular saying: &lt;em&gt;"&lt;strong&gt;AI&lt;/strong&gt; won't take your job, but someone using &lt;strong&gt;AI&lt;/strong&gt; definitely will!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Using these tools can boost your productivity multifold, whether it's generating &lt;strong&gt;code snippets&lt;/strong&gt;, &lt;strong&gt;automating repetitive tasks&lt;/strong&gt;, or even &lt;strong&gt;refactoring your codebase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My go-to tool for development is &lt;strong&gt;GitHub Copilot&lt;/strong&gt; as it's a great pair programming buddy, and comes free for &lt;strong&gt;Open Source developers&lt;/strong&gt; - I have a few contributions to &lt;strong&gt;Open Source projects&lt;/strong&gt; at &lt;strong&gt;Material UI&lt;/strong&gt;, &lt;strong&gt;Microsoft&lt;/strong&gt;, &lt;strong&gt;Amazon&lt;/strong&gt;, &lt;strong&gt;Webhint&lt;/strong&gt;, and numerous others (read: shameless self-promotion).&lt;/p&gt;

&lt;p&gt;Occasionally I also find myself using &lt;strong&gt;ChatGPT&lt;/strong&gt; for fixes &amp;amp; suggestions and &lt;strong&gt;Gemini&lt;/strong&gt; for &lt;strong&gt;image generation&lt;/strong&gt; too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx43uux3bl7okl8ti1x2z.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%2Fx43uux3bl7okl8ti1x2z.png" alt="copilot-chat" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Communication
&lt;/h3&gt;

&lt;p&gt;Professionally, &lt;strong&gt;Slack&lt;/strong&gt; is hands down the best communication tool out there. It's a great way to keep in touch with your team, have quick calls, share files, and even integrate with other tools like &lt;strong&gt;Jira&lt;/strong&gt;, &lt;strong&gt;GitHub&lt;/strong&gt;, and numerous others.&lt;/p&gt;

&lt;p&gt;Given the team I work with is spread across the globe, I find the scheduled messages feature extremely handy, as it ensures that I can send messages to my team members without annoying them in their wee hours&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are my trade secrets to turn into a &lt;strong&gt;productivity Jedi&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiq98y17cw8y6sklm0oe9.gif" 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%2Fiq98y17cw8y6sklm0oe9.gif" alt="productivity-jedi" width="498" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's help each other boost productivity! Share your favorite tools in the comments below 👇&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a heavy workload and do not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>Good Commit vs Bad Commit: The 5 Commandments of Git Bible</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 02 Mar 2025 03:30:22 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/good-commit-vs-bad-commit-the-5-commandments-of-git-bible-j4k</link>
      <guid>https://forem.com/ruppysuppy/good-commit-vs-bad-commit-the-5-commandments-of-git-bible-j4k</guid>
      <description>&lt;p&gt;&lt;sup&gt;&lt;em&gt;Originally published on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;If you are accustomed to the world of &lt;strong&gt;software development&lt;/strong&gt;, chances are you have heard of the term &lt;code&gt;Git&lt;/code&gt;. &lt;code&gt;Git&lt;/code&gt; is the de-facto &lt;strong&gt;version control system&lt;/strong&gt; - a fancy term for a tool that helps you keep track of all the changes made to a project &amp;amp; enables multiple developers to collaborate on a single project.&lt;/p&gt;

&lt;p&gt;Efficient use of &lt;code&gt;Git&lt;/code&gt; is a necessity for anyone in the realm of tech!&lt;/p&gt;

&lt;h2&gt;
  
  
  What are commits?
&lt;/h2&gt;

&lt;p&gt;One of the most commonly used features of &lt;code&gt;Git&lt;/code&gt; is the &lt;code&gt;commit&lt;/code&gt; feature, which creates &amp;amp; stores a snapshot of the project at a particular point in time, allowing users to &lt;code&gt;revert&lt;/code&gt; back to that snapshot at any point in the future. &lt;code&gt;Commits&lt;/code&gt; are usually accompanied by a message that describes the changes made in that &lt;code&gt;commit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will go through the best practices of creating a &lt;code&gt;commit&lt;/code&gt;, which will help you look like a pro to anyone checking out your projects&lt;/p&gt;

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

&lt;h2&gt;
  
  
  5 Commandments of Git Commits
&lt;/h2&gt;

&lt;p&gt;Written down in the &lt;strong&gt;Holy Git Bible&lt;/strong&gt;, these commandments are the key to creating good &lt;code&gt;commits&lt;/code&gt; &amp;amp; maintaining a clean &lt;strong&gt;git history&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thou shalt write clear, descriptive commit messages&lt;/strong&gt;: Vague messages provide little context to the &lt;code&gt;commit&lt;/code&gt; &amp;amp; end up making it difficult to keep track of the &lt;strong&gt;git history&lt;/strong&gt; - they should be avoided like the plague. Always use clear &amp;amp; descriptive messages&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="c"&gt;# Bad commit&lt;/span&gt;
 git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"minor changes"&lt;/span&gt;

 &lt;span class="c"&gt;# Good commit&lt;/span&gt;
 git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"minor UI polishes to the auth flow"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thou shalt avoid committing humongous changes&lt;/strong&gt;: Stike a balance between the number of &lt;code&gt;commits&lt;/code&gt; &amp;amp; the size of each &lt;code&gt;commit&lt;/code&gt;. A &lt;code&gt;commit&lt;/code&gt; should always be atomic &amp;amp; should NOT hold hundreds of files in most cases. Sometimes extremely rarely, would you encounter a situation where actually &lt;code&gt;commit&lt;/code&gt; hundreds of files in a single &lt;code&gt;commit&lt;/code&gt; is a good idea.&lt;/p&gt;

&lt;p&gt;One such example of an exception from my experience: one of my clients uses &lt;a href="https://classic.yarnpkg.com/lang/en/docs/cli/cache/" rel="noopener noreferrer"&gt;yarn cache&lt;/a&gt; to cache packages so that the &lt;strong&gt;CI/CD pipelines&lt;/strong&gt; don't have to download the packages every time (thus preventing reliance on &lt;strong&gt;NPM&lt;/strong&gt; &amp;amp; mitigating a point of failure for our &lt;strong&gt;pipelines&lt;/strong&gt;). But when we install new packages, the changes often span across hundreds, if not thousands of files - here adding all the changes in a single &lt;code&gt;commit&lt;/code&gt; makes sense due to the nature of the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thou shalt keep commits atomic&lt;/strong&gt;: As mentioned above, changes should be atomic &amp;amp; multiple changes should NOT be bundled, even when it's small - this adds the ease of isolating bugs, reverting changes when needed &amp;amp; making the review process much simpler!&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad commit&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix sign out not redirecting to the home page, minor UI polishes to the auth flow, add test setup for the auth flow"&lt;/span&gt;

&lt;span class="c"&gt;# Good commits&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix sign out not redirecting to the home page"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"minor UI polishes to the auth flow"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add test setup for the auth flow"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thou shalt follow a structured commit format&lt;/strong&gt;: Following a pre-defined structure for &lt;code&gt;commits&lt;/code&gt; can make the &lt;strong&gt;git history&lt;/strong&gt; look consistent &amp;amp; easy to follow. Personally, I like to follow the &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; standard, which is widely used in the industry.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad commits&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"update expo sdk"&lt;/span&gt;

&lt;span class="c"&gt;# Good commit&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore(expo): update sdk to 52.0.37"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thou shalt test before pushing changes&lt;/strong&gt;: Always test your changes locally before pushing them to the &lt;strong&gt;main branch&lt;/strong&gt;. This will prevent breaking the code &amp;amp; save you from the wrath of your team members!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Best practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use branches efficiently&lt;/strong&gt;: Create separate new &lt;code&gt;branches&lt;/code&gt; for each &lt;strong&gt;feature/bugfix&lt;/strong&gt;. Raise &lt;code&gt;PRs&lt;/code&gt; for reviews &amp;amp; merge it into the main branch after approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write clear &amp;amp; descriptive commit messages&lt;/strong&gt;: Each commit in a &lt;code&gt;PR&lt;/code&gt; should be self-explanatory on what was changed &amp;amp; build-up to the final &lt;strong&gt;feature/bugfix&lt;/strong&gt; addressed in the &lt;code&gt;PR&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strike a balance between the number of commits &amp;amp; the size of the commit&lt;/strong&gt;: Each commit should make a meaningful contribution to the scope of the &lt;code&gt;PR&lt;/code&gt;, but don't bundle all the changes in a single commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Squash commits before merging to the main branch&lt;/strong&gt;: If you are a project owner, leader, admin, or someone reviewing the code, before merging a branch in the main one, consider squashing the &lt;code&gt;commits&lt;/code&gt; from the &lt;code&gt;PR&lt;/code&gt; during the merge. This practice keeps the commit history clean and easy to follow, especially when working on a real-world project with potentially thousands of &lt;code&gt;PRs&lt;/code&gt; &amp;amp; millions of &lt;code&gt;commits&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Git Hooks to automate the process&lt;/strong&gt;: A brief overview of &lt;strong&gt;Git Hooks&lt;/strong&gt; - &lt;code&gt;Git&lt;/code&gt; can fire off custom scripts when certain actions occur, this can be used to automate the process of &lt;strong&gt;linting&lt;/strong&gt;, &lt;strong&gt;formatting&lt;/strong&gt;, &lt;strong&gt;testing&lt;/strong&gt;, and even check whether the &lt;strong&gt;commit message&lt;/strong&gt; follows a certain format. This will help you maintain the quality of the &lt;code&gt;commits&lt;/code&gt; seamlessly without requiring manual intervention. You can check out one of my older articles on how to set up &lt;a href="https://medium.com/@tapajyoti-bose/automatically-format-your-code-on-git-commit-using-husky-eslint-prettier-in-9-minutes-4dd6233f32b1" rel="noopener noreferrer"&gt;Git Hooks with Husky&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Now you are well-versed with the commandments of the &lt;strong&gt;Holy Git Bible&lt;/strong&gt; &amp;amp; would easily be able to sniff out &lt;strong&gt;bad commits&lt;/strong&gt; from miles away!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckucn9dwezzqwkrwvcdh.gif" 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%2Fckucn9dwezzqwkrwvcdh.gif" alt="sniff" width="480" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOTE: &lt;strong&gt;Git Bible&lt;/strong&gt; is a fictional book - resemblance to any real book is purely coincidental &amp;amp; unintended&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I receive. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 More JavaScript Web APIs to Build Futuristic Websites you didn't Know 🤯</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 25 Jun 2023 06:36:57 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-more-javascript-web-apis-to-build-futuristic-websites-you-didnt-know-50bg</link>
      <guid>https://forem.com/ruppysuppy/7-more-javascript-web-apis-to-build-futuristic-websites-you-didnt-know-50bg</guid>
      <description>&lt;p&gt;Welcome back to the future! This is the second article on &lt;strong&gt;futuristic JavaScript Web APIs&lt;/strong&gt;, so if you haven't read the first one, you are recommended to do so &lt;a href="https://dev.to/ruppysuppy/7-javascript-web-apis-to-build-futuristic-websites-you-didnt-know-38bc"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the 7 more &lt;strong&gt;cutting-edge JavaScript Web APIs&lt;/strong&gt; to add an enchanting touch to your projects to make users part with their money 💰&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28v8agnp8wllf311j95w.gif" 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%2F28v8agnp8wllf311j95w.gif" alt="scheming" width="498" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Web Speech
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Web Speech API&lt;/strong&gt; enables you to incorporate voice data into web apps. The &lt;strong&gt;Web Speech API&lt;/strong&gt; has two parts: &lt;code&gt;SpeechSynthesis&lt;/code&gt; (&lt;strong&gt;Text-to-Speech&lt;/strong&gt;), and &lt;code&gt;SpeechRecognition&lt;/code&gt; (&lt;strong&gt;Asynchronous Speech Recognition&lt;/strong&gt;)&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;// Speech Synthesis&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;synth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speechSynthesis&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;utterance&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;SpeechSynthesisUtterance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;synth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;utterance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Speech Recognition&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SpeechRecognition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SpeechRecognition&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webkitSpeechRecognition&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;recognition&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;SpeechRecognition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;recognition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;recognition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onresult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;speechToText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;transcript&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="nx"&gt;speechToText&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;strong&gt;NOTES&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Even though &lt;strong&gt;Speech Synthesis&lt;/strong&gt; is supported by all major browsers with &lt;strong&gt;96% coverage&lt;/strong&gt;, &lt;strong&gt;Speech Recognition&lt;/strong&gt; is still a bit early to use in production with only &lt;strong&gt;86% coverage&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;API&lt;/strong&gt; CANNOT be used without the user interaction (eg: &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;keypress&lt;/code&gt;, etc).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Page Visibility
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Page Visibility API&lt;/strong&gt; allows you to check if the page is visible to the user or not. This is useful when you want to pause a video.&lt;/p&gt;

&lt;p&gt;There are 2 methods to perform this check:&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;// Method 1&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;visibilitychange&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visibilityState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;visible&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Visible&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="p"&gt;;&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="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not Visible&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="c1"&gt;// Method 2&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blur&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="o"&gt;=&amp;gt;&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="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not Visible&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;focus&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="o"&gt;=&amp;gt;&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="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Visible&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference between the two methods is that the second one will be triggered if you &lt;strong&gt;switch over to another app OR a different tab&lt;/strong&gt;, while the first one will be triggered &lt;strong&gt;only if you switch over to another tab&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Accelerometer
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Accelerometer API&lt;/strong&gt; allows you to access the &lt;strong&gt;acceleration data&lt;/strong&gt; from the device.&lt;/p&gt;

&lt;p&gt;This can be used to create games that use the &lt;strong&gt;device's motion control&lt;/strong&gt; or &lt;strong&gt;add interaction if the user shakes the device&lt;/strong&gt;, the possibilities are endless!&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;acl&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;Accelerometer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;frequency&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="nx"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reading&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="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;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;acl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;z&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;magnitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&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;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;v&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;magnitude&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;THRESHOLD&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;I feel dizzy!&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;acl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can ask for &lt;strong&gt;Accelerometer&lt;/strong&gt; permission using:&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="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&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="s2"&gt;accelerometer&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;result&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&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="c1"&gt;// now you can use accelerometer api&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Geo-location
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Geolocation API&lt;/strong&gt; allows you to access the user's location.&lt;/p&gt;

&lt;p&gt;This can be extremely useful if you are building anything related to &lt;strong&gt;maps&lt;/strong&gt; or &lt;strong&gt;location-based services&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;coords&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="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&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;You can ask for &lt;strong&gt;Geolocation&lt;/strong&gt; permission using:&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="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&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="s2"&gt;geolocation&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;result&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&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="c1"&gt;// now you can use geolocation api&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Web worker
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Web Workers&lt;/strong&gt; makes it possible to run a script operation in a background thread separate from the main execution thread of a web application. The advantage of this is that laborious processing can be performed in a separate thread, allowing the main (usually the &lt;strong&gt;UI&lt;/strong&gt;) thread to run without being blocked/slowed down.&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;// main.js&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="s2"&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="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;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="nx"&gt;e&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="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="mi"&gt;5&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="c1"&gt;// worker.js&lt;/span&gt;
&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&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="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Resize Observer
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Resize Observer API&lt;/strong&gt; allows you to observe the size of an element and handle the changes with ease.&lt;/p&gt;

&lt;p&gt;It is exceptionally useful when you have a &lt;strong&gt;resizable sidebar&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sidebar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.sidebar&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;observer&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;ResizeObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&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;sidebar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;entries&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;//Do something with the element's new dimensions&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Notification
&lt;/h2&gt;

&lt;p&gt;Ah, &lt;strong&gt;Notifications&lt;/strong&gt;! The &lt;strong&gt;annoying little popups&lt;/strong&gt; (or &lt;strong&gt;bubbles of dopamine&lt;/strong&gt;, based on where you lie on the spectrum).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Notification API&lt;/strong&gt;, just as the name suggests, allows you to send notifications to annoy users (bundle it with the &lt;strong&gt;Page Visibility API&lt;/strong&gt; to annoy them even more 😈)&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;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestPermission&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;permission&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hi there!&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;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Notification body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://tapajyoti-bose.vercel.app/img/logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Side Note
&lt;/h2&gt;

&lt;p&gt;Some of the &lt;strong&gt;APIs&lt;/strong&gt; mentioned above are still in the experimental stage and are not supported by all browsers. So, if you want to use them in production, you should check if the browser supports them&lt;/p&gt;

&lt;p&gt;For example:&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SpeechRecognition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webkitSpeechRecognition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Speech Recognition is supported&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I get. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>html</category>
    </item>
    <item>
      <title>7 Free Lifesaver Image Tools Every Frontend Developer Must Have In Their Arsenal 🛠️🚀</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 11 Jun 2023 06:37:40 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-free-lifesaver-image-tools-every-frontend-developer-must-have-in-their-arsenal-43n</link>
      <guid>https://forem.com/ruppysuppy/7-free-lifesaver-image-tools-every-frontend-developer-must-have-in-their-arsenal-43n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Images&lt;/strong&gt; are an integral part of every &lt;strong&gt;frontend developer&lt;/strong&gt;'s journey, shaping captivating digital experiences.&lt;/p&gt;

&lt;p&gt;To conquer the challenges of working with &lt;strong&gt;images&lt;/strong&gt;, here are 7 &lt;strong&gt;Lifesaver Tools&lt;/strong&gt; tailored for your needs: from &lt;strong&gt;optimizing&lt;/strong&gt; and &lt;strong&gt;resizing&lt;/strong&gt; to &lt;strong&gt;background removal&lt;/strong&gt; and finding &lt;strong&gt;royalty-free images&lt;/strong&gt;, these tools will empower you to create &lt;strong&gt;stunning visuals effortlessly&lt;/strong&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Online Photoshop web client:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.photopea.com/" rel="noopener noreferrer"&gt;Photopea&lt;/a&gt; is a &lt;strong&gt;powerful online image editing tool&lt;/strong&gt; that brings the functionalities of &lt;strong&gt;Adobe Photoshop&lt;/strong&gt; right to your web browser, that too for free!&lt;/p&gt;

&lt;p&gt;So forget setting up &lt;strong&gt;Photoshop&lt;/strong&gt; on your machine and start editing &lt;strong&gt;images&lt;/strong&gt; right away!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbq67qb3qynhgyb5msfh.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%2Fvbq67qb3qynhgyb5msfh.png" alt="photopea" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Royalty free images
&lt;/h2&gt;

&lt;p&gt;Finding &lt;strong&gt;high-quality, royalty-free images&lt;/strong&gt; is a constant challenge for frontend developers.&lt;/p&gt;

&lt;p&gt;If you are looking for resources that provide a vast collection of &lt;strong&gt;images&lt;/strong&gt; that can be used in &lt;strong&gt;web projects&lt;/strong&gt; without the need for &lt;strong&gt;complex licensing agreements&lt;/strong&gt; or &lt;strong&gt;costly fees&lt;/strong&gt;, here are my go-to ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt; for &lt;strong&gt;nature and landscape images&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freepik.com/" rel="noopener noreferrer"&gt;Freepik&lt;/a&gt; for &lt;strong&gt;illustrations &amp;amp; facial expressions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ob987gw4hv2rnr7tfm0.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%2F7ob987gw4hv2rnr7tfm0.png" alt="unsplash" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Responsive image generator
&lt;/h2&gt;

&lt;p&gt;Now that you have an &lt;strong&gt;image&lt;/strong&gt;, you would want to optimize it for different devices.&lt;/p&gt;

&lt;p&gt;In today's &lt;strong&gt;multi-device&lt;/strong&gt; landscape, &lt;strong&gt;responsive design&lt;/strong&gt; is crucial for &lt;strong&gt;frontend developers&lt;/strong&gt; as all apps want to save &lt;strong&gt;bandwidth&lt;/strong&gt; without compromising on the &lt;strong&gt;user experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://responsivebreakpoints.com/" rel="noopener noreferrer"&gt;Responsive Breakpoints&lt;/a&gt; addresses the need for &lt;strong&gt;device-optimized images&lt;/strong&gt; effortlessly.&lt;/p&gt;

&lt;p&gt;By automatically generating multiple versions of an &lt;strong&gt;image&lt;/strong&gt; in different sizes, &lt;strong&gt;frontend developers&lt;/strong&gt; can ensure that their websites or applications look stunning and load quickly on all devices without having to set up services like &lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary&lt;/a&gt; or &lt;a href="https://imagekit.io/" rel="noopener noreferrer"&gt;Imagekit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bdumqshnt8hkojhi99g.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%2F4bdumqshnt8hkojhi99g.png" alt="responsive-breakpoints" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Background generator
&lt;/h2&gt;

&lt;p&gt;Creating visually captivating backgrounds can elevate the overall look and feel of a website or application.&lt;/p&gt;

&lt;p&gt;Background generation tools, like &lt;a href="https://bgjar.com/" rel="noopener noreferrer"&gt;Bg-jar&lt;/a&gt; and &lt;a href="https://heropatterns.com/" rel="noopener noreferrer"&gt;Hero Patterns&lt;/a&gt;, simplify the process of designing &lt;strong&gt;unique&lt;/strong&gt; and &lt;strong&gt;eye-catching backgrounds&lt;/strong&gt; that &lt;strong&gt;suit their project's aesthetic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkx8aovelqkr86dknuqld.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%2Fkx8aovelqkr86dknuqld.png" alt="bg-jar" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Background remover
&lt;/h2&gt;

&lt;p&gt;While backgrounds can make or break the &lt;strong&gt;visual appeal&lt;/strong&gt; of an &lt;strong&gt;image&lt;/strong&gt;, sometimes you just need to remove them altogether.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.remove.bg/" rel="noopener noreferrer"&gt;Remove Bg&lt;/a&gt; comes to the rescue, allowing &lt;strong&gt;frontend developers&lt;/strong&gt; to effortlessly kiss the &lt;strong&gt;"background drama"&lt;/strong&gt; goodbye with a few simple clicks.&lt;/p&gt;

&lt;p&gt;Whether you want to create a &lt;strong&gt;clean&lt;/strong&gt; and &lt;strong&gt;professional product shot&lt;/strong&gt; or &lt;strong&gt;superimpose an object&lt;/strong&gt; onto a different background, this tool is the way to go!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizx7yvvi80r1fqa80ab8.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%2Fizx7yvvi80r1fqa80ab8.png" alt="remove-bg" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Image converter
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://convertio.co/jpg-webp/" rel="noopener noreferrer"&gt;Convertio&lt;/a&gt; is hands down the &lt;strong&gt;best convertor tool I encountered&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With support for &lt;strong&gt;300+ formats&lt;/strong&gt;, it makes converting not only &lt;strong&gt;images&lt;/strong&gt; but also &lt;strong&gt;audio&lt;/strong&gt;, &lt;strong&gt;video&lt;/strong&gt;, &lt;strong&gt;documents&lt;/strong&gt;, and more a breeze.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpa7nenptbfdgiij7o3us.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%2Fpa7nenptbfdgiij7o3us.png" alt="convertio" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. SVG tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scalable Vector Graphics (SVG)&lt;/strong&gt; play a vital role in modern &lt;strong&gt;web design&lt;/strong&gt;, offering &lt;strong&gt;flexibility&lt;/strong&gt; and &lt;strong&gt;resolution independence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tools that I love using are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://haikei.app/" rel="noopener noreferrer"&gt;Haikei&lt;/a&gt; for &lt;strong&gt;creating common SVG shapes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jakearchibald.github.io/svgomg/" rel="noopener noreferrer"&gt;SVGOMG&lt;/a&gt; for &lt;strong&gt;optimizing SVG&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuiep7ezj47xn7i6zl5gf.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%2Fuiep7ezj47xn7i6zl5gf.png" alt="haikei" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I get. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>ux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>7 VS Code Tricks you should Definitely Know 😍</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 28 May 2023 06:25:48 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-vs-code-tricks-you-should-definitely-know-54pi</link>
      <guid>https://forem.com/ruppysuppy/7-vs-code-tricks-you-should-definitely-know-54pi</guid>
      <description>&lt;p&gt;Want to be a &lt;strong&gt;VS Code&lt;/strong&gt; Pro?&lt;/p&gt;

&lt;p&gt;Here are 7 &lt;strong&gt;VS Code&lt;/strong&gt; Tricks you should Definitely Know, which will undoubtedly take your productivity to the Moon 🚀🌕!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffflb4w1sv3mavt8i76im.gif" 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%2Ffflb4w1sv3mavt8i76im.gif" alt="lets-go" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Sticky Scroll
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55orqstjb9vxpfg9ly4h.gif" 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%2F55orqstjb9vxpfg9ly4h.gif" alt="sticky-scroll" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you often get lost while scrolling through a long file?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Sticky Scroll&lt;/code&gt; to the rescue! It shows you the &lt;strong&gt;functions&lt;/strong&gt;/&lt;strong&gt;class&lt;/strong&gt; you are in at the top of the screen, so you never get lost again!&lt;/p&gt;

&lt;p&gt;You can enable it by going to &lt;code&gt;Settings&lt;/code&gt; and searching for &lt;code&gt;Sticky Scroll&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2chuwhqz3r39b7n63ex0.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%2F2chuwhqz3r39b7n63ex0.png" alt="sticky-scroll-settings" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or if are a nerd at heart, add the following to your &lt;code&gt;settings.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"editor.stickySrcoll.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Command Palette
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6kjzu0my4xsihvdfa4s.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%2Fm6kjzu0my4xsihvdfa4s.png" alt="command-palette" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Need to execute a command fast? &lt;code&gt;Command Palette&lt;/code&gt; is there to help!&lt;/p&gt;

&lt;p&gt;Just use the &lt;strong&gt;shortcut&lt;/strong&gt; &amp;amp; select the command you need&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Windows: &lt;code&gt;Ctrl + Shift + P&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mac: &lt;code&gt;Cmd + Shift + P&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Custom Snippets
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fia9cfbcak0hsvyssftvi.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%2Fia9cfbcak0hsvyssftvi.png" alt="custom-snippets" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find yourself &lt;strong&gt;rewriting&lt;/strong&gt; the same code over and over and yet over again? With &lt;code&gt;Custom Snippets&lt;/code&gt; you can automate that!&lt;/p&gt;

&lt;p&gt;There are dedicated articles on how to write your own &lt;strong&gt;snippets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can find them here: &lt;a href="https://dev.to/ruppysuppy/how-pros-automate-repetitive-code-using-vs-code-53b"&gt;https://dev.to/ruppysuppy/how-pros-automate-repetitive-code-using-vs-code-53b&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. File Finder
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv81fogoghiu5796260sp.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%2Fv81fogoghiu5796260sp.png" alt="file-finder" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like the &lt;code&gt;Command Palette&lt;/code&gt;, &lt;code&gt;Go to File&lt;/code&gt; is a handy feature to quickly open a file.&lt;/p&gt;

&lt;p&gt;Here are the &lt;strong&gt;shortcuts&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Windows: &lt;code&gt;Ctrl + P&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mac: &lt;code&gt;Cmd + P&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. Insider Version
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff38gjso7qwukpt5o8sim.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%2Ff38gjso7qwukpt5o8sim.png" alt="insider-version" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you know you can try out the latest features of &lt;strong&gt;VS Code&lt;/strong&gt; before they are released?&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Insiders version&lt;/strong&gt; is updated every day with the latest features, and you can download it from here: &lt;a href="https://code.visualstudio.com/insiders/" rel="noopener noreferrer"&gt;https://code.visualstudio.com/insiders/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Go to Symbol
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdca7w9wvidumhbkqr10.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%2Fsdca7w9wvidumhbkqr10.png" alt="go-to-symbol" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Go to Symbol&lt;/code&gt; is another handy feature to quickly jump to a &lt;strong&gt;function&lt;/strong&gt;/&lt;strong&gt;class&lt;/strong&gt; in a file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Windows: &lt;code&gt;Ctrl + Shift + O&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mac: &lt;code&gt;Cmd + Shift + O&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7. Check out file changes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jifwn0p477n0hnl9561.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%2F8jifwn0p477n0hnl9561.png" alt="file-changes" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default &lt;strong&gt;VS Code&lt;/strong&gt; ships with a &lt;strong&gt;timeline&lt;/strong&gt; feature, which shows you all the changes you have made to a file.&lt;/p&gt;

&lt;p&gt;No more scrambling through &lt;code&gt;git&lt;/code&gt; &lt;strong&gt;logs&lt;/strong&gt; to find out what was changed!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I get. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>vscode</category>
      <category>json</category>
    </item>
    <item>
      <title>7 Secret TypeScript Tricks Pros Use 😎🤫</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 14 May 2023 06:15:36 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/7-secret-typescript-tricks-pros-use-3ckg</link>
      <guid>https://forem.com/ruppysuppy/7-secret-typescript-tricks-pros-use-3ckg</guid>
      <description>&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; is an outstanding tool to make our lives easier &amp;amp; avoiding &lt;strong&gt;bugs&lt;/strong&gt;, yet sometimes feels overwhelming to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr4etox7q6ywsru1v1lu.gif" 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%2Fzr4etox7q6ywsru1v1lu.gif" alt="overwhelm" width="480" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article outlines 7 &lt;strong&gt;TypeScript&lt;/strong&gt; tricks that will make your life easier which all pros use.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Type Inference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt; is smart enough to &lt;strong&gt;infer the data types&lt;/strong&gt; when you help it narrow them down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;IncrementBy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INCREMENT_BY&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IncrementAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IncrementByAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IncrementBy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CounterAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;IncrementAction&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;IncrementByAction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CounterAction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;// TS infers that the action is IncrementAction&lt;/span&gt;
      &lt;span class="c1"&gt;// &amp;amp; has no payload&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&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="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;CounterActionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IncrementBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;// TS infers that the action is IncrementByAction&lt;/span&gt;
      &lt;span class="c1"&gt;// &amp;amp; has a number as a payload&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;default&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;state&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;As shown above, &lt;strong&gt;TypeScript&lt;/strong&gt; infers the type of the action based on the &lt;code&gt;type&lt;/code&gt; property, so you DON'T need to check whether &lt;code&gt;payload&lt;/code&gt; exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Literal Types
&lt;/h2&gt;

&lt;p&gt;Often you need specific values for a variable, that's where &lt;strong&gt;literal types&lt;/strong&gt; come in handy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works for numbers too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&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;// or better yet:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reviewMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;terrible&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;average&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;good&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;great&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;incredible&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// This will generate the same type as above,&lt;/span&gt;
&lt;span class="c1"&gt;// but it's much more maintainable&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;reviewMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;reviewMap&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Type Guards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type guards&lt;/strong&gt; are another method to narrow down the type of a variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kr"&gt;number&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;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// validation logic&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The age must be a number&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;NOTE: In the example above, it's better to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example was a simplification to show how &lt;strong&gt;type guards&lt;/strong&gt; work.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Index Signature
&lt;/h2&gt;

&lt;p&gt;When you have &lt;strong&gt;dynamic keys&lt;/strong&gt; in an object, you can use an &lt;strong&gt;index signature&lt;/strong&gt; to define its type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Joined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JOINED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LEFT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Pending&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PENDING&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ParticipantData&lt;/span&gt; &lt;span class="p"&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&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;participants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ParticipantData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Joined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;id3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaticipationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Pending&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Generics
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Generics&lt;/strong&gt; are a powerful tool to make your code more reusable. It allows you to &lt;strong&gt;define a type that will be determined by the use of your function&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the following example, &lt;code&gt;T&lt;/code&gt; is a Generic type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&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;object&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&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="na"&gt;clonedObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&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;clonedObject&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;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;a&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;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;c&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="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;obj2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Immutable Types
&lt;/h2&gt;

&lt;p&gt;You can make your types &lt;strong&gt;immutable&lt;/strong&gt; by adding &lt;code&gt;as const&lt;/code&gt;. This ensures that you don't end up accidentally changing the values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ErrorMessages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;InvalidEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;InvalidPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid password&lt;/span&gt;&lt;span class="dl"&gt;"&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;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// This will throw an error&lt;/span&gt;
&lt;span class="nx"&gt;ErrorMessages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InvalidEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;New error 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;h2&gt;
  
  
  7. Partial, Pick, Omit &amp;amp; Required Types
&lt;/h2&gt;

&lt;p&gt;Often while working with &lt;strong&gt;server&lt;/strong&gt; &amp;amp; &lt;strong&gt;local data&lt;/strong&gt;, you need to make some properties &lt;strong&gt;optional&lt;/strong&gt; or &lt;strong&gt;required&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of defining hundreds of interfaces with slightly altered versions of the same data. You can do that using &lt;code&gt;Partial&lt;/code&gt;, &lt;code&gt;Pick&lt;/code&gt;, &lt;code&gt;Omit&lt;/code&gt; &amp;amp; &lt;code&gt;Required&lt;/code&gt; types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PartialUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&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="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PickUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&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="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="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&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;type&lt;/span&gt; &lt;span class="nx"&gt;OmitUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Omit&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&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;type&lt;/span&gt; &lt;span class="nx"&gt;RequiredUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Required&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="c1"&gt;// PartialUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface PartialUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name?: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age?: number;&lt;/span&gt;
&lt;span class="c1"&gt;//   email?: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// PickUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface PickUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age?: number;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// OmitUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface OmitUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   email: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="c1"&gt;// RequiredUser is equivalent to:&lt;/span&gt;
&lt;span class="c1"&gt;// interface RequiredUser {&lt;/span&gt;
&lt;span class="c1"&gt;//   name: string;&lt;/span&gt;
&lt;span class="c1"&gt;//   age: number;&lt;/span&gt;
&lt;span class="c1"&gt;//   email: string;&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course, you can use &lt;strong&gt;intersection&lt;/strong&gt; to combine them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;B&lt;/code&gt; &amp;amp; &lt;code&gt;C&lt;/code&gt; are any types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all folks! 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Resources used
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.freepik.com/free-photo/positive-young-woman-sunglasses_5980887.htm" rel="noopener noreferrer"&gt;Freepik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://giphy.com/gifs/hyperxgaming-what-hyperx-rain-man-d8isjk1UBPFTm0EBbd" rel="noopener noreferrer"&gt;Giphy&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I get. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What I learned from 2 years of freelancing 🤫💰</title>
      <dc:creator>Tapajyoti Bose</dc:creator>
      <pubDate>Sun, 30 Apr 2023 01:52:46 +0000</pubDate>
      <link>https://forem.com/ruppysuppy/what-i-learned-from-2-years-of-freelancing-44h8</link>
      <guid>https://forem.com/ruppysuppy/what-i-learned-from-2-years-of-freelancing-44h8</guid>
      <description>&lt;p&gt;Ah &lt;strong&gt;freelancing&lt;/strong&gt;, the dream of working from &lt;strong&gt;anywhere in the world&lt;/strong&gt;, &lt;strong&gt;being your own boss&lt;/strong&gt;, and &lt;strong&gt;making a ton of money&lt;/strong&gt;. It's a life numerous people dream of. I started &lt;strong&gt;freelancing&lt;/strong&gt; in May 2021 &amp;amp; never looked back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F821apd5pwcsjse8ui3pz.gif" 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%2F821apd5pwcsjse8ui3pz.gif" alt="happy-dance" width="498" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In one year, I became one of the &lt;strong&gt;top 3% of freelancers&lt;/strong&gt; on the planet (as a &lt;strong&gt;Top Rated Plus Freelancer&lt;/strong&gt; on &lt;strong&gt;Upwork&lt;/strong&gt;) &amp;amp; I have already gone through the highest of highs &amp;amp; lowest of lows of &lt;strong&gt;freelancing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's discuss some of the pros &amp;amp; cons of &lt;strong&gt;freelancing&lt;/strong&gt; I found out the hard way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;p&gt;Let's start off with the mindblowing pros that come with &lt;strong&gt;freelancing&lt;/strong&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Money, money &amp;amp; some more money
&lt;/h3&gt;

&lt;p&gt;If you DON'T reside in one of the &lt;strong&gt;developed countries&lt;/strong&gt;, you are in for an incredible surprise my friend, as you can make a ton of money relatively easily by &lt;strong&gt;freelancing&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Of course, you &lt;strong&gt;need to have the skills to justify what you charge&lt;/strong&gt;, but due to &lt;strong&gt;geographical arbitrage&lt;/strong&gt; (a fancy term for &lt;strong&gt;earning in a strong currency&lt;/strong&gt; &amp;amp; &lt;strong&gt;spending in a weak currency&lt;/strong&gt;), you can make a lot of money.&lt;/p&gt;

&lt;p&gt;Earning &lt;strong&gt;$60/hour&lt;/strong&gt; might be classified as poor in &lt;strong&gt;New York, US&lt;/strong&gt;, but in &lt;strong&gt;India&lt;/strong&gt;, it's mind-numbing money &amp;amp; can easily land you in the &lt;strong&gt;top 0.1% earners&lt;/strong&gt; in the country.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjf2ao6ifnd5ftcdlyjdq.gif" 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%2Fjf2ao6ifnd5ftcdlyjdq.gif" alt="money-shower" width="498" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Freedom to work from anywhere
&lt;/h3&gt;

&lt;p&gt;There is &lt;strong&gt;unparallel freedom&lt;/strong&gt; in working as a &lt;strong&gt;freelancer&lt;/strong&gt;: you are &lt;strong&gt;not bound at any particular location&lt;/strong&gt; while working. All you need is a &lt;strong&gt;laptop&lt;/strong&gt; &amp;amp; an &lt;strong&gt;internet connection&lt;/strong&gt; and you are golden.&lt;/p&gt;

&lt;p&gt;As long as you can &lt;strong&gt;deliver quality work on time&lt;/strong&gt;, nobody cares where you work.&lt;/p&gt;

&lt;p&gt;So the next time you feel bored, you can pack your bags &amp;amp; head to &lt;strong&gt;Bali&lt;/strong&gt; for &lt;strong&gt;thrills with minimal bills&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97cva6j1xrhscrkhpiny.jpeg" 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%2F97cva6j1xrhscrkhpiny.jpeg" alt="bali" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Freedom to work any time
&lt;/h3&gt;

&lt;p&gt;As a cherry on top of the &lt;strong&gt;location freedom&lt;/strong&gt;, you also have &lt;strong&gt;time freedom&lt;/strong&gt;: you get to &lt;strong&gt;choose when you work&lt;/strong&gt; &amp;amp; &lt;strong&gt;how long you work&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Most clients would allow you to &lt;strong&gt;work according to your schedule&lt;/strong&gt; as long as you deliver.&lt;/p&gt;

&lt;p&gt;Regardless of whether you are a part of the &lt;strong&gt;5 AM club&lt;/strong&gt; or the &lt;strong&gt;5 PM club&lt;/strong&gt;, there is always something for you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;p&gt;Getting started with &lt;strong&gt;freelancing&lt;/strong&gt; already? Hold your horses!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbypt6sdke9m5oe5axyak.gif" 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%2Fbypt6sdke9m5oe5axyak.gif" alt="hold-your-horses" width="400" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is NOT all rainbows and sunshine. Let's now explore the cons that come with &lt;strong&gt;freelancing&lt;/strong&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. With great money comes great responsibility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Financial Education&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most important &lt;strong&gt;life skill&lt;/strong&gt;, which is taught in no school.&lt;/p&gt;

&lt;p&gt;For example, since you don't have a company to replace your work laptop when it's damaged, you need to be prepared for such &lt;strong&gt;unforeseen expenses&lt;/strong&gt;, as NOT replacing a malfunctioning laptop can potentially take you out of business.&lt;/p&gt;

&lt;p&gt;Even though such expenses are expected to be rare, you never know when they would hit &amp;amp; can put a &lt;strong&gt;significant dent in your finances&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taxes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules of money&lt;/strong&gt; change when you cross a specific threshold as a business owner. While the threshold varies from country to country, in &lt;strong&gt;India&lt;/strong&gt; it is &lt;strong&gt;₹20L&lt;/strong&gt; (&lt;strong&gt;₹2M&lt;/strong&gt;) &amp;amp; again at &lt;strong&gt;₹50L&lt;/strong&gt; (&lt;strong&gt;₹5M&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Assuming you are NOT working as a professional &lt;strong&gt;Chartered Accountant&lt;/strong&gt; or &lt;strong&gt;Tax Attorney&lt;/strong&gt;, you will need to hire one to help you out with your taxes.&lt;/p&gt;

&lt;p&gt;The last thing you want is being &lt;strong&gt;slapped with a huge tax bill&lt;/strong&gt; at the end of the year, just because you didn't know how to do it correctly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuufh9jwkp8z8rjgfiu4z.gif" 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%2Fuufh9jwkp8z8rjgfiu4z.gif" alt="slap" width="498" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You trade one boss for a platoon of bosses
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Being your own boss is a myth&lt;/strong&gt;. It is true that as a &lt;strong&gt;freelancer&lt;/strong&gt;, you DO NOT have one single boss, but you are &lt;strong&gt;answerable to each and every one of your clients&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When things go south, there is NO ONE &lt;strong&gt;holding your hand through the mess&lt;/strong&gt;. Mostly, you are expected to figure it out &amp;amp; come up with a solution on your own, which can be a tad overwhelming at times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgnhn4bws6b3bskz4o5hx.gif" 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%2Fgnhn4bws6b3bskz4o5hx.gif" alt="angry-client" width="498" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Office life gives you FOMO
&lt;/h3&gt;

&lt;p&gt;This might be my personal experience, but never having worked at an office, I feel like I am &lt;strong&gt;missing out on meeting people&lt;/strong&gt;, &lt;strong&gt;making friends&lt;/strong&gt;, and &lt;strong&gt;attending corporate events&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;freelancer&lt;/strong&gt;, you have to &lt;strong&gt;create your own opportunities to socialize&lt;/strong&gt;, regardless of whether you work at a co-working place or talk to random strangers on the street (which is quite unwelcome in quite a few pockets of the world).&lt;/p&gt;

&lt;p&gt;You might be thinking, I am an &lt;strong&gt;introvert&lt;/strong&gt; &amp;amp; don't care about &lt;strong&gt;socializing&lt;/strong&gt;, but the 2020 pandemic must have shown you even if you identify yourself as one, you still &lt;strong&gt;need to interact with people to remain sane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even if you are offered multiple job opportunities, you can't take them on as they &lt;strong&gt;do not make sense from a financial perspective&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;So now we are down to the big question: &lt;strong&gt;should you freelance&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Well, even though my experience was mostly positive, I would encourage you to weigh the pros &amp;amp; cons and test out the &lt;strong&gt;freelancing&lt;/strong&gt; waters.&lt;/p&gt;

&lt;p&gt;One big caveat of &lt;strong&gt;freelancing&lt;/strong&gt; is you absolutely must have a monetizable skill! Unless you can solve someone else's woes, nobody is going to pay you.&lt;/p&gt;

&lt;p&gt;With that said, I wish you the best of luck if you want to try &lt;strong&gt;freelancing&lt;/strong&gt;!!!&lt;/p&gt;

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

&lt;p&gt;Have you ever tried &lt;strong&gt;freelancing&lt;/strong&gt; before? Or are you planning to get started? Let me know in the comments below!&lt;/p&gt;

&lt;h1&gt;
  
  
  Thanks for reading
&lt;/h1&gt;

&lt;p&gt;Need a &lt;strong&gt;Top Rated Software Development Freelancer&lt;/strong&gt; to chop away your development woes? Contact me on &lt;a href="https://www.upwork.com/o/profiles/users/~01c12e516ee1d35044/" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to see what I am working on? Check out my &lt;a href="https://tapajyoti-bose.vercel.app" rel="noopener noreferrer"&gt;Personal Website&lt;/a&gt; and &lt;a href="https://github.com/ruppysuppy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect? Reach out to me on &lt;a href="https://www.linkedin.com/in/tapajyoti-bose/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow my blogs for &lt;strong&gt;bi-weekly new Tidbits&lt;/strong&gt; on &lt;a href="https://tapajyoti-bose.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are a few commonly asked questions I get. So, I hope this &lt;strong&gt;FAQ&lt;/strong&gt; section solves your issues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I am a beginner, how should I learn Front-End Web Dev?&lt;/strong&gt;&lt;br&gt;
Look into the following articles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/61-frontend-web-development-buzz-words-every-developer-should-have-in-their-vocabulary-8054e484875" rel="noopener noreferrer"&gt;Front End Buzz words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/front-end-developer-roadmap-zero-to-hero-4pkf"&gt;Front End Development Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ruppysuppy/5-projects-to-master-front-end-development-57p"&gt;Front End Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tapajyoti-bose.medium.com/7-tips-to-transition-from-a-beginner-to-an-intermediate-frontend-developer-dd58855724e2" rel="noopener noreferrer"&gt;Transition from a Beginner to an Intermediate Frontend Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you mentor me?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sorry, I am already under a lot of workload and would not have the time to mentor anyone.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>productivity</category>
      <category>motivation</category>
    </item>
  </channel>
</rss>
