React.js course ยท Lecture 2 of 27

Setting Up React

A comprehensive masterclass guide covering Node.js & npm, npm vs npx, Vite build tool, deep project folder structure breakdown (package.json, package-lock.json, node_modules, src, public, index.html), development vs production builds, and hands-on practical setup.

  • 25 min read
  • Beginner to Intermediate
  • 12 topics
  • 19 Sept 2026
  • Ravindra Nath Jha

Understanding Node.js and NPM

Before creating a modern React application, we must understand the environment that powers modern JavaScript toolchains: Node.js and NPM.

  • What is Node.js?

Node.js is an open-source, cross-platform JavaScript runtime environment built on Google Chrome's V8 engine. It allows developers to run JavaScript code *outside* the web browser (on your computer's operating system or server).

  • Why Do We Need Node.js for React Development?

React code runs inside the browser. However, during development, we write modern JSX, ES6+ modules, and CSS preprocessors that browsers cannot parse natively. We need Node.js to run build tools (like Vite, SWC, or Babel) that transpile, bundle, and serve our React code during development.

  • What is NPM (Node Package Manager)?

NPM is the default package manager for Node.js and the world's largest software registry. It allows developers to install third-party open-source libraries (such as react, react-dom, react-router-dom, tailwindcss, and axios) directly into their projects.

NPM vs. NPX: Key Differences & When to Use Which

Developers often confuse npm and npx. Let's clarify the fundamental differences:

  • NPM (Node Package Manager):
  • Purpose: Installs, updates, and manages project dependencies.
  • Behavior: Downloads packages into your project's local node_modules/ folder or global computer path (npm install -g).
  • Example: npm install react
  • NPX (Node Package Execute):
  • Purpose: Executes Node binaries directly without permanently installing them on your machine.
  • Behavior: Downloads a package to a temporary cache, executes the CLI binary command, and cleans up afterwards.
  • Example: npx create-react-app my-app or npx tailwindcss init
FeatureNPMNPX
Primary FunctionPackage Management (Install/Uninstall)Package Execution (Run CLI commands)
StorageSaves packages in node_modules/Temporarily caches and cleans up
Global Install Needed?Yes, if running CLI commandsNo, runs latest CLI on-demand
Best Used ForAdding libraries like React, Axios, LodashRunning setup scripts like vite or tailwindcss

What is Vite & Why Vite Over Create React App (CRA)?

What is Vite?

Vite (French for "fast", pronounced */veet/*) is a next-generation front-end build tool created by Evan You (the creator of Vue.js). It provides an ultra-fast local development server and optimized production bundler.

Why Has the Industry Abandoned Create React App (CRA) for Vite?

  • The Problem with Create React App (Webpack):

CRA uses Webpack as its bundler. When you run npm start in CRA, Webpack must scan, compile, and bundle *every single file* in your entire application before the local server can start. As your project grows to hundreds of components, server startup time degrades to 30-60 seconds, and Hot Module Replacement (HMR) slows down.

  • How Vite Solves This (Native ES Modules + ESBuild):
  1. Instant Dev Server Start: Vite takes advantage of native browser ES Modules (ESM). It doesn't bundle your code on startup. Instead, it serves source code on-demand as the browser requests each file!
  2. Lightning-Fast Pre-bundling: Vite uses ESBuild (written in Go), which pre-bundles dependencies 10x-100x faster than traditional JavaScript-based bundlers.
  3. Instant Hot Module Replacement (HMR): Editing a file updates only that specific component in the browser in less than 50 milliseconds regardless of application size.

Creating a React Project Step-by-Step

Let's walk through the standard terminal setup for creating a new React application with Vite:

Step 1: Open Your Terminal

Open VS Code Terminal, Windows PowerShell, Command Prompt, or macOS Terminal.

Step 2: Run the Vite Creation Command

npm create vite@latest my-app -- --template react

Step 3: Interactive Prompts (if omitting --template react):

  1. Project name: my-app
  2. Select a framework: React
  3. Select a variant: JavaScript (or TypeScript / React + SWC)

This command instantly creates a directory named my-app/ populated with the modern React template.

Deep Dive into React Project Folder Structure

Let's examine the generated file tree of a modern Vite React application:

JavaScript
my-app/
โ”œโ”€โ”€ ๐Ÿ“ node_modules/       # Installed open-source dependencies
โ”œโ”€โ”€ ๐Ÿ“ public/             # Static un-bundled assets (favicons, public images)
โ”œโ”€โ”€ ๐Ÿ“ src/                # Primary application source code
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ assets/         # Imported component images and SVGs
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ App.css         # Styling for App component
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ App.jsx         # Root React UI Component
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ index.css       # Global baseline CSS stylesheet
โ”‚   โ””โ”€โ”€ ๐Ÿ“„ main.jsx        # JavaScript entry point mounting React
โ”œโ”€โ”€ ๐Ÿ“„ .gitignore          # Files excluded from Git version control
โ”œโ”€โ”€ ๐Ÿ“„ index.html          # Root HTML document shell
โ”œโ”€โ”€ ๐Ÿ“„ package.json        # Project manifest & dependency configuration
โ”œโ”€โ”€ ๐Ÿ“„ package-lock.json   # Deterministic version lockfile
โ””โ”€โ”€ ๐Ÿ“„ vite.config.js      # Vite bundler configuration

Understanding package.json

The package.json file is the heart of any Node.js & React project. It contains metadata, CLI scripts, and project dependencies.

Key Sections in package.json:

  1. scripts: Short commands executed via npm run <script-name>:
  • "dev": "vite" โ€” Launches local dev server with HMR.
  • "build": "vite build" โ€” Compiles optimized production bundle into dist/.
  • "lint": "eslint ." โ€” Runs ESLint code quality checks.
  • "preview": "vite preview" โ€” Serves production build locally for testing.
  1. dependencies: Packages required for the application to function in production (e.g. react, react-dom).
  1. devDependencies: Packages required only during development and build compilation (e.g. vite, eslint, @vitejs/plugin-react).
JavaScript
// Example package.json breakdown
{
  "name": "my-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  },
  "devDependencies": {
    "@vitejs/plugin-react": "^4.3.1",
    "vite": "^5.4.1"
  }
}

Understanding package-lock.json

While package.json specifies version ranges using caret symbols (^18.3.1), package-lock.json records the exact, literal version numbers of every single installed package and nested sub-dependency tree.

Why package-lock.json is Critical:

  • Deterministic Builds: Ensures that every team member and deployment server (Vercel, Netlify, AWS) installs the exact same dependency tree, preventing "works on my machine" bugs.
  • Security & Integrity: Stores cryptographic SHA hashes for installed package tarballs.

Golden Rule: Never delete or manually modify package-lock.json. Let NPM update it automatically when running npm install or npm update.

Understanding node_modules/

The node_modules/ folder contains the actual compiled JavaScript code of all third-party libraries listed in package.json and package-lock.json.

Important Rules for node_modules:

  • Extremely Heavy: Can contain thousands of files and consume hundreds of megabytes.
  • Never Commit to Git: node_modules/ is automatically added to .gitignore.
  • Recreatable: Anyone who clones your repository can recreate node_modules/ simply by running npm install.

Understanding the src/ Directory (main.jsx & App.jsx)

The src/ folder is where you write 99% of your React application code:

  • src/main.jsx (The Bridge):

main.jsx is the entry JavaScript file. It selects the <div id="root"></div> from index.html and uses React 18's createRoot() API to mount the root <App /> component:

src/main.jsx
// src/main.jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)
  • src/App.jsx (The Root Component):

App.jsx is the top-level parent component that renders your application UI layout.

Understanding public/ Directory & index.html

  • public/ Directory:

Files in public/ are served directly by the web server at root URL path without being processed or transformed by Vite's bundler. Use public/ for static assets like favicon.ico or robots.txt.

  • index.html Shell:

In Vite, index.html is placed in the project root directory (unlike CRA where it was inside public/). It contains the root mount point:

JavaScript
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>My React App</title>
  </head>
  <body>
    <!-- React mounts the UI inside this div -->
    <div id="root"></div>
    <!-- Vite loads main.jsx as an ES Module -->
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

Development Build vs. Production Build

React applications execute in two distinct modes:

  • 1. Development Mode (npm run dev):
  • Optimized for developer speed and debugging.
  • Includes detailed warnings, stack trace overlays, and <React.StrictMode> double-rendering checks.
  • Uses un-minified code with Source Maps for easy browser debugging.
  • Runs local HMR dev server.
  • 2. Production Mode (npm run build):
  • Optimized for end-user load speed and security.
  • Code is tree-shaken (unused code removed), minified, and obfuscated.
  • CSS is extracted into separate compressed bundles.
  • JavaScript is split into cacheable chunk files.
  • Outputs output files into a static dist/ folder ready to deploy on any hosting provider (Vercel, Netlify, AWS S3, Nginx).

Practical Hands-On Exercise โ€” Complete Project Setup

Follow this step-by-step practical walk-through to create, run, and build your React application:

JavaScript
// Terminal Practical Guide:

// Step 1: Create React App with Vite
npm create vite@latest my-app -- --template react

// Step 2: Navigate into the newly created folder
cd my-app

// Step 3: Install all node dependencies
npm install

// Step 4: Run local development server
npm run dev
// Local server URL: http://localhost:5173

// Step 5: Test Production Build
npm run build
// Compiles production bundle into /dist folder

// Step 6: Preview Production Build locally
npm run preview