<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pramod Boda</title>
    <description>The latest articles on Forem by Pramod Boda (@pramod_boda).</description>
    <link>https://forem.com/pramod_boda</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%2F2564856%2Fbecded9b-ab48-4d36-be82-5b37d261696e.jpg</url>
      <title>Forem: Pramod Boda</title>
      <link>https://forem.com/pramod_boda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pramod_boda"/>
    <language>en</language>
    <item>
      <title>Recommended Folder Structure for Node(TS) 2025</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Fri, 19 Sep 2025 16:14:12 +0000</pubDate>
      <link>https://forem.com/pramod_boda/recommended-folder-structure-for-nodets-2025-39jl</link>
      <guid>https://forem.com/pramod_boda/recommended-folder-structure-for-nodets-2025-39jl</guid>
      <description>&lt;p&gt;If you want ReactJS Folder Structure, You can get from here: &lt;a href="https://dev.to/pramod_boda/recommended-folder-structure-for-react-2025-48mc"&gt;&lt;strong&gt;Recommended Folder Structure for React 2025&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;A common and effective folder structure for a Node.js web application with Express in 2025 is based on the &lt;strong&gt;service-layered architecture&lt;/strong&gt; or &lt;strong&gt;feature-based organization&lt;/strong&gt;, which promotes separation of concerns, scalability, and maintainability.&lt;/p&gt;

&lt;p&gt;In this article, I have explained both &lt;strong&gt;feature-based organization&lt;/strong&gt; and &lt;strong&gt;service-layered architecture&lt;/strong&gt;, Now by end of this article, You will choose one. I personally follow &lt;strong&gt;feature-based architecture&lt;/strong&gt;. Tell me in comments which one you liked?&lt;/p&gt;

&lt;p&gt;Now, lets see how to structure our node projects, Lets go...&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Principles of a Modern Node.js Structure 🏗️
&lt;/h2&gt;

&lt;p&gt;The goal is to move beyond a simple, monolithic &lt;code&gt;app.js&lt;/code&gt; file and organize code into logical, reusable components. This helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: The application can grow without becoming a tangled mess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: It's easier to find, debug, and update specific parts of the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Individual units of code can be tested in isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Collaboration&lt;/strong&gt;: Multiple developers can work on different parts of the application without conflicts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommended Feature-Based Structure (I personally follow this)
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;feature-based organization&lt;/strong&gt; is an excellent and modern approach to structuring a Node.js Express application, especially for larger projects. This method groups related files (controllers, services, models) by &lt;strong&gt;domain or feature&lt;/strong&gt; rather than by type. This makes the codebase more scalable, easier to navigate, and better for team collaboration.&lt;/p&gt;




&lt;p&gt;This structure is a direct evolution of the layered approach, organizing the same components but in a more modular way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pramodboda-app/
├── src/
│   ├── features/
│   │   ├── auth/            # All files related to user authentication
│   │   │   ├── auth.controller.ts   # Request handlers: process input and call 'auth' services
│   │   │   ├── auth.model.ts        # Database schemas and data models of 'auth' related
│   │   │   ├── auth.route.ts        # Define API endpoints of 'auth' and map them to controllers
│   │   │   └── auth.service.ts      # Core business logic; the "brain" of the 'auth' features
│   │   │
│   │   ├── users/           # All files related to user management
│   │   │   ├── user.controller.ts   # Request handlers: process input and call 'users' services
│   │   │   ├── user.model.ts        # Database schemas and data models of 'users' related
│   │   │   ├── user.route.ts        # Define API endpoints of 'users' and map them to controllers
│   │   │   └── user.service.ts      # Core business logic; the "brain" of the 'users features
│   │   │
│   │   └── products/        # All files related to products
│   │       ├── product.controller.ts  # Request handlers: process input and call 'product' services
│   │       ├── product.model.ts       # Database schemas and data models of 'products' related
│   │       ├── product.route.ts       # Define API endpoints of 'products' and map them to controllers
│   │       └── product.service.ts     # Core business logic; the "brain" of the 'products' features
│   │
|   ├── api/                # API entry points (e.g., v1/)
│   ├── config/             # Centralized configuration files (DB, auth, etc.)
│   ├── middleware/         # Custom Express middleware (auth, logging, etc.)
│   ├── utils/              # Shared helper functions and reusable code
│   │
│   └── index.ts            # The main entry point for the application logic
|
├── tests/                  # All unit and integration tests
├── .env                    # All variable environments for App
├── .gitignore              # This file includes what are all file/ folders should not to move to your Git repo
├── package.json
├── server.ts               # Sets up and starts the server
└── tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why is this a good idea?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cohesion&lt;/strong&gt;: All code for a specific feature (e.g., users) is located in one place, making it easy to understand and work on that feature in isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: As your application grows, you simply add new folders for new features without cluttering a central &lt;code&gt;controllers/&lt;/code&gt; or &lt;code&gt;services/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: You can delete an entire feature folder when it's no longer needed without affecting the rest of the application.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Breakdown of Key Folders
&lt;/h2&gt;

&lt;p&gt;This folder structure uses a &lt;strong&gt;feature-based organization&lt;/strong&gt;, which groups all related code for a specific domain together. This approach is highly scalable and maintains a clear separation of concerns. Here's a breakdown of the key folders and files in your provided structure:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/&lt;/code&gt; Folder
&lt;/h3&gt;

&lt;p&gt;This is the main directory for your application's source code. Keeping all source files here helps keep the project root clean.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;features/&lt;/code&gt;&lt;/strong&gt;: This is the core of your application's modular design. Each subfolder here represents a distinct domain or "feature" of your application, like &lt;code&gt;auth&lt;/code&gt; or &lt;code&gt;users&lt;/code&gt;. This approach, known as Domain-Driven Design (DDD), ensures that all components related to a specific business function are co-located.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;auth/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;users/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;products/&lt;/code&gt;&lt;/strong&gt;: These folders are your features. Each one contains the &lt;strong&gt;controller&lt;/strong&gt;, &lt;strong&gt;model&lt;/strong&gt;, &lt;strong&gt;route&lt;/strong&gt;, and &lt;strong&gt;service&lt;/strong&gt; files specific to that feature. This prevents your codebase from becoming a monolithic mess as it grows. For example, all code for managing users lives in &lt;code&gt;features/users/&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth.controller.ts&lt;/code&gt;: Handles requests related to authentication. It takes the request, validates the input, and calls the &lt;code&gt;auth.service.ts&lt;/code&gt; to execute the business logic, then sends the response back to the client.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth.model.ts&lt;/code&gt;: Defines the structure of your data in the database for the authentication feature (e.g., the User schema in Mongoose).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth.route.ts&lt;/code&gt;: Defines the API endpoints for authentication (e.g., &lt;code&gt;/api/auth/login&lt;/code&gt;, &lt;code&gt;/api/auth/register&lt;/code&gt;) and maps them to the appropriate controller functions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth.service.ts&lt;/code&gt;: Contains the business logic for the feature. This is the "brain" of your feature, where complex operations like password hashing, JWT token creation, and database interactions happen. The controller simply orchestrates the service calls.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;api/&lt;/code&gt;&lt;/strong&gt;: A common practice for versioning your API (e.g., &lt;code&gt;v1/&lt;/code&gt;). You could move your route files into &lt;code&gt;src/api/v1/&lt;/code&gt; to support multiple API versions in the future.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;config/&lt;/code&gt;&lt;/strong&gt;: Contains all configuration files for your application, such as database connection settings, API keys, or environment-specific variables.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;middleware/&lt;/code&gt;&lt;/strong&gt;: Houses all your custom Express middleware functions, which can be shared across multiple features. Examples include authentication checks, error handlers, and request loggers.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;utils/&lt;/code&gt;&lt;/strong&gt;: A repository for reusable helper functions that don't belong to any specific feature or layer. Examples include validation helpers, email sending functions, or general utility functions.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;index.ts&lt;/code&gt;&lt;/strong&gt;: The central file that sets up your Express application. It imports and applies all global middleware (like &lt;code&gt;express.json()&lt;/code&gt; and &lt;code&gt;cors&lt;/code&gt;) and registers all your feature routes. This file acts as a central hub for your application's logic, but it doesn't start the server itself.&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  Root Level Files &amp;amp; Folders
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tests/&lt;/code&gt;&lt;/strong&gt;: A dedicated folder for all your unit and integration tests. Organizing them here keeps them separate from your production code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;: Stores environment-specific variables. This file should &lt;strong&gt;never&lt;/strong&gt; be committed to version control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt;: Specifies files and folders that Git should ignore, such as &lt;code&gt;node_modules&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;server.ts&lt;/code&gt;&lt;/strong&gt;: The &lt;strong&gt;entry point&lt;/strong&gt; for your application. Its sole responsibility is to import the Express app from &lt;code&gt;index.ts&lt;/code&gt; and start the server, listening on a specific port. This separation makes your &lt;code&gt;index.ts&lt;/code&gt; file highly testable, as you can import the app instance without starting the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tsconfig.json&lt;/code&gt;&lt;/strong&gt;: The configuration file for the TypeScript compiler, which defines how your TypeScript code should be compiled into JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/strong&gt;: Manages your project's metadata and dependencies.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;server.ts&lt;/code&gt; and &lt;code&gt;app.ts&lt;/code&gt; (or &lt;code&gt;index.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;It's a common and good practice to separate the &lt;strong&gt;Express application setup&lt;/strong&gt; from the &lt;strong&gt;server listening part&lt;/strong&gt;. This makes your application more testable, as you can import the Express app instance directly into your test files without needing to start a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/server.ts&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This file is the &lt;strong&gt;entry point for starting the server&lt;/strong&gt;. It's minimal and only concerns itself with initializing the Express application and listening for incoming requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/server.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// or './app' if you use app.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connectDB&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config/database&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Assuming you have a DB config&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="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;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Connect to the database before starting the server&lt;/span&gt;
&lt;span class="nf"&gt;connectDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;src/index.ts&lt;/code&gt; (or &lt;code&gt;app.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;This file is the &lt;strong&gt;core of your application&lt;/strong&gt;. It's where you configure all your middleware, define global settings, and import and register all your feature routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/index.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;helmet&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;helmet&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;compression&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;compression&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&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;./features/auth/auth.route&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;userRoutes&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;./features/users/user.route&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Import other feature routes here&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Global Middleware&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;       &lt;span class="c1"&gt;// Parse JSON body&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt; &lt;span class="c1"&gt;// Parse URL-encoded bodies&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;               &lt;span class="c1"&gt;// Enable Cross-Origin Resource Sharing&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;helmet&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;             &lt;span class="c1"&gt;// Secure HTTP headers&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;        &lt;span class="c1"&gt;// Compress response bodies&lt;/span&gt;

&lt;span class="c1"&gt;// API Routes&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userRoutes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Use other feature routes here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation makes the application's core logic (&lt;code&gt;index.ts&lt;/code&gt;) highly modular and testable, while &lt;code&gt;server.ts&lt;/code&gt; remains a simple, clean entry point for deployment.&lt;/p&gt;

&lt;p&gt;This structure allows for a clear separation of concerns, making your application more modular, robust, and easier to maintain as it grows.&lt;/p&gt;




&lt;p&gt;Now, the below Service-layered Folder Structure is bit common and confusion for me. If you like the Service-layered Folder Structure then use the below one:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Service-layered&lt;/strong&gt; Folder Structure
&lt;/h2&gt;

&lt;p&gt;This structure separates code by its purpose and domain, often combining elements of the Model-View-Controller (MVC) pattern with a service-layer approach.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;             &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="nf"&gt;points &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.,&lt;/span&gt; &lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;          &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Centralized&lt;/span&gt; &lt;span class="nx"&gt;configuration&lt;/span&gt; &lt;span class="nf"&gt;files &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;controllers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;      &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Custom&lt;/span&gt; &lt;span class="nx"&gt;Express&lt;/span&gt; &lt;span class="nf"&gt;middleware &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;          &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt; &lt;span class="nx"&gt;schemas&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;          &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Define&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;endpoints&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="nx"&gt;them&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;controllers&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;        &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Core&lt;/span&gt; &lt;span class="nx"&gt;business&lt;/span&gt; &lt;span class="nx"&gt;logic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;brain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;           &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Shared&lt;/span&gt; &lt;span class="nx"&gt;helper&lt;/span&gt; &lt;span class="nx"&gt;functions&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;reusable&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="sr"&gt;/              # Static files &lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;CSS, JS, images&lt;/span&gt;&lt;span class="err"&gt;)
├──&lt;/span&gt; &lt;span class="nx"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;               &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;All&lt;/span&gt; &lt;span class="nx"&gt;unit&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;integration&lt;/span&gt; &lt;span class="nx"&gt;tests&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;                 &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="nx"&gt;variables&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;local&lt;/span&gt; &lt;span class="nx"&gt;development&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gitignore&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;            &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Main&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="nx"&gt;point&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nx"&gt;README&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Breakdown of Key Folders
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;src/&lt;/code&gt;&lt;/strong&gt;: This is the heart of your application. All your source code lives here, keeping the project root clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;config/&lt;/code&gt;&lt;/strong&gt;: This folder centralizes all your application configurations. Never hardcode sensitive information like API keys or database credentials. Use a &lt;code&gt;.env&lt;/code&gt; file and a library like &lt;code&gt;dotenv&lt;/code&gt; to manage them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;controllers/&lt;/code&gt;&lt;/strong&gt;: These files are responsible for handling incoming HTTP requests. A controller's job is simple: take the request, validate the data, call the appropriate &lt;strong&gt;service&lt;/strong&gt; to perform the business logic, and send a response. They should contain minimal logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;middleware/&lt;/code&gt;&lt;/strong&gt;: Store custom Express middleware here. This is where you'll put functions for things like authentication, error handling, request logging, or rate limiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;models/&lt;/code&gt;&lt;/strong&gt;: In a database-driven application, this is where you'd define your database schemas (e.g., with Mongoose for MongoDB or Sequelize for a SQL database). These models provide a structured way to interact with your data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;routes/&lt;/code&gt;&lt;/strong&gt;: This folder contains the definitions of all your API endpoints. Each file should group related routes together (e.g., &lt;code&gt;user.routes.js&lt;/code&gt;, &lt;code&gt;product.routes.js&lt;/code&gt;). The routes file's sole purpose is to map an HTTP method and path to a &lt;strong&gt;controller&lt;/strong&gt; function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;services/&lt;/code&gt;&lt;/strong&gt;: This is a crucial folder that contains all your core &lt;strong&gt;business logic&lt;/strong&gt;. This layer is responsible for complex operations, interacting with models, and orchestrating tasks. By separating this logic from the controllers, you make your code reusable and much easier to test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;utils/&lt;/code&gt;&lt;/strong&gt;: This is a catch-all for small, reusable helper functions that don't fit into any other category. Examples include functions for password hashing, token generation, or data formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;public/&lt;/code&gt;&lt;/strong&gt;: If your web app serves static assets, like CSS, JavaScript files, or images, put them here. This folder is typically exposed directly to the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tests/&lt;/code&gt;&lt;/strong&gt;: A dedicated folder for all your unit and integration tests. Organize them to mirror your &lt;code&gt;src&lt;/code&gt; directory to make it easy to find tests for specific components.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Enjoyed this post?
&lt;/h3&gt;

&lt;p&gt;Stay updated with the latest tech trends! Follow me on Instagram: &lt;a href="https://www.instagram.com/pramodboda.art/" rel="noopener noreferrer"&gt;@pramodboda.art&lt;/a&gt; and &lt;a href="https://www.instagram.com/pramodboda.codevik/" rel="noopener noreferrer"&gt;@pramodboda.codevik&lt;/a&gt;.&lt;br&gt;
let me know your thoughts! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>node</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>Mastering HTTP Methods in Node.js (Express): Quick Reference Guide</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Fri, 18 Jul 2025 15:20:58 +0000</pubDate>
      <link>https://forem.com/pramod_boda/mastering-http-methods-in-nodejs-express-quick-reference-guide-57o5</link>
      <guid>https://forem.com/pramod_boda/mastering-http-methods-in-nodejs-express-quick-reference-guide-57o5</guid>
      <description>&lt;h3&gt;
  
  
  HTTP Methods: Definitions &amp;amp; Descriptions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Definition / Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Retrieve&lt;/strong&gt; data from a server at the specified resource. It is &lt;strong&gt;read-only&lt;/strong&gt; and should have &lt;strong&gt;no side effects&lt;/strong&gt; (i.e., not modify data). Commonly used for fetching lists, details, or static content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Submit data&lt;/strong&gt; to the server to &lt;strong&gt;create a new resource&lt;/strong&gt;. The server processes the request and returns the new resource or a success status. Used in forms, sign-ups, data submissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Replace&lt;/strong&gt; an existing resource entirely with the provided data. If the resource does not exist, some APIs may create it (though this is debated). Used for complete updates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Partially update&lt;/strong&gt; an existing resource. Only the fields sent in the request are modified; others remain unchanged. More efficient than PUT for small changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Remove&lt;/strong&gt; a resource from the server. It targets a specific resource or dataset. Often used for deleting users, posts, files, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HEAD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;GET&lt;/code&gt;, but only returns &lt;strong&gt;headers&lt;/strong&gt;, not the response body. Useful for checking if a resource exists or retrieving metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OPTIONS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;strong&gt;allowed HTTP methods&lt;/strong&gt; and CORS policies for a resource. Often used in preflight requests in cross-origin setups.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TRACE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Echoes back the received request. Mostly used for &lt;strong&gt;debugging&lt;/strong&gt; and testing, but generally &lt;strong&gt;disabled for security reasons&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CONNECT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Establishes a &lt;strong&gt;tunnel&lt;/strong&gt;, typically for &lt;strong&gt;HTTPS&lt;/strong&gt; connections through proxies. Rarely used in app-level programming.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Mastering HTTP Methods in Node.js (Express.js)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Node.js Method (Express.js)&lt;/th&gt;
&lt;th&gt;Usage Description&lt;/th&gt;
&lt;th&gt;Typical Responses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app.get('/route')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch data without causing side effects.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app.post('/route')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit data to create a resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;201 Created&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;409 Conflict&lt;/code&gt;, &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;, &lt;code&gt;500 Internal Server Error&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app.put('/route/:id')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update/replace a full resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app.patch('/route/:id')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Partially update a resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app.delete('/route/:id')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a resource by ID or criteria.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Typical HTTP Response Codes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;Request succeeded (GET, PUT, PATCH, DELETE).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;201&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;Resource created successfully (POST).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;204&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No Content&lt;/td&gt;
&lt;td&gt;Success with no body returned.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bad Request&lt;/td&gt;
&lt;td&gt;Invalid input or request syntax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;Authentication is required or failed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forbidden&lt;/td&gt;
&lt;td&gt;Authenticated but not authorized.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not Found&lt;/td&gt;
&lt;td&gt;Resource doesn’t exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;409&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;Resource already exists or version conflict.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unprocessable Entity&lt;/td&gt;
&lt;td&gt;Validation passed structurally but failed semantically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal Server Error&lt;/td&gt;
&lt;td&gt;Unexpected error on server side.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Mastering HTTP Methods in Spring Boot: Quick Reference Guide</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Mon, 09 Jun 2025 14:35:42 +0000</pubDate>
      <link>https://forem.com/pramod_boda/mastering-http-methods-in-spring-boot-quick-reference-guide-145e</link>
      <guid>https://forem.com/pramod_boda/mastering-http-methods-in-spring-boot-quick-reference-guide-145e</guid>
      <description>&lt;h3&gt;
  
  
  HTTP Methods: Definitions &amp;amp; Descriptions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Definition / Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Retrieve&lt;/strong&gt; data from a server at the specified resource. It is &lt;strong&gt;read-only&lt;/strong&gt; and should have &lt;strong&gt;no side effects&lt;/strong&gt; (i.e., not modify data). Commonly used for fetching lists, details, or static content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Submit data&lt;/strong&gt; to the server to &lt;strong&gt;create a new resource&lt;/strong&gt;. The server processes the request and returns the new resource or a success status. Used in forms, sign-ups, data submissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Replace&lt;/strong&gt; an existing resource entirely with the provided data. If the resource does not exist, some APIs may create it (though this is debated). Used for complete updates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Partially update&lt;/strong&gt; an existing resource. Only the fields sent in the request are modified; others remain unchanged. More efficient than PUT for small changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Remove&lt;/strong&gt; a resource from the server. It targets a specific resource or dataset. Often used for deleting users, posts, files, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HEAD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;GET&lt;/code&gt;, but only returns &lt;strong&gt;headers&lt;/strong&gt;, not the response body. Useful for checking if a resource exists or retrieving metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OPTIONS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;strong&gt;allowed HTTP methods&lt;/strong&gt; and CORS policies for a resource. Often used in preflight requests in cross-origin setups.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TRACE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Echoes back the received request. Mostly used for &lt;strong&gt;debugging&lt;/strong&gt; and testing, but generally &lt;strong&gt;disabled for security reasons&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CONNECT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Establishes a &lt;strong&gt;tunnel&lt;/strong&gt;, typically for &lt;strong&gt;HTTPS&lt;/strong&gt; connections through proxies. Rarely used in app-level programming.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Mastering HTTP Methods in Spring Boot
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Spring Boot Annotation&lt;/th&gt;
&lt;th&gt;Usage Description&lt;/th&gt;
&lt;th&gt;Typical Responses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@GetMapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve resource(s) without modifying anything.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@PostMapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;201 Created&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;409 Conflict&lt;/code&gt;, &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;, &lt;code&gt;500 Internal Server Error&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@PutMapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replace an existing resource entirely.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@PatchMapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update a part of the existing resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@DeleteMapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a resource.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;204 No Content&lt;/code&gt;, &lt;code&gt;404 Not Found&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Typical HTTP Response Codes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;Request succeeded (GET, PUT, PATCH, DELETE).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;201&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;Resource created successfully (POST).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;204&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No Content&lt;/td&gt;
&lt;td&gt;Success with no body returned.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bad Request&lt;/td&gt;
&lt;td&gt;Invalid input or request syntax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;Authentication is required or failed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forbidden&lt;/td&gt;
&lt;td&gt;Authenticated but not authorized.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not Found&lt;/td&gt;
&lt;td&gt;Resource doesn’t exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;409&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;Resource already exists or version conflict.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unprocessable Entity&lt;/td&gt;
&lt;td&gt;Validation passed structurally but failed semantically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal Server Error&lt;/td&gt;
&lt;td&gt;Unexpected error on server side.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Part 2: Building Advanced useDateFormatter Hook with dayjs, UTC &amp; Timezone Support</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Tue, 29 Apr 2025 12:06:05 +0000</pubDate>
      <link>https://forem.com/pramod_boda/part-2-building-advanced-usedateformatter-hook-with-dayjs-utc-timezone-support-1aii</link>
      <guid>https://forem.com/pramod_boda/part-2-building-advanced-usedateformatter-hook-with-dayjs-utc-timezone-support-1aii</guid>
      <description>&lt;p&gt;Subject: Handle any date from any timezone, precisely and predictably — with the help of &lt;code&gt;dayjs&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  📦 Why Move Beyond Native Date Formatting?
&lt;/h4&gt;

&lt;p&gt;In Part 1, &lt;a href="https://dev.to/pramod_boda/part-1-stop-formatting-dates-in-postgresql-lets-create-a-reusable-usedateformatter-hook-in-1ig"&gt;we built a clean &lt;code&gt;useDateFormatter&lt;/code&gt; hook using JavaScript’s built-in &lt;code&gt;Intl.DateTimeFormat&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That works great for simple needs — but what if you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show dates in a specific timezone (e.g. always show in "&lt;code&gt;Asia/Kolkata&lt;/code&gt;")&lt;/li&gt;
&lt;li&gt;Format dates like &lt;code&gt;YYYY-MM-DD HH:mm A&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Do math like "3 days from now" or "subtract 2 hours"?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💥 That’s where &lt;code&gt;dayjs&lt;/code&gt; shines.&lt;/p&gt;




&lt;h4&gt;
  
  
  🧰 Step 1: Install dayjs with Plugins
&lt;/h4&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
npm &lt;span class="nb"&gt;install &lt;/span&gt;dayjs-plugin-utc dayjs-plugin-timezone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now lets build a superior &lt;code&gt;useDateFormatter&lt;/code&gt; custom React hook to auto-detect timezone and format dates cleanly.&lt;/p&gt;

&lt;h4&gt;
  
  
  🧠 Step 2: Create useDateFormatter with dayjs
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hooks/useDateFormatter.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;utc&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/plugin/utc&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;timezone&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/plugin/timezone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FormatOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;         &lt;span class="c1"&gt;// e.g. 'YYYY-MM-DD HH:mm'&lt;/span&gt;
  &lt;span class="nl"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// e.g. 'Asia/Kolkata'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDateFormatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormatOptions&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="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="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;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;N/A&lt;/span&gt;&lt;span class="dl"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MMM D, YYYY h:mm A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;guess&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="nx"&gt;options&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;dayjs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timezone&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="nx"&gt;format&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;error&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Date&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formatDate&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;h4&gt;
  
  
  🧪 Example Usage in a Component
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/EventCard.tsx&lt;/span&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useDateFormatter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../hooks/useDateFormatter&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;EventCard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;startDate&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formatDate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDateFormatter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt; &lt;span class="nx"&gt;Starts&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h3&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&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;formatDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Asia/Kolkata&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dddd, MMM D [at] h:mm A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;EventCard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Even if it's just 1 line inside the helper — it's worth it.&lt;/p&gt;




&lt;p&gt;🌏 Bonus Example – Showing in User’s Local Time&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;formatDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-04-29T12:00:00Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DD-MM-YYYY hh:mm A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dayjs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// User's current zone&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  🧪 Output Examples
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input UTC Date&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Timezone&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-29T12:00:00Z&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"MMM D, YYYY h:mm A"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Asia/Kolkata&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apr 29, 2025 5:30 PM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-29T12:00:00Z&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"YYYY-MM-DD HH:mm"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;America/New_York&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2025-04-29 08:00&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h4&gt;
  
  
  🆚 Native vs Day.js Summary
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Native &lt;code&gt;Intl&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;&lt;code&gt;dayjs&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Localized output&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timezone support&lt;/td&gt;
&lt;td&gt;⚠️ Limited&lt;/td&gt;
&lt;td&gt;✅ Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom format strings&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add/subtract time&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parsing &amp;amp; validation&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightweight&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (~5KB with plugins)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h4&gt;
  
  
  🧼 Final Thoughts
&lt;/h4&gt;

&lt;p&gt;Use native if your needs are simple and performance is key.&lt;br&gt;
Use &lt;code&gt;dayjs&lt;/code&gt; if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need timezone handling&lt;/li&gt;
&lt;li&gt;Want full control over format&lt;/li&gt;
&lt;li&gt;Are working with global users or scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ This is exactly how big production dashboards (admin panels, SaaS apps) build it professionally.&lt;/p&gt;




&lt;p&gt;🧩 Missed Part 1?&lt;br&gt;
👉 Go back to the &lt;strong&gt;&lt;a href="https://dev.to/pramod_boda/part-1-stop-formatting-dates-in-postgresql-lets-create-a-reusable-usedateformatter-hook-in-1ig"&gt;Native useDateFormatter without libraries&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactjsdevelopment</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Part 1: Stop Formatting Dates in Database!, lets Create a Reusable useDateFormatter Hook in React (with TypeScript)</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Tue, 29 Apr 2025 12:05:54 +0000</pubDate>
      <link>https://forem.com/pramod_boda/part-1-stop-formatting-dates-in-postgresql-lets-create-a-reusable-usedateformatter-hook-in-1ig</link>
      <guid>https://forem.com/pramod_boda/part-1-stop-formatting-dates-in-postgresql-lets-create-a-reusable-usedateformatter-hook-in-1ig</guid>
      <description>&lt;p&gt;Subject: Let build &lt;code&gt;useDateFormatter&lt;/code&gt; react custom hook without any libraries only with Native JavaScript.&lt;/p&gt;

&lt;p&gt;Have you ever seen a date like this in your app that comes from the backend?&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="s2"&gt;"2024-04-29T07:30:00.000Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And wondered why it looks weird, or why it's showing the wrong time?&lt;br&gt;
That’s because dates coming from a backend (like Node.js + PostgreSQL) are usually in ISO format, in UTC time, and not user-friendly.&lt;/p&gt;
&lt;h4&gt;
  
  
  🚫 The Wrong Way: Using TO_CHAR in PostgreSQL
&lt;/h4&gt;

&lt;p&gt;This is what many people do in their SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emp_join_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'DD-MM-YYYY'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;emp_join_date&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;output:&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="s2"&gt;"29-04-2025"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and thought, “Looks fine, right?”&lt;/p&gt;

&lt;p&gt;👎 Nope. That format might look nice, but it breaks a lot of things in your app later.&lt;/p&gt;

&lt;p&gt;Let’s understand why it's bad to format dates in PostgreSQL, and then fix it using a clean, reusable React &lt;code&gt;useDateFormatter&lt;/code&gt; custom hook.&lt;/p&gt;

&lt;p&gt;Here's why it causes real problems:&lt;/p&gt;

&lt;h4&gt;
  
  
  ❌ Disadvantages of TO_CHAR(date, 'DD-MM-YYYY')
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Why it’s bad&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Loses Date Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TO_CHAR&lt;/code&gt; turns your date into a plain &lt;strong&gt;text string&lt;/strong&gt;. So the frontend &lt;strong&gt;can't sort&lt;/strong&gt;, &lt;strong&gt;compare&lt;/strong&gt;, or &lt;strong&gt;manipulate&lt;/strong&gt; it like a real &lt;code&gt;Date&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Not ISO/Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;'DD-MM-YYYY'&lt;/code&gt; is not a universal format. JS expects ISO like &lt;code&gt;'2025-04-29T00:00:00Z'&lt;/code&gt;. Manual parsing is needed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Hard to Re-format Later&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;If frontend wants to show it as &lt;code&gt;April 29, 2025&lt;/code&gt; or local time — you can't. It’s just a string!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. No Time Info&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You lose the hours, minutes, seconds — which might matter for logs, tickets, comments, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. No Timezone Awareness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;There's no way to tell if the date was in UTC, IST, PST, etc. You risk showing wrong times to users.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h4&gt;
  
  
  ✅ The Right Way: Send Raw Dates (as ISO) from Backend
&lt;/h4&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp_join_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'DD-MM-YYYY'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;emp_join_date&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;emp_join_date&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let the date stay as a proper timestamp or ISO string &lt;code&gt;("2025-04-29T00:00:00.000Z")&lt;/code&gt;, and then format it in React using a reusable hook.&lt;/p&gt;




&lt;blockquote&gt;
&lt;h2&gt;
  
  
  💡 &lt;strong&gt;Solution 1:&lt;/strong&gt; A fundamental approach.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🔧 The Reusable useDateFormatter React Hook
&lt;/h4&gt;

&lt;p&gt;Let’s build a simple hook in TypeScript that works in any component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hooks/useDateFormatter.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FormatOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DateTimeFormatOptions&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;defaultOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormatOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;short&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2-digit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDateFormatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="na"&gt;dateInput&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormatOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultOptions&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="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;dateInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;N/A&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;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dateInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isNaN&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;getTime&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&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="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// locale-aware&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;formatDate&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;h4&gt;
  
  
  🧪 Example Usage in a Component
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/EmployeeCard.tsx&lt;/span&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useDateFormatter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../hooks/useDateFormatter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;emp_join_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EmployeeCard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;emp&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formatDate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDateFormatter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Joined on: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;formatDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emp_join_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;EmployeeCard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  ⚡ Real-World Use Case
&lt;/h4&gt;

&lt;p&gt;Imagine you're building an HR dashboard. If the date is a string like "&lt;code&gt;29-04-2025&lt;/code&gt;", this fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;29-04-2025&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Invalid Date in many browsers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if you get a raw ISO date like "&lt;code&gt;2025-04-29T00:00:00Z&lt;/code&gt;", it's perfect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-04-29T00:00:00Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Works everywhere&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;useDateFormatter&lt;/code&gt; formats it for display.&lt;/p&gt;




&lt;h4&gt;
  
  
  When to Use Just Native &lt;code&gt;Intl.DateTimeFormat&lt;/code&gt; (like the above solution1)
&lt;/h4&gt;

&lt;p&gt;✅ Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero dependencies — no need to install any libraries.&lt;/li&gt;
&lt;li&gt;Lightweight — perfect for small apps or dashboards.&lt;/li&gt;
&lt;li&gt;Localized formatting based on user’s browser language.&lt;/li&gt;
&lt;li&gt;Handles common formatting needs: short/long date, time, etc.
Works great for:&lt;/li&gt;
&lt;li&gt;Showing dates like "&lt;code&gt;Apr 29, 2025, 10:00 AM&lt;/code&gt;"&lt;/li&gt;
&lt;li&gt;Safe fallback behavior for invalid/missing dates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited support for custom formats like "&lt;code&gt;YYYY-MM-DD HH:mm&lt;/code&gt;".&lt;/li&gt;
&lt;li&gt;Hard to manipulate dates (e.g. add/subtract days, set timezones).&lt;/li&gt;
&lt;li&gt;Browser support for time zones via Intl.DateTimeFormat is decent, but not fully flexible like &lt;code&gt;dayjs&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Now you know how to format dates cleanly using native JavaScript!&lt;br&gt;&lt;br&gt;
But what if you need &lt;strong&gt;timezones, custom formats, or date math&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://dev.to/pramod_boda/part-2-building-advanced-usedateformatter-hook-with-dayjs-utc-timezone-support-1aii"&gt;Read Part 2: Building &lt;code&gt;useDateFormatter&lt;/code&gt; with &lt;code&gt;dayjs&lt;/code&gt; + timezone support&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>reactjsdevelopment</category>
    </item>
    <item>
      <title>URL vs. URI</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Fri, 04 Apr 2025 07:17:08 +0000</pubDate>
      <link>https://forem.com/pramod_boda/url-vs-uri-1n82</link>
      <guid>https://forem.com/pramod_boda/url-vs-uri-1n82</guid>
      <description>&lt;p&gt;&lt;strong&gt;URL stands for (Uniform Resource Locator)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URI stands for (Uniform Resource Identifier)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both &lt;strong&gt;URL&lt;/strong&gt;  and &lt;strong&gt;URI&lt;/strong&gt;  are used to identify resources on the internet, but they have distinct meanings.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;URL - Uniform Resource Locator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A specific type of URI that provides the location (address) of a resource along with the means to access it. &lt;/p&gt;

&lt;p&gt;means its a specific type of URI that &lt;strong&gt;tells where the resource is located and how to access it&lt;/strong&gt; (includes a protocol like Protocol (&lt;code&gt;http&lt;/code&gt;, &lt;code&gt;https&lt;/code&gt;, &lt;code&gt;ftp&lt;/code&gt;), domain, path, and sometimes query parameters., etc.).&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Example of URLs (all are also URIs):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;https://www.google.com&lt;/code&gt; → Identifies and locates the Google homepage.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ftp://files.pramodboda.com/myfile.zip&lt;/code&gt; → Provides the file location and how to access it via FTP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://pramodboda.com/products?id=1234&lt;/code&gt; → Identifies and locates a product page.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;URI - Uniform Resource Identifier&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A broader term that includes both URLs (which specify location) and URNs (which specify names without location).&lt;/p&gt;

&lt;p&gt;means anything that uniquely identifies a resource.&lt;/p&gt;

&lt;p&gt;Not all URIs are URLs. It can be a &lt;strong&gt;URL&lt;/strong&gt;, a &lt;strong&gt;URN&lt;/strong&gt;, or both.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Example of a URI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mailto:user@codevik.com&lt;/code&gt; → Identifies an email address but doesn’t tell how to retrieve it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;isbn:0451450523&lt;/code&gt; → Identifies a book by its ISBN number (URN, not a URL).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://pramodboda.com/portfolio-page.html&lt;/code&gt; → Identifies and locates a webpage (Both a URL &amp;amp; URI).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Example in &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;✅&lt;/span&gt; &lt;span class="nc"&gt;Correct &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;since&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;s a full web address)
API_URL=http://localhost:5000/api/
DB_USER_URI=postgres
DB_HOST_URI=localhost

❌ Less accurate (but would still work)
API_URI=http://localhost:5000/api/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Simple Analogy&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL is like a full address&lt;/strong&gt; (house number, street, city, and country).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URI is like a name&lt;/strong&gt; (it can be an address but may also just be an identifier).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Every &lt;strong&gt;URL is a URI&lt;/strong&gt; because it identifies a resource.&lt;/li&gt;
&lt;li&gt;Not every &lt;strong&gt;URI is a URL&lt;/strong&gt;, as some URIs only name a resource but don’t tell how to access it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enjoyed this post?
&lt;/h3&gt;

&lt;p&gt;Stay updated with the latest tech trends! Follow me on Instagram: @pramodboda.codevik and @pramodboda.art.&lt;/p&gt;

&lt;p&gt;let me know your thoughts! 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>React Router vs. React Router DOM: Key Differences Explained</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Tue, 25 Feb 2025 00:25:14 +0000</pubDate>
      <link>https://forem.com/pramod_boda/what-is-the-difference-between-react-router-and-react-router-dom-2da6</link>
      <guid>https://forem.com/pramod_boda/what-is-the-difference-between-react-router-and-react-router-dom-2da6</guid>
      <description>&lt;p&gt;&lt;code&gt;react-router&lt;/code&gt; and &lt;code&gt;react-router-dom&lt;/code&gt; are libraries used for routing in React applications. They allow you to create single-page applications (SPAs) where navigation between different views or pages happens without a full page reload. Here's a detailed explanation of both:&lt;/p&gt;




&lt;h3&gt;
  
  
  1. What is &lt;code&gt;react-router&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-router&lt;/code&gt; is the &lt;strong&gt;core&lt;/strong&gt; routing library for React applications.&lt;/li&gt;
&lt;li&gt;It provides the basic fundamental routing functionality, such as matching URLs to components and managing navigation. but it does not include anything specific to web applications.&lt;/li&gt;
&lt;li&gt;It contains essential components like &lt;code&gt;Routes&lt;/code&gt;, &lt;code&gt;Route&lt;/code&gt;, and &lt;code&gt;Outlet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It is &lt;strong&gt;framework-agnostic&lt;/strong&gt;, meaning it does not just depend on the web. but it can be used with React for web applications, React Native for mobile apps, or even other environments.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;don't&lt;/strong&gt; typically install or use &lt;code&gt;react-router&lt;/code&gt; directly in web projects.&lt;/li&gt;
&lt;li&gt;This package is used as a foundation for other libraries like &lt;code&gt;react-router-dom&lt;/code&gt; (for web apps) and &lt;code&gt;react-router-native&lt;/code&gt; (for React Native apps).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Features&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Declarative routing (defining routes using components).&lt;/li&gt;
&lt;li&gt;Dynamic routing (routes can be added or removed at runtime).&lt;/li&gt;
&lt;li&gt;Nested routes (routes within routes).&lt;/li&gt;
&lt;li&gt;Programmatic navigation (e.g., redirecting users programmatically).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Use Case&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-router&lt;/code&gt; is typically used as a dependency for other routing libraries like &lt;code&gt;react-router-dom&lt;/code&gt; (for web) or &lt;code&gt;react-router-native&lt;/code&gt; (for mobile).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. What is &lt;strong&gt;&lt;code&gt;react-router-dom&lt;/code&gt;?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-router-dom&lt;/code&gt; is the &lt;strong&gt;official routing library for React web applications&lt;/strong&gt;. It is built on top of &lt;code&gt;react-router&lt;/code&gt; and provides additional components and hooks specifically designed for web development.&lt;/li&gt;
&lt;li&gt;It provides additional web-related components like &lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;HashRouter&lt;/code&gt;, &lt;code&gt;Link&lt;/code&gt;, &lt;code&gt;NavLink&lt;/code&gt;, and hooks like &lt;code&gt;useNavigate&lt;/code&gt;, &lt;code&gt;useParams&lt;/code&gt;, and &lt;code&gt;useLocation&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Features&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;BrowserRouter&lt;/code&gt;&lt;/strong&gt;: Uses the HTML5 History API (&lt;code&gt;pushState&lt;/code&gt;, &lt;code&gt;replaceState&lt;/code&gt;, etc.) to keep the UI in sync with the URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;HashRouter&lt;/code&gt;&lt;/strong&gt;: Uses the hash portion of the URL (e.g., &lt;code&gt;#/about&lt;/code&gt;) for routing, which is useful for older browsers or static deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Link&lt;/code&gt; and &lt;code&gt;NavLink&lt;/code&gt;&lt;/strong&gt;: Components for creating navigation links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useHistory&lt;/code&gt;&lt;/strong&gt; (in older versions, replaced with &lt;strong&gt;&lt;code&gt;useNavigate&lt;/code&gt;&lt;/strong&gt; in v6)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useNavigate&lt;/code&gt;&lt;/strong&gt;: A hook for programmatic navigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useParams&lt;/code&gt;&lt;/strong&gt;: A hook for accessing route parameters (e.g., &lt;code&gt;:id&lt;/code&gt; in &lt;code&gt;/users/:id&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useLocation&lt;/code&gt;&lt;/strong&gt;: A hook for accessing the current URL location.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Use Case&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-router-dom&lt;/code&gt; is used for building web applications with client-side routing. It is the most common choice for React web apps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Key Differences Between &lt;code&gt;react-router&lt;/code&gt; and &lt;code&gt;react-router-dom&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;&lt;code&gt;react-router&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;&lt;code&gt;react-router-dom&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Core routing library for React&lt;/td&gt;
&lt;td&gt;Web-specific routing library for React apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web/ Browser Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No direct support&lt;/td&gt;
&lt;td&gt;Supports web routing (&lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;HashRouter&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No UI components. Basic essential routing components like &lt;code&gt;Routes&lt;/code&gt;, &lt;code&gt;Route&lt;/code&gt; and &lt;code&gt;Outlet&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Web-specific components like &lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;Link&lt;/code&gt;, &lt;code&gt;NavLink&lt;/code&gt; etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic routing hooks&lt;/td&gt;
&lt;td&gt;Web-specific hooks like &lt;code&gt;useNavigate&lt;/code&gt;, &lt;code&gt;useLocation&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Works with React, React Native, etc.&lt;/td&gt;
&lt;td&gt;Specifically for web applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independent&lt;/td&gt;
&lt;td&gt;Depends on &lt;code&gt;react-router&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;To use &lt;code&gt;react-router-dom&lt;/code&gt; in your project, install it via npm or yarn:&lt;/p&gt;

&lt;p&gt;npm:&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-router-dom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or with yarn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add react-router-dom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Example Usage of &lt;code&gt;react-router-dom&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Basic Routing Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="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="s1"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&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;Home&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;./Home&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;About&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;./About&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;UserProfile&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;./UserProfile&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;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/user/123"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;User Profile&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;About&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/user/:id"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserProfile&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using &lt;code&gt;useNavigate&lt;/code&gt; for Programmatic Navigation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="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="s1"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-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;function&lt;/span&gt; &lt;span class="nf"&gt;LoginButton&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;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useNavigate&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;handleLogin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Perform login logic&lt;/span&gt;
    &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Redirect to the dashboard after login&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleLogin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;LoginButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using &lt;code&gt;useParams&lt;/code&gt; to Access Route Parameters:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="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="s1"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useParams&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-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;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useParams&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Access the `id` parameter from the URL&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;User ID: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. How They Work Together?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-router-dom&lt;/code&gt; is built on top of &lt;code&gt;react-router&lt;/code&gt;. It extends the core functionality of &lt;code&gt;react-router&lt;/code&gt; with web-specific features.&lt;/li&gt;
&lt;li&gt;When you install &lt;code&gt;react-router-dom&lt;/code&gt;, it automatically includes &lt;code&gt;react-router&lt;/code&gt; as a dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Which One Should You Use?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you are building a &lt;strong&gt;React web application&lt;/strong&gt;, use &lt;code&gt;react-router-dom&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you are creating a &lt;strong&gt;library&lt;/strong&gt; or a &lt;strong&gt;React Native app&lt;/strong&gt;, use &lt;code&gt;react-router&lt;/code&gt; (along with &lt;code&gt;react-router-native&lt;/code&gt; for mobile apps).&lt;/li&gt;
&lt;li&gt;If you're creating a &lt;strong&gt;custom routing solution&lt;/strong&gt;, you might need &lt;code&gt;react-router&lt;/code&gt; internally.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. What Has Changed in 2025?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Router v6+&lt;/strong&gt; is now the standard, focusing on component-based routing.&lt;/li&gt;
&lt;li&gt;Hooks like &lt;code&gt;useHistory&lt;/code&gt; (deprecated) are fully replaced by &lt;code&gt;useNavigate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-router&lt;/code&gt; is rarely used directly in web projects, while &lt;code&gt;react-router-dom&lt;/code&gt; is the main package for web routing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;react-router&lt;/code&gt;&lt;/strong&gt;: The core routing library for React.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;react-router-dom&lt;/code&gt;&lt;/strong&gt;: The web-specific routing library built on top of &lt;code&gt;react-router&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;react-router-dom&lt;/code&gt; for web applications to take advantage of web-specific features like &lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;Link&lt;/code&gt;, and &lt;code&gt;useNavigate&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building a web application, you only need to install and use &lt;code&gt;react-router-dom&lt;/code&gt;. It will automatically include &lt;code&gt;react-router&lt;/code&gt; as a dependency.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Recommended Folder Structure for React 2025</title>
      <dc:creator>Pramod Boda</dc:creator>
      <pubDate>Fri, 21 Feb 2025 11:38:02 +0000</pubDate>
      <link>https://forem.com/pramod_boda/recommended-folder-structure-for-react-2025-48mc</link>
      <guid>https://forem.com/pramod_boda/recommended-folder-structure-for-react-2025-48mc</guid>
      <description>&lt;p&gt;For a &lt;strong&gt;React project&lt;/strong&gt; in &lt;strong&gt;2025&lt;/strong&gt;, a well-organized folder structure is essential for maintainability, scalability, and ease of collaboration. The structure should be modular, flexible, and adaptable to different types of projects, whether you're building a small app or a large-scale enterprise application.&lt;/p&gt;

&lt;p&gt;Here’s an updated folder structure for modern React projects, keeping in mind &lt;strong&gt;best practices&lt;/strong&gt;, &lt;strong&gt;scalability&lt;/strong&gt;, and &lt;strong&gt;performance&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Root Directory&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At the root of your project, you should have these typical files and directories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/my-app
  ├── /public/
  ├── /src/
  ├── /assets/
  ├── .gitignore
  ├── package.json
  ├── README.md
  ├── tsconfig.json &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;TypeScript projects&lt;span class="o"&gt;)&lt;/span&gt;
  ├── vite.config.js &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;Vite projects&lt;span class="o"&gt;)&lt;/span&gt;
  └── .eslintrc.json &lt;span class="o"&gt;(&lt;/span&gt;or .eslint.js&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Folder Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/public&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;public&lt;/strong&gt; folder contains static files that are served directly to the browser, such as the &lt;code&gt;index.html&lt;/code&gt;, images, and other assets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/public
  ├── index.html
  ├── favicon.ico
  └── /images/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;/src&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;src&lt;/code&gt;&lt;/strong&gt; folder is where all of your React application code resides. This is where you'll spend most of your time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/src
  ├── /assets/           &lt;span class="c"&gt;# Static assets (images, fonts, etc.)&lt;/span&gt;
  ├── /components/       &lt;span class="c"&gt;# Reusable components&lt;/span&gt;
  ├── /features/         &lt;span class="c"&gt;# Feature-specific logic and components (could be feature folders)&lt;/span&gt;
  ├── /hooks/            &lt;span class="c"&gt;# Custom React hooks&lt;/span&gt;
  ├── /layouts/          &lt;span class="c"&gt;# Layout components (e.g., Header, Footer, Sidebar)&lt;/span&gt;
  ├── /pages/            &lt;span class="c"&gt;# Page components (routes)&lt;/span&gt;
  ├── /services/         &lt;span class="c"&gt;# API requests, utilities, external service integrations&lt;/span&gt;
  ├── /store/            &lt;span class="c"&gt;# State management (Redux, Zustand, Context API)&lt;/span&gt;
  ├── /styles/           &lt;span class="c"&gt;# Global styles (CSS, SASS, Styled Components)&lt;/span&gt;
  ├── /types/            &lt;span class="c"&gt;# TypeScript types (if using TS)&lt;/span&gt;
  ├── /utils/            &lt;span class="c"&gt;# Utility functions, helpers, and constants&lt;/span&gt;
  ├── /app.tsx           &lt;span class="c"&gt;# App component (entry point)&lt;/span&gt;
  ├── /index.tsx         &lt;span class="c"&gt;# Main entry point for React&lt;/span&gt;
  ├── /router.tsx        &lt;span class="c"&gt;# Routing (React Router setup)&lt;/span&gt;
  └── /config/           &lt;span class="c"&gt;# Environment variables and configuration files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Folder Details&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/assets&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Store images, fonts, and other media assets here.&lt;/li&gt;
&lt;li&gt;It's optional to break this into subfolders (e.g., &lt;code&gt;/images&lt;/code&gt;, &lt;code&gt;/fonts&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/components&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contains all &lt;strong&gt;reusable&lt;/strong&gt; UI components that can be shared across different parts of your app.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/components
  ├── Button.tsx
  ├── Modal.tsx
  └── Navbar.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/features&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organize your components, hooks, and logic by &lt;strong&gt;features&lt;/strong&gt; (also called &lt;strong&gt;domain-based structure&lt;/strong&gt;). This helps separate code based on functionality rather than by component type, promoting better scalability and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/features
  ├── /auth/           &lt;span class="c"&gt;# Authentication-related components, hooks, reducers&lt;/span&gt;
  ├── /dashboard/      &lt;span class="c"&gt;# Dashboard components, hooks, etc.&lt;/span&gt;
  └── /profile/        &lt;span class="c"&gt;# Profile-related components&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/hooks&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store &lt;strong&gt;custom hooks&lt;/strong&gt; that can be reused across your app, such as data fetching, form handling, etc.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/hooks
  ├── useAuth.ts
  ├── useFetch.ts
  └── useForm.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/layouts&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layout components like Header, Sidebar, Footer, etc., that are used across multiple pages.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/layouts
  ├── MainLayout.tsx
  ├── AdminLayout.tsx
  └── DashboardLayout.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/pages&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contains &lt;strong&gt;page-level components&lt;/strong&gt; (typically mapped to routes) that use the components from &lt;code&gt;/features&lt;/code&gt; or &lt;code&gt;/components&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/pages
    ├── Auth/
    │   └── SignInPage.tsx
    │   └── SignUpPage.tsx
  ├── Dashboard.tsx
  ├── Home.tsx
  ├── Users.tsx
  ├── Prodcuts.tsx
  └── ContactUs.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/services&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions for &lt;strong&gt;API requests&lt;/strong&gt;, integrating third-party services, or utilities that handle external communication.&lt;/li&gt;
&lt;li&gt;This could also be the place for service hooks or API-related logic.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/services
  ├── authService.ts   &lt;span class="c"&gt;# Authentication API&lt;/span&gt;
  └── apiService.ts    &lt;span class="c"&gt;# General API calls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/store&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you’re using a &lt;strong&gt;state management&lt;/strong&gt; solution like Redux, Zustand, or Context API, keep the logic and actions here.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example (if using Redux):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/store
  ├── /auth/          &lt;span class="c"&gt;# Auth-related Redux slices&lt;/span&gt;
  ├── /user/          &lt;span class="c"&gt;# User-related Redux slices&lt;/span&gt;
  └── store.ts        &lt;span class="c"&gt;# Global store configuration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/styles&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store global styles, theme files, or any &lt;strong&gt;CSS/SASS&lt;/strong&gt; or &lt;strong&gt;CSS-in-JS&lt;/strong&gt; styles here.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/styles
  ├── index.css
  ├── theme.ts        &lt;span class="c"&gt;# For theme configuration in styled-components&lt;/span&gt;
  └── global.scss     &lt;span class="c"&gt;# Global styles for the app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/types&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If using TypeScript, store your custom &lt;strong&gt;types&lt;/strong&gt; or interfaces here for easier management and reusability.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/types
  ├── auth.d.ts       &lt;span class="c"&gt;# Types for authentication-related data&lt;/span&gt;
  ├── api.d.ts        &lt;span class="c"&gt;# Types for API responses&lt;/span&gt;
  └── user.d.ts       &lt;span class="c"&gt;# Types for user objects&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/utils&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General utility functions that are used across your app (e.g., date formatting, data validation, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/utils
  ├── formatDate.ts
  └── validateEmail.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/config&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store environment variables or app configuration settings here, such as the API base URL, feature flags, etc.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/config
  ├── index.ts        &lt;span class="c"&gt;# Export environment variables and configurations&lt;/span&gt;
  ├── config.ts       &lt;span class="c"&gt;# Configuration file for app set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This folder structure provides a flexible, scalable, and maintainable setup for React applications in 2025. It focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modularity&lt;/strong&gt;: Organizing by features or domains (vs. just by components).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Components, hooks, and utilities can be easily shared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: As your project grows, the structure allows for easy addition of new features or pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of Concerns&lt;/strong&gt;: Each part of the app (state, services, components) has its own dedicated space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure works for both &lt;strong&gt;small projects&lt;/strong&gt; and &lt;strong&gt;large-scale applications&lt;/strong&gt;. You can always adjust the specifics depending on the complexity and requirements of your app.&lt;/p&gt;




&lt;h3&gt;
  
  
  Enjoyed this post?
&lt;/h3&gt;

&lt;p&gt;Stay updated with the latest tech trends! Follow me on Instagram: @pramodboda.codevik and @pramodboda.art.&lt;br&gt;
let me know your thoughts! 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactjsdevelopment</category>
      <category>folderstructure</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
