<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Naveen prasad</title>
    <description>The latest articles on DEV Community by Naveen prasad (@frontendbytes).</description>
    <link>https://dev.to/frontendbytes</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%2F2214927%2Fd897eea9-aba2-47bc-9dbb-55f21c613be2.png</url>
      <title>DEV Community: Naveen prasad</title>
      <link>https://dev.to/frontendbytes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frontendbytes"/>
    <language>en</language>
    <item>
      <title>Frontend Reviews: 13 Mistakes I See in Every PR (And How to Avoid Them)</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Wed, 18 Jun 2025 17:53:06 +0000</pubDate>
      <link>https://dev.to/frontendbytes/frontend-reviews-13-mistakes-i-see-in-every-pr-and-how-to-avoid-them-g00</link>
      <guid>https://dev.to/frontendbytes/frontend-reviews-13-mistakes-i-see-in-every-pr-and-how-to-avoid-them-g00</guid>
      <description>&lt;p&gt;After reviewing hundreds of PRs over the last few years, especially working in fast-paced startup environments, I’ve noticed some frontend mistakes repeat &lt;em&gt;over and over&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Some of these seem harmless at first but often pile up into frustrating tech debt later.&lt;/p&gt;

&lt;p&gt;Here are &lt;strong&gt;13 mistakes I’ve repeatedly seen in frontend pull requests—and how you can avoid them&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ Keeping Large Arrays/Objects in Global Constants
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Storing large arrays or objects in global constant files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚫 Why It’s Bad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Even if unused, they stay in memory because of their global scope. The garbage collector won’t help you here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create &lt;strong&gt;wrapper functions&lt;/strong&gt; that return these values only &lt;strong&gt;when needed&lt;/strong&gt;. This ensures they’re created when required, freeing memory otherwise.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Duplication of Assets (SVGs, Images, HOCs)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adding new SVGs or images wherever needed → over time duplicates sneak in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Maintain a &lt;strong&gt;centralized asset or icon library&lt;/strong&gt; for media and common components. Also, for recurring logic (like showing loaders), build &lt;strong&gt;HOCs&lt;/strong&gt; or &lt;strong&gt;reusable components&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Repeating the Same Logic in Multiple Components
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Data fetching logic or transformations duplicated across multiple components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Abstract into &lt;strong&gt;custom hooks&lt;/strong&gt;. Need to fetch profile info in 3 places? → &lt;code&gt;useProfile()&lt;/code&gt; → update it in &lt;em&gt;one&lt;/em&gt; place later.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Overusing &lt;code&gt;useState&lt;/code&gt; Instead of &lt;code&gt;useRef&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Using &lt;code&gt;useState&lt;/code&gt; to store everything—even values that don’t impact UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;useRef()&lt;/code&gt; for values that don’t require re-renders (e.g., timers, previous state snapshots).&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ Using &lt;code&gt;useEffect&lt;/code&gt; for Everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Triggering actions through &lt;code&gt;useEffect()&lt;/code&gt; even when they should happen directly via user interaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prefer &lt;strong&gt;event handlers&lt;/strong&gt; for actions like button clicks. Use &lt;code&gt;useEffect()&lt;/code&gt; &lt;strong&gt;only&lt;/strong&gt; for true side-effects tied to &lt;strong&gt;state or lifecycle&lt;/strong&gt; changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  6️⃣ Lifting State Prematurely
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Moving local state higher up in the component tree unnecessarily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Keep state local&lt;/strong&gt; by default. Lift it &lt;strong&gt;only&lt;/strong&gt; when multiple components genuinely need access to it.&lt;/p&gt;




&lt;h2&gt;
  
  
  7️⃣ Overusing &lt;code&gt;React.memo&lt;/code&gt; and &lt;code&gt;useMemo&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adding &lt;code&gt;React.memo()&lt;/code&gt; and &lt;code&gt;useMemo()&lt;/code&gt; everywhere just because they exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  Optimize only where profiling shows &lt;strong&gt;performance bottlenecks&lt;/strong&gt;.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  8️⃣ Prop Drilling Hell
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Passing data through 4-5 layers of components → painful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;strong&gt;React Context&lt;/strong&gt; responsibly for module-level shared data. Don’t over-nest contexts react—composition patterns help here.&lt;/p&gt;




&lt;h2&gt;
  
  
  9️⃣ Tedious Nested State Updates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Manually writing deep updates with spread operators for every nested object change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;strong&gt;&lt;code&gt;immer&lt;/code&gt;&lt;/strong&gt; → makes working with complex state structures elegant and easier to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔟 Skipping Tests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Skipping tests for components or utility functions to “save time.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Write &lt;strong&gt;unit tests&lt;/strong&gt;, especially for complex components or functions. Tests help you &lt;em&gt;understand&lt;/em&gt; your own code better.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣1️⃣ Multiple Components in One File
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defining multiple components in a single file → chaos over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One component per file. Use &lt;strong&gt;kebab-case&lt;/strong&gt; for filenames (&lt;code&gt;user-profile.tsx&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣2️⃣ Using Contexts Like Globals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Creating Context Providers and dumping everything inside them → hard to maintain later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adopt &lt;strong&gt;composition patterns&lt;/strong&gt;. Break large contexts into smaller, purpose-driven providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣3️⃣ Inconsistent Folder/File Structures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❗ The Mistake:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Random folder structures, random naming conventions, different import patterns → painful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ The Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pick a &lt;strong&gt;consistent folder structure&lt;/strong&gt;—feature-based structures work great for React. Use ESLint and Prettier to enforce consistency.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;These are not just things I’ve seen in PRs—they’re things &lt;strong&gt;I’ve personally done and learned from&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;If you’re just starting out in frontend or React, I hope this helps you &lt;strong&gt;save time&lt;/strong&gt;, avoid pitfalls, and write &lt;strong&gt;scalable&lt;/strong&gt; code.&lt;/p&gt;

&lt;p&gt;What mistakes have you seen or done in PRs?&lt;br&gt;&lt;br&gt;
Drop them in the comments 👇 I’d love to hear!&lt;/p&gt;

</description>
      <category>react</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Web Communication: Long Polling Explained</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Sun, 04 May 2025 17:22:59 +0000</pubDate>
      <link>https://dev.to/frontendbytes/web-communication-long-polling-explained-2m25</link>
      <guid>https://dev.to/frontendbytes/web-communication-long-polling-explained-2m25</guid>
      <description>&lt;p&gt;In the previous post, we explored short polling. This time, let’s upgrade to &lt;strong&gt;long polling&lt;/strong&gt;, a technique that keeps the client in sync with the server without frequent re-requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What’s Different?
&lt;/h2&gt;

&lt;p&gt;In long polling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client sends a request and &lt;strong&gt;waits&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Server responds &lt;strong&gt;only when there is new data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Once response is received, the client &lt;strong&gt;immediately resubscribes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s understand this using the core code blocks involved.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Server Code Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Store connections for later use
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const connections = [];

app.get('/subscribe', (req, res) =&amp;gt; {
  if (req.query.data !== longPollingData) {
    return res.status(200).json({ message: longPollingData });
  }
  connections.push(res); // hold the response until new data is available
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the client already has the latest data, we hold the response (res) for future updates.&lt;/p&gt;

&lt;p&gt;Otherwise, respond immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Notify all clients on data update
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.post('/updateData', (req, res) =&amp;gt; {
  longPollingData = req.body.userInput;

  connections.forEach((connection) =&amp;gt; {
    connection.status(200).json({ message: longPollingData });
  });

  connections.length = 0;
  res.send('Update sent to all clients');
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On receiving new data, we loop through all held responses and send the updated message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then, we clear the connections array.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Client Code Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Subscribe and re-subscribe
&lt;/h3&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;subscribe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastData&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;try&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/subscribe?data=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;lastData&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nf"&gt;updateData&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;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;subscribe&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;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// recursive re-subscribe&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// retry on failure&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Makes a /subscribe request and waits for server update.&lt;/li&gt;
&lt;li&gt;Once update is received, it recursively re-subscribes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Submit new data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;form&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="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputValue&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="s1"&gt;userInput&lt;/span&gt;&lt;span class="dl"&gt;'&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/updateData&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&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="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="na"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&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;Sends new input to server which triggers an update to all subscribed clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;p&gt;Long polling holds client requests until new data is ready.&lt;/p&gt;

&lt;p&gt;It’s efficient and feels real-time without setting up a WebSocket.&lt;/p&gt;




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

&lt;p&gt;Long polling offers a smarter alternative to short polling by reducing unnecessary traffic and keeping clients updated with minimal latency. While not as seamless as WebSockets, it's a practical solution for many use cases where persistent connections aren’t viable.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Reduced network traffic&lt;/strong&gt; compared to short polling.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Near real-time&lt;/strong&gt; data delivery without constant re-requesting.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Works with HTTP/1.1&lt;/strong&gt;, no need for WebSocket support.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Simple implementation&lt;/strong&gt; using standard HTTP methods.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;❌ Each update still requires a new HTTP connection.&lt;/li&gt;
&lt;li&gt;❌ More resource-intensive than WebSockets at scale.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Delayed response&lt;/strong&gt; if no data is available for a while.&lt;/li&gt;
&lt;li&gt;❌ Not truly bi-directional — only server-to-client.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🕒 When to Use Long Polling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;real-time-like updates&lt;/strong&gt;, but WebSockets are &lt;strong&gt;not an option&lt;/strong&gt; (e.g., firewalls, older infrastructure).&lt;/li&gt;
&lt;li&gt;Your app doesn’t need &lt;strong&gt;constant updates&lt;/strong&gt; but should reflect &lt;strong&gt;new data quickly&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;simpler alternative to WebSockets&lt;/strong&gt; that works in most browsers.&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>Web Communication: Understanding Short Polling with a Simple Node.js Example</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Sun, 04 May 2025 14:08:16 +0000</pubDate>
      <link>https://dev.to/frontendbytes/web-communication-series-understanding-short-polling-with-a-simple-nodejs-example-3nb</link>
      <guid>https://dev.to/frontendbytes/web-communication-series-understanding-short-polling-with-a-simple-nodejs-example-3nb</guid>
      <description>&lt;p&gt;When developers think about keeping the UI in sync with server-side changes, the knee-jerk solution is often &lt;strong&gt;WebSockets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And it makes sense — WebSockets offer a full-duplex connection, enabling real-time, bidirectional communication between client and server.&lt;/p&gt;

&lt;p&gt;But here’s the catch:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not every application needs that level of complexity.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In many cases, especially when the data flows in just &lt;strong&gt;one direction (Server ➝ Client)&lt;/strong&gt; — like a dashboard that fetches new stats or a feed that updates periodically — setting up WebSockets can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overkill
&lt;/li&gt;
&lt;li&gt;Harder to scale
&lt;/li&gt;
&lt;li&gt;Unnecessarily complex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where simpler, more tailored techniques come into play — &lt;strong&gt;short polling&lt;/strong&gt;, &lt;strong&gt;long polling&lt;/strong&gt;, &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt;, and more.&lt;/p&gt;

&lt;p&gt;These alternatives can be &lt;strong&gt;easier to implement&lt;/strong&gt;, &lt;strong&gt;lightweight&lt;/strong&gt;, and often &lt;strong&gt;more cost-effective&lt;/strong&gt; when the use case doesn’t demand bi-directional messaging.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Web Communication Series — Chapter 1: Short Polling
&lt;/h2&gt;

&lt;p&gt;Welcome to the first chapter of the &lt;strong&gt;Web Communication&lt;/strong&gt; series, where we explore communication techniques between the client and server. In this post, we’ll break down &lt;strong&gt;short polling&lt;/strong&gt;, one of the simplest ways for a client to fetch updates from the server periodically.&lt;/p&gt;

&lt;p&gt;We'll go through the concepts and implement a working example using &lt;strong&gt;Express&lt;/strong&gt; and &lt;strong&gt;plain JavaScript&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Project Setup
&lt;/h2&gt;

&lt;p&gt;Let’s dive into building a simple app that demonstrates short polling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Directory Structure
&lt;/h3&gt;

&lt;p&gt;web-comm-short-polling/&lt;br&gt;
├── frontend/&lt;br&gt;
│ ├── index.html&lt;br&gt;
│ └── shortPollingScript.js&lt;br&gt;
├── server.js&lt;/p&gt;

&lt;p&gt;In this example, we have:&lt;/p&gt;

&lt;p&gt;A client that polls the server every 5 seconds for updates.&lt;/p&gt;

&lt;p&gt;A server that returns the latest data and allows it to be updated.&lt;/p&gt;
&lt;h2&gt;
  
  
  🖥️ Server-Side Logic
&lt;/h2&gt;

&lt;p&gt;✅ Route to Get the Latest Data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/getData&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&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;This is the endpoint our client keeps polling every few seconds. It returns the current value of a variable (data).&lt;/p&gt;

&lt;p&gt;✅ Route to Update the Data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/updateData&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userInput&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets us update the server-side value using a POST request. Once updated, future short polls will return the new value.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Client-Side Logic
&lt;/h2&gt;

&lt;p&gt;Polling the Server Every 5 Seconds&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="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="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getData&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;updateData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line is the heart of short polling. It calls getData() every 5 seconds and updates the UI with the result.&lt;/p&gt;

&lt;p&gt;Fetching the Data&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;getData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/getData&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&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;message&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;Simple GET request to fetch the current value.&lt;/p&gt;

&lt;p&gt;Submitting New Data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;form.addEventListener('submit', async (e) =&amp;gt; {
  e.preventDefault();
  const inputValue = inputElement.value;

  await fetch('/updateData', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ userInput: inputValue }),
  });

  updateData(inputValue);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this data updation, if we create two or more clients and update it from any one of the clients, it will be updated in all the clients.&lt;/p&gt;

&lt;p&gt;🧪 Summary of Code Flow&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client loads the page with some default data.&lt;/li&gt;
&lt;li&gt;Every 5 seconds, it polls the server for new data via /getData.&lt;/li&gt;
&lt;li&gt;If the user submits the form, it updates the server-side data.&lt;/li&gt;
&lt;li&gt;The next polling cycle will pick up the new data and reflect it in the UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ✅ Pros and ❌ Cons of Short Polling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple to implement&lt;/strong&gt; – Works with any server that supports HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No need for persistent connections&lt;/strong&gt; – Each request is independent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier to debug&lt;/strong&gt; – Plain HTTP requests are easier to inspect and test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works with most load balancers and proxies&lt;/strong&gt; – No special configuration required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Increased server load&lt;/strong&gt; – Frequent polling can create unnecessary traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency in updates&lt;/strong&gt; – Changes are only detected on the next poll (e.g., every 5 seconds).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inefficient for real-time apps&lt;/strong&gt; – Wastes resources when there's no new data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability concerns&lt;/strong&gt; – Doesn't scale well with thousands of clients polling simultaneously.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 When Should You Use Short Polling?
&lt;/h2&gt;

&lt;p&gt;Short polling is a good fit when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates are &lt;strong&gt;infrequent&lt;/strong&gt; and &lt;strong&gt;not mission-critical&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;quick and easy solution&lt;/strong&gt; without setting up complex infrastructure.&lt;/li&gt;
&lt;li&gt;You’re building a &lt;strong&gt;proof-of-concept&lt;/strong&gt; or MVP.&lt;/li&gt;
&lt;li&gt;Your data update interval is &lt;strong&gt;predictable&lt;/strong&gt; or doesn't need to be reflected in real-time.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Short polling offers a simple way to keep your frontend in sync with backend data. While it may not be the most efficient technique for real-time applications, it's perfect for low-frequency updates or when you need a quick and reliable solution without diving into more complex protocols.&lt;/p&gt;

&lt;p&gt;In this chapter of the &lt;strong&gt;Web Communication Series&lt;/strong&gt;, we covered how short polling works and built a working demo using Express and vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;You can find the complete source code for this example on GitHub:&lt;br&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/Naveenprasad59/Web-Communication" rel="noopener noreferrer"&gt;Web Communication GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay tuned for the next chapter, where we’ll explore &lt;strong&gt;Long Polling&lt;/strong&gt; and how it improves upon this approach!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
      <category>interview</category>
    </item>
    <item>
      <title>How to Add TypeScript Support to Your Node.js Project</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Sat, 19 Apr 2025 11:45:56 +0000</pubDate>
      <link>https://dev.to/frontendbytes/how-to-add-typescript-support-to-your-nodejs-project-7g2</link>
      <guid>https://dev.to/frontendbytes/how-to-add-typescript-support-to-your-nodejs-project-7g2</guid>
      <description>&lt;p&gt;TypeScript is a game-changer for Node.js development, bringing type safety and modern tooling to your JavaScript codebase. In this guide, I’ll walk you through the exact steps I used to migrate my Node.js project to TypeScript—no prior TypeScript experience required!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Install TypeScript and Type Definitions
&lt;/h2&gt;

&lt;p&gt;First, install TypeScript and the Node.js type definitions as development dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; typescript @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Initialize TypeScript Configuration
&lt;/h2&gt;

&lt;p&gt;Generate a &lt;code&gt;tsconfig.json&lt;/code&gt; file with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsc &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a base TypeScript configuration file in your project root.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Update tsconfig.json
&lt;/h2&gt;

&lt;p&gt;Open your &lt;code&gt;tsconfig.json&lt;/code&gt; and add or update these important fields:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"**/*.ts"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;options&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;include&lt;/code&gt; tells TypeScript to compile all &lt;code&gt;.ts&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exclude&lt;/code&gt; prevents &lt;code&gt;node_modules&lt;/code&gt; from being compiled.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;outDir&lt;/code&gt; specifies where the compiled JavaScript will go.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Rename Your Files to .ts
&lt;/h2&gt;

&lt;p&gt;Rename your existing &lt;code&gt;.js&lt;/code&gt; files to &lt;code&gt;.ts&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;server.js server.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete the old &lt;code&gt;.js&lt;/code&gt; files to avoid confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Compile TypeScript Files
&lt;/h2&gt;

&lt;p&gt;Now, compile your TypeScript files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate JavaScript files in the &lt;code&gt;dist&lt;/code&gt; directory (as specified by &lt;code&gt;outDir&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Run the Compiled JavaScript
&lt;/h2&gt;

&lt;p&gt;Run your app using Node.js, pointing to the compiled entry file in &lt;code&gt;dist&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node dist/server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or whatever your entry point is.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. (Optional) Update npm Scripts
&lt;/h2&gt;

&lt;p&gt;For convenience, add a script to your &lt;code&gt;package.json&lt;/code&gt;:&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;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx tsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node dist/server.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;That’s it! You’ve successfully added TypeScript support to your Node.js project. Enjoy better type safety, editor autocompletion, and more robust code!&lt;/p&gt;

&lt;p&gt;If you found this guide helpful, follow me for more tips on JavaScript, TypeScript, and Node.js development.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best Time For Vacation: Automating Your Holiday Planning with Node.js</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Fri, 18 Apr 2025 14:13:02 +0000</pubDate>
      <link>https://dev.to/frontendbytes/best-time-for-vacation-automating-your-holiday-planning-with-nodejs-385l</link>
      <guid>https://dev.to/frontendbytes/best-time-for-vacation-automating-your-holiday-planning-with-nodejs-385l</guid>
      <description>&lt;p&gt;This is a side project that I had been thinking about for a long time, to help find the best vacation time. It analyzes holiday data and suggests optimal vacation periods.&lt;/p&gt;

&lt;p&gt;Planning vacations around public holidays can be tricky—especially if you want to maximize your time off with minimal leave. In this post, I'll walk you through how I built a tool that fetches holiday data, groups sequential holidays, and even suggests the best days to take leave for the longest possible break. We'll cover everything from setup to the logical reasoning behind the code.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Project Overview&lt;/li&gt;
&lt;li&gt;Setting Up the Project&lt;/li&gt;
&lt;li&gt;Fetching Holiday Data&lt;/li&gt;
&lt;li&gt;Grouping Sequential Holidays&lt;/li&gt;
&lt;li&gt;Bridging Holidays with Leaves&lt;/li&gt;
&lt;li&gt;Bringing It All Together: The Main Function&lt;/li&gt;
&lt;li&gt;Running the Project&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Time For Vacation&lt;/strong&gt; is a Node.js project that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches holiday data from an API (e.g., your company’s HR system)&lt;/li&gt;
&lt;li&gt;Groups holidays that fall consecutively&lt;/li&gt;
&lt;li&gt;Suggests the optimal days to take leave for a longer vacation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Setting Up the Project
&lt;/h2&gt;

&lt;p&gt;First, create a new directory and initialize a Node.js project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the required dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;dayjs node-fetch dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;package.json&lt;/code&gt; should look like this:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bestTimeForVacation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node server.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dayjs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.11.13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node-fetch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.6.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dotenv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^16.5.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to use environment variables (e.g., API tokens), create a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KEKA_TOKEN="YOUR_KEKA_TOKEN"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fetching Holiday Data
&lt;/h2&gt;

&lt;p&gt;We use &lt;code&gt;node-fetch&lt;/code&gt; to retrieve holiday data from an API. Here’s a simplified version of the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchHolidays&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_HOLIDAYS_API_URL&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;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;KEKA_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// ...other headers as needed&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;holidays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Adjust if your API wraps holidays in a .data property&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Grouping Sequential Holidays
&lt;/h2&gt;

&lt;p&gt;To find holiday streaks, we use the &lt;code&gt;dayjs&lt;/code&gt; library for date manipulation. The logic is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sort all holiday dates.&lt;/li&gt;
&lt;li&gt;For each holiday, check if the next day is also a holiday.&lt;/li&gt;
&lt;li&gt;Count how many days in a row are holidays.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dayjs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dayjs&lt;/span&gt;&lt;span class="dl"&gt;'&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;groupHolidaysSequentially&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;holidays&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;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&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;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
      &lt;span class="nf"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dayjs&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;day&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&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="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;date&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="na"&gt;numberOfDaysContinuous&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;count&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;result&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;
  
  
  Bridging Holidays with Leaves
&lt;/h2&gt;

&lt;p&gt;The real magic is in suggesting which leave days will maximize your vacation. The logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For each holiday, simulate taking a leave day before or after.&lt;/li&gt;
&lt;li&gt;Calculate the new streak length.&lt;/li&gt;
&lt;li&gt;Suggest the leave day that results in the longest break.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example logic:&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;function&lt;/span&gt; &lt;span class="nf"&gt;bridgeHolidaysWithLeaves&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numOfDaysToCheck&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;holidayDates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;bridgedHolidays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;maxLeaveData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;vacationCountWithLeave&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;holidays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;holiday&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;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;numOfDaysToCheck&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leaveDay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;holiday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;day&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY-MM-DD&lt;/span&gt;&lt;span class="dl"&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;holidayDates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;leaveDay&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Simulate adding leave and recalculate streak&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;streak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;holiday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;numberOfDaysContinuous&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="nx"&gt;bridgedHolidays&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="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;leaveDay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;vacationCountWithLeave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;streak&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;streak&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;maxLeaveData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vacationCountWithLeave&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;maxLeaveData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;leaveDay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;vacationCountWithLeave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;streak&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bridgedHolidays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxLeaveData&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 function finds the best possible leave day(s) to bridge holidays and maximize your time off.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bringing It All Together: The Main Function
&lt;/h2&gt;

&lt;p&gt;So, how do all these helper functions work together when you start the project? The answer lies in the &lt;code&gt;main&lt;/code&gt; function, which orchestrates the entire process. Here’s what happens step by step:&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;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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;try&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;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Execution Time&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;numOfDaysToCheck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&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;yearToCheck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2025&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;quarterToCheck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// 1. Fetch holidays from the API&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchHolidays&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Filter holidays for the desired quarter and year, and extract only the date&lt;/span&gt;
    &lt;span class="nx"&gt;holidays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;holidays&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;holiday&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;checkIsDateInCurrentQuarter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;holiday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quarterToCheck&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;yearToCheck&lt;/span&gt;&lt;span class="p"&gt;))&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;data&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;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Get all weekends in the specified quarter&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weekends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getAllWeekendsInaQuarter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quarterToCheck&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;yearToCheck&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. Combine holidays and weekends&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;holidayDates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;holidays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;groupHolidaysSequentially&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weekends&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&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;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dayjs&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="nf"&gt;isBefore&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="p"&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="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="c1"&gt;// 5. Find the best days to bridge holidays with leaves&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;bridgedHolidays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxLeaveData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bridgeHolidaysWithLeaves&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;numOfDaysToCheck&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;holidayDates&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Execution Time&lt;/span&gt;&lt;span class="dl"&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;bridgedHolidays&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;maxLeaveData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step-by-Step Breakdown
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fetch Holidays:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The function starts by fetching all holidays from the API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Filter for Quarter and Year:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It then filters these holidays to only include those in a specific quarter and year, focusing your analysis on a relevant time window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get All Weekends:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
All weekends in the quarter are calculated, since weekends are natural candidates for extending vacations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Combine and Group:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The list of holidays and weekends is merged, sorted, and passed to &lt;code&gt;groupHolidaysSequentially&lt;/code&gt; to find streaks of consecutive days off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bridge with Leaves:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The core logic then uses &lt;code&gt;bridgeHolidaysWithLeaves&lt;/code&gt; to determine which leave days (if any) can be added to maximize your vacation length.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Finally, it prints out all possible bridged holidays and highlights the best option for the longest break.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This main function is what runs when you start the server with &lt;code&gt;npm start&lt;/code&gt;, tying together all the helper logic to provide actionable vacation suggestions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running the Project
&lt;/h2&gt;

&lt;p&gt;Make sure your environment variables are set and start the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output will be a list of suggested vacation periods and the optimal leave day for the longest break.&lt;/p&gt;




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

&lt;p&gt;With just a bit of JavaScript and some clever date logic, you can automate your vacation planning and get the most out of your holidays!&lt;br&gt;&lt;br&gt;
Feel free to fork the repo, tweak the logic, or integrate with your favorite calendar app.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Happy holidays and happy coding!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;If you have questions or want to see the full source code, check out the &lt;a href="https://github.com/Naveenprasad59/Best-Vaction-Time" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Let me know in the comments if you’d like a deep dive into any part of the logic!&lt;/p&gt;

</description>
      <category>node</category>
      <category>challenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Setting Up ESLint and Prettier in Your React Project with Webpack and Babel (Continued)</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Mon, 14 Apr 2025 14:33:49 +0000</pubDate>
      <link>https://dev.to/frontendbytes/setting-up-eslint-and-prettier-in-your-react-project-with-webpack-and-babel-continued-5ad1</link>
      <guid>https://dev.to/frontendbytes/setting-up-eslint-and-prettier-in-your-react-project-with-webpack-and-babel-continued-5ad1</guid>
      <description>&lt;p&gt;In our previous post, we set up a React project from scratch using Webpack and Babel. Now, let's enhance our project by adding ESLint for code linting and Prettier for code formatting. These tools will ensure that our codebase remains consistent, readable, and error-free as it grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is ESLint?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;ESLint is a static code analysis tool that helps JavaScript developers find and fix problems in their code. It works by parsing your code using an Abstract Syntax Tree (AST). It uses the &lt;strong&gt;ESTree&lt;/strong&gt; format for the AST structure, which is similar to &lt;strong&gt;Babel&lt;/strong&gt;'s AST. &lt;/p&gt;

&lt;p&gt;For example, the AST representation of a simple code like &lt;code&gt;1 + 2&lt;/code&gt; would look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "type": "ExpressionStatement",&lt;br&gt;
  "expression": {&lt;br&gt;
    "type": "BinaryExpression",&lt;br&gt;
    "left": {&lt;br&gt;
      "type": "Literal",&lt;br&gt;
      "value": 1,&lt;br&gt;
      "raw": "1"&lt;br&gt;
    },&lt;br&gt;
    "operator": "+",&lt;br&gt;
    "right": {&lt;br&gt;
      "type": "Literal",&lt;br&gt;
      "value": 2,&lt;br&gt;
      "raw": "2"&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
With this AST structure, tools like ESLint can easily detect violations in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install ESLint in Your React Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install ESLint as a dev dependency:
&lt;code&gt;npm install -D eslint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Initialize ESLint:
&lt;code&gt;npx eslint --init&lt;/code&gt;
This will prompt you with a series of questions to generate the eslint.config.js file. For a React project, ensure you select React as your framework.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sample ESLint Config File (for React)
&lt;/h2&gt;

&lt;p&gt;Once you've run npx eslint --init, your eslint.config.js will look something like this:&lt;br&gt;
`import { defineConfig } from "eslint/config";&lt;br&gt;
import js from "@eslint/js";&lt;br&gt;
import globals from "globals";&lt;br&gt;
import pluginReact from "eslint-plugin-react";&lt;/p&gt;

&lt;p&gt;export default defineConfig([&lt;br&gt;
  { files: ["*&lt;em&gt;/&lt;/em&gt;.{js,jsx}"], languageOptions: { globals: globals.browser }, plugins: { js }, extends: ["js/recommended"] },&lt;br&gt;
  pluginReact.configs.flat.recommended,&lt;br&gt;
]);&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Let's break down the configuration:&lt;/p&gt;

&lt;p&gt;files: Specifies which files this config will apply to. Here it’s set to apply to all .js and .jsx files.&lt;/p&gt;

&lt;p&gt;languageOptions: Contains JavaScript-specific options, such as setting the global variables (globals.browser in this case).&lt;/p&gt;

&lt;p&gt;plugins: Specifies additional plugins to use for linting, such as the js plugin for general JavaScript linting.&lt;/p&gt;

&lt;p&gt;extends: This property tells ESLint to extend rules from eslint:recommended, a set of base rules that ESLint provides.&lt;/p&gt;

&lt;p&gt;Now that we have the basic setup for ESLint, let’s configure some custom rules to match our project’s requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Custom ESLint Rules
&lt;/h2&gt;

&lt;p&gt;You may want to customize ESLint’s behavior for your specific use case. For example, we can disable the prop-types rule and turn off the need to import React in every JSX file for React 17+.&lt;/p&gt;

&lt;p&gt;Here's how to do it:&lt;br&gt;
&lt;code&gt;export default defineConfig([&lt;br&gt;
  { &lt;br&gt;
    files: ["**/*.{js,jsx}"], &lt;br&gt;
    languageOptions: { globals: globals.browser },  &lt;br&gt;
    plugins: { js }, &lt;br&gt;
    extends: ["js/recommended"] &lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    ...pluginReact.configs.flat.recommended,&lt;br&gt;
    rules: {&lt;br&gt;
      ...pluginReact.configs.flat.recommended.rules,&lt;br&gt;
      "react/prop-types": "off", // Disable prop-types rule&lt;br&gt;
      "react/react-in-jsx-scope": "off" // No need to import React in every file (React 17+)&lt;br&gt;
    },&lt;br&gt;
  },&lt;br&gt;
]);&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up ESLint in VS Code
&lt;/h2&gt;

&lt;p&gt;To make sure ESLint works seamlessly in your editor, we’ll need to install the ESLint extension for VSCode.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the ESLint Extension:
Search for ESLint in the Extensions tab of VSCode and install it.&lt;/li&gt;
&lt;li&gt;Configure VSCode:
Create a .vscode/settings.json file and add the following 
configuration:
&lt;code&gt;{
"eslint.experimental.useFlatConfig": true,
"eslint.validate": ["javascript", "javascriptreact"],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
}&lt;/code&gt;
This configuration ensures ESLint runs automatically every time you save your file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ignoring Files with ESLint
&lt;/h2&gt;

&lt;p&gt;In ESLint, if you want to ignore certain files (like webpack.config.js), you should do it via the ignores property in your eslint.config.js instead of using .eslintignore (which is deprecated for flat config):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ignores: ["webpack.config.js"]&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Prettier
&lt;/h2&gt;

&lt;p&gt;Prettier is an opinionated code formatter that ensures consistency in your code. It integrates seamlessly with ESLint to format your code while also catching linting violations.&lt;/p&gt;

&lt;p&gt;Install Prettier:&lt;br&gt;
Install the necessary packages:&lt;br&gt;
&lt;code&gt;npm install --save-dev prettier eslint-plugin-prettier eslint-config-prettier&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a .prettierrc File:&lt;br&gt;
This file will define your formatting rules. Here’s an example:&lt;br&gt;
&lt;code&gt;{&lt;br&gt;
  "singleQuote": true,&lt;br&gt;
  "trailingComma": "all",&lt;br&gt;
  "printWidth": 100,&lt;br&gt;
  "semi": true&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate Prettier with ESLint:
&lt;/h2&gt;

&lt;p&gt;To ensure that Prettier’s rules are respected in ESLint, update your eslint.config.js file:&lt;br&gt;
`import { defineConfig } from 'eslint/config';&lt;br&gt;
import js from '@eslint/js';&lt;br&gt;
import globals from 'globals';&lt;br&gt;
import pluginReact from 'eslint-plugin-react';&lt;br&gt;
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';&lt;br&gt;
import prettierConfig from 'eslint-config-prettier';&lt;/p&gt;

&lt;p&gt;export default defineConfig([&lt;br&gt;
  {&lt;br&gt;
    files: ['*&lt;em&gt;/&lt;/em&gt;.{js,jsx}'],&lt;br&gt;
    ignores: ['webpack.config.js'],&lt;br&gt;
    languageOptions: { globals: globals.browser },&lt;br&gt;
    plugins: { js },&lt;br&gt;
    extends: ['js/recommended'],&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    ...pluginReact.configs.flat.recommended,&lt;br&gt;
    rules: {&lt;br&gt;
      ...pluginReact.configs.flat.recommended.rules,&lt;br&gt;
      'react/prop-types': 'off', // Turn off prop-types rule&lt;br&gt;
      'react/react-in-jsx-scope': 'off', // React import no longer required&lt;br&gt;
      'react/jsx-key': 'error', // Enforce keys in lists&lt;br&gt;
    },&lt;br&gt;
  },&lt;br&gt;
  eslintPluginPrettierRecommended,&lt;br&gt;
  prettierConfig,&lt;br&gt;
]);&lt;br&gt;
`&lt;br&gt;
Configure VSCode for Prettier&lt;br&gt;
To format code automatically with Prettier in VSCode, you need to install the Prettier extension:&lt;/p&gt;

&lt;p&gt;Install the Prettier Extension:&lt;/p&gt;

&lt;p&gt;Search for Prettier - Code formatter in the VSCode Extensions marketplace and install it.&lt;/p&gt;

&lt;p&gt;Set Prettier as the Default Formatter:&lt;/p&gt;

&lt;p&gt;Add the following to your .vscode/settings.json:&lt;br&gt;
&lt;code&gt;{&lt;br&gt;
  "editor.defaultFormatter": "esbenp.prettier-vscode"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Adding Lint and Format Scripts to package.json&lt;br&gt;
Now that we have everything set up, let’s add some useful scripts to our package.json to make it easier to run ESLint and Prettier checks:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"scripts": {&lt;br&gt;
  "lint": "eslint .",&lt;br&gt;
  "lint:fix": "eslint . --fix",&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;In this post, we’ve walked through how to set up ESLint and Prettier in a React project created without CRA (using Webpack and Babel). We also covered how to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install and configure ESLint for React.&lt;/li&gt;
&lt;li&gt;Add custom ESLint rules. &lt;/li&gt;
&lt;li&gt;Integrate Prettier with ESLint to auto-format code. &lt;/li&gt;
&lt;li&gt;Set up VSCode to work seamlessly with both ESLint and Prettier. &lt;/li&gt;
&lt;li&gt;Add useful scripts to package.json for easy linting and formatting.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Setting Up React with Webpack and babel from Scratch</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Mon, 31 Mar 2025 19:49:07 +0000</pubDate>
      <link>https://dev.to/frontendbytes/setting-up-react-with-webpack-and-babel-from-scratch-1elo</link>
      <guid>https://dev.to/frontendbytes/setting-up-react-with-webpack-and-babel-from-scratch-1elo</guid>
      <description>&lt;p&gt;If you're starting a React project from scratch and want full control over your setup, using Webpack is a great option. In this guide, we'll go step by step to configure Webpack and integrate React, Babel, CSS, and assets properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Initialize the Project
&lt;/h2&gt;

&lt;p&gt;First, create a Node.js project and install the necessary dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, install React and Webpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react react-dom webpack webpack-cli webpack-dev-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create essential project files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;index.js index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Basic React Setup
&lt;/h2&gt;

&lt;p&gt;Inside &lt;code&gt;index.js&lt;/code&gt;, set up a basic React component and render it inside a &lt;code&gt;div&lt;/code&gt; with &lt;code&gt;id="root"&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&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-dom&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, Webpack with React!&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;span class="nx"&gt;ReactDOM&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;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;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;root&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;Create a simple &lt;code&gt;index.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&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;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;React Webpack Setup&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Webpack Configuration
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;webpack.config.js&lt;/code&gt; file. Webpack needs an entry file, an output path, and a filename for the bundled JavaScript:&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bundle.js&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;h2&gt;
  
  
  Step 4: Adding Babel Support
&lt;/h2&gt;

&lt;p&gt;Webpack works with loaders and plugins. Loaders tell Webpack how to process different file types. To compile JSX, we need Babel.&lt;/p&gt;

&lt;p&gt;Install Babel dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @babel/core @babel/preset-env @babel/preset-react babel-loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, update &lt;code&gt;webpack.config.js&lt;/code&gt; to include Babel in module rules:&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;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;rules&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;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;js|jsx&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/node_modules/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;babel-loader&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create a &lt;code&gt;.babelrc&lt;/code&gt; file to configure Babel:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"@babel/preset-env"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@babel/preset-react"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Setting Up Webpack Dev Server
&lt;/h2&gt;

&lt;p&gt;To serve our React application, we need &lt;code&gt;webpack-dev-server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Modify &lt;code&gt;webpack.config.js&lt;/code&gt; to add a development server:&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;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;devServer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;static&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;compress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;package.json&lt;/code&gt; with scripts to start and build the project:&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;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack serve --open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your React app should open in the browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: HTML Template with Webpack Plugin
&lt;/h2&gt;

&lt;p&gt;By default, Webpack does not generate an &lt;code&gt;index.html&lt;/code&gt; file. We use &lt;code&gt;html-webpack-plugin&lt;/code&gt; to create one with our bundle script linked. We will use the template option from the plugin to link to our index.html file we have created in the beginning.&lt;/p&gt;

&lt;p&gt;Install the plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; html-webpack-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modify &lt;code&gt;webpack.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HtmlWebpackPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html-webpack-plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;plugins&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;HtmlWebpackPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;index.html&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;p&gt;Now, &lt;code&gt;index.html&lt;/code&gt; will automatically include our bundled script.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Adding CSS Support
&lt;/h2&gt;

&lt;p&gt;Webpack does not process CSS files by default. To allow this, install the necessary loaders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;style-loader css-loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, update &lt;code&gt;webpack.config.js&lt;/code&gt; to include rules for handling CSS: we need both these loader since style-loader is to use the css in the bundle and css-loader is for webpack to understand how to process the css.&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;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;rules&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;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;css$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;use&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;style-loader&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;css-loader&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To apply CSS, create a &lt;code&gt;styles.css&lt;/code&gt; file and import it inside &lt;code&gt;index.js&lt;/code&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="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&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="m"&gt;#f4f4f4&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;Then, import it in &lt;code&gt;index.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./styles.css&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;
  
  
  Step 8: Handling Assets (Images, SVGs)
&lt;/h2&gt;

&lt;p&gt;To use images in our project, we need Webpack to process them. Update &lt;code&gt;webpack.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;rules&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;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;png|jpg|jpeg|svg&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;asset/resource&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can import and use images in your components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logo&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;./logo.png&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;
  
  
  Step 9: Resolving File Extensions
&lt;/h2&gt;

&lt;p&gt;By default, Webpack requires file extensions when importing modules. To simplify imports, add the following to &lt;code&gt;webpack.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;extensions&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;.js&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;.jsx&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;This allows us to import files without specifying &lt;code&gt;.js&lt;/code&gt; or &lt;code&gt;.jsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Component&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;./Component&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Now, you have a fully functional React setup with Webpack, Babel, CSS, and asset handling. This step-by-step approach ensures you understand each configuration. 🎉 Happy coding!&lt;/p&gt;

&lt;p&gt;Checkout my github repo for the code discussed&lt;br&gt;
[&lt;a href="https://github.com/Naveenprasad59/How-to-create-ReactApp-from-Scratch/tree/master" rel="noopener noreferrer"&gt;https://github.com/Naveenprasad59/How-to-create-ReactApp-from-Scratch/tree/master&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webpack</category>
      <category>babel</category>
      <category>react</category>
    </item>
    <item>
      <title>Understanding Babel: The JavaScript Compiler</title>
      <dc:creator>Naveen prasad</dc:creator>
      <pubDate>Sun, 30 Mar 2025 18:25:10 +0000</pubDate>
      <link>https://dev.to/frontendbytes/understanding-babel-the-javascript-compiler-hip</link>
      <guid>https://dev.to/frontendbytes/understanding-babel-the-javascript-compiler-hip</guid>
      <description>&lt;h2&gt;
  
  
  What is Babel?
&lt;/h2&gt;

&lt;p&gt;Babel is a compiler (more accurately, a transpiler) that converts modern JavaScript (ES6+) into an older syntax that browsers can understand. It ensures backward compatibility by transforming modern code features like arrow functions, classes, and template literals into equivalent ES5 syntax. Additionally, Babel can add polyfills for unsupported features.&lt;/p&gt;

&lt;p&gt;Example: Arrow Functions Transformation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Babel Input: ES6 Arrow function
[1, 2, 3].map(n =&amp;gt; n + 1);

// Babel Output: ES5 Equivalent
[1, 2, 3].map(function(n) {
  return n + 1;
});

// Before Babel
const square = n =&amp;gt; n * n;

// After Babel
const square = function square(n) {
  return n * n;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Babel as a Codemod
&lt;/h2&gt;

&lt;p&gt;Babel can be used for codemods, where large-scale code transformations are automated. For instance, if you need to change all import statements across your project, you can write a Babel codemod to handle it efficiently.&lt;/p&gt;

&lt;p&gt;Example Use Case: Automating import transformations across multiple files.&lt;br&gt;
Watch this YouTube video for a practical example.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running Babel
&lt;/h2&gt;

&lt;p&gt;Babel provides a CLI that allows you to compile JavaScript files easily:&lt;/p&gt;

&lt;p&gt;babel file-name.js&lt;/p&gt;

&lt;p&gt;babel src -d foldername&lt;/p&gt;

&lt;p&gt;Babel Plugins and Presets&lt;/p&gt;

&lt;p&gt;Babel doesn’t perform transformations by default; it requires plugins and presets to know what to do.&lt;/p&gt;

&lt;p&gt;Plugins: Define specific transformations (e.g., converting arrow functions to ES5 functions).&lt;/p&gt;

&lt;p&gt;Presets: Collections of plugins (e.g., &lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/preset-env).&lt;/p&gt;

&lt;p&gt;You can also create custom presets by grouping multiple plugins together.&lt;/p&gt;

&lt;p&gt;Babel’s Role in Static Analysis&lt;/p&gt;

&lt;p&gt;Babel is widely used for static analysis, meaning it analyzes code without executing it. This enables use cases like:&lt;/p&gt;

&lt;p&gt;Linting (ensuring code follows best practices)&lt;/p&gt;

&lt;p&gt;Minification (reducing file size)&lt;/p&gt;

&lt;p&gt;Optimization (enhancing performance)&lt;/p&gt;

&lt;p&gt;Code transformation (rewriting syntax for compatibility)&lt;/p&gt;
&lt;h2&gt;
  
  
  Babel’s Three Stages
&lt;/h2&gt;

&lt;p&gt;Babel’s compilation process consists of three key stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parsing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The source code is broken down into tokens (lexical analysis) and then converted into an Abstract Syntax Tree (AST) (syntactical analysis).&lt;/p&gt;

&lt;p&gt;Lexical Analysis (Tokenization)&lt;/p&gt;

&lt;p&gt;Converting code into a structured list of tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n * n;
[
  { type: { ... }, value: "n", start: 0, end: 1, loc: { ... } },
  { type: { ... }, value: "*", start: 2, end: 3, loc: { ... } },
  { type: { ... }, value: "n", start: 4, end: 5, loc: { ... } },
  ...
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Syntactical Analysis&lt;/p&gt;

&lt;p&gt;After tokenization, Babel constructs an Abstract Syntax Tree (AST), which represents the structure of the code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transforming&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the most important step in Babel's compilation process. Here, Babel traverses the AST, applying transformations based on installed plugins and presets.&lt;/p&gt;

&lt;p&gt;The AST is modified as per the transformation rules.&lt;/p&gt;

&lt;p&gt;New syntax replacements, optimizations, and other changes are applied.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Code Generation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally, Babel converts the modified AST back into JavaScript code.&lt;/p&gt;

&lt;p&gt;The AST is traversed depth-first to generate the final output.&lt;/p&gt;

&lt;p&gt;The transformed code is written out as a JavaScript file.&lt;/p&gt;

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

&lt;p&gt;Babel is a powerful tool that enables developers to write modern JavaScript while ensuring compatibility with older browsers. By leveraging plugins, presets, and codemods, Babel simplifies large-scale transformations and enhances the JavaScript development experience. Whether you're compiling ES6, optimizing performance, or modifying imports across files, Babel is an indispensable tool in the JavaScript ecosystem.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>babel</category>
      <category>jscompiler</category>
    </item>
  </channel>
</rss>
