A well-organized React file structure improves maintainability, scalability, and collaboration. Here’s a structured approach to organizing your React project
1. Basic File Structure (for Small Projects)
my-react-app/ │── public/ # Static assets (favicon, index.html) │── src/ # Main source code │ ├── components/ # Reusable UI components │ ├── pages/ # Page components (for React Router) │ ├── assets/ # Images, fonts, icons │ ├── styles/ # CSS, SCSS, or Tailwind styles │ ├── App.js # Main app component │ ├── index.js # Entry point │── package.json # Project dependencies │── .gitignore # Files to ignore in Git │── README.md # Documentation
2. Scalable File Structure (for Large Projects)
my-react-app/ │── public/ │── src/ │ ├── api/ # API calls (Axios, Fetch) │ ├── assets/ # Static files (images, fonts) │ ├── components/ # Reusable UI components │ ├── pages/ # Page components │ ├── hooks/ # Custom React hooks │ ├── context/ # React Context API for state management │ ├── redux/ # Redux store, actions, reducers (if using Redux) │ ├── utils/ # Helper functions, formatters │ ├── routes/ # Centralized routing setup │ ├── styles/ # Global & module styles │ ├── App.js # Main application component │ ├── index.js # Entry point │── .env # Environment variables │── package.json # Project dependencies │── .gitignore # Git ignore file │── README.md # Documentation
3. Explanation of Key Folders
📁 1. public/
- Stores static files that don’t change dynamically.
- Includes
index.html
, favicon, and images.
📁 2. src/
(Main Source Code)
📂 components/
(Reusable UI Components)
- Stores UI components used across multiple pages.
- Examples:
components/ ├── Button.js ├── Navbar.js ├── Footer.js ├── Card.js
pages/
(Page Components)
- Each file represents a page (for React Router or Next.js).
- Example:
pages/ ├── Home.js ├── About.js ├── Contact.js ├── Dashboard.js
📂 api/
(API Calls)
- Stores functions for fetching data using Axios or Fetch API.
- Example:
// api/user.js import axios from "axios"; export const fetchUsers = async () => { const response = await axios.get("https://jsonplaceholder.typicode.com/users"); return response.data; };
📂 hooks/
(Custom Hooks)
- Stores reusable custom hooks.
- Example:
// hooks/useFetch.js import { useState, useEffect } from "react"; const useFetch = (url) => { const [data, setData] = useState(null); useEffect(() => { fetch(url) .then((res) => res.json()) .then((data) => setData(data)); }, [url]); return data; }; export default useFetch;
📂 context/
(React Context API)
- Stores global state management logic.
- Example:
// context/AuthContext.js import { createContext, useState } from "react"; const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null); return ( <AuthContext.Provider value={{ user, setUser }}> {children} </AuthContext.Provider> ); }; export default AuthContext;
📂 redux/
(Redux Store)
- Stores Redux logic (reducers, actions, store).
- Example:
redux/ ├── store.js ├── reducers/ ├── actions/ ├── slices/
📂 routes/
(React Router Configuration)
- Centralized routing setup.
- Example:
// routes/Routes.js import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import Home from "../pages/Home"; import About from "../pages/About"; const AppRoutes = () => ( <Router> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes> </Router> ); export default AppRoutes;
📂 utils/
(Helper Functions)
- Stores utility functions.
- Example:
// utils/formatDate.js export const formatDate = (date) => new Date(date).toLocaleDateString();
📂 styles/
(CSS & Styling)
- Stores global styles, CSS modules, or Tailwind CSS.
- Example:
styles/ ├── global.css ├── Home.module.css ├── theme.js
4. File Naming Conventions
✔️ Use PascalCase for components (Navbar.js
, Footer.js
).
✔️ Use camelCase for utility functions (formatDate.js
).
✔️ Use kebab-case for CSS files (global.css
).