R

React Handbook

Clean • Professional

React Project Structure & Coding Standards: Scalable Code Guide

5 minute

Project Structure & Coding Standards – Maintainable and Scalable React Code

A well-structured React project is like a well-organized workspace — it saves time, reduces bugs, and makes collaboration easier. Whether you’re building a small app or a large-scale enterprise project, following clean architecture and consistent coding standards ensures your code remains maintainable, scalable, and easy to understand.

Why Project Structure Matters

A good project structure helps you:

  • Keep your files organized and predictable
  • Make it easy for new developers to understand the project
  • Simplify imports and navigation
  • Enable code reusability and scalability
  • Reduce technical debt and debugging time

Poor structure, on the other hand, can make even small projects messy and difficult to maintain as they grow.

Recommended React Project Structure

Here’s a commonly used, scalable folder structure for modern React projects:

src/
├── assets/              # Images, icons, fonts, videos
├── components/          # Reusable UI components (Buttons, Inputs, Cards)
├── pages/               # Page-level components (Home, About, Dashboard)
├── hooks/               # Custom React Hooks (useAuth, useFetch)
├── context/             # Context API files (ThemeContext, AuthContext)
├── store/               # Redux, Zustand, or Recoil state management
├── services/            # API calls and external services
├── utils/               # Helper functions and utilities
├── styles/              # Global CSS, SCSS, or styled-components themes
├── routes/              # App routing configuration
├── constants/           # App-wide constants and config variables
├── App.js               # Root component
├── index.js             # Entry point for ReactDOM.render
└── setupTests.js        # Jest/RTL configuration

Example:

  • components/ → Contains small, reusable building blocks like Button, Navbar, or Modal
  • pages/ → Represents full-page views like HomePage, LoginPage, or ProfilePage
  • hooks/ → Stores reusable custom hooks such as useForm or useFetch
  • services/ → Central place for API logic using Axios or Fetch
  • context/ → Defines global app contexts (e.g., Theme, Auth)
  • store/ → Manages state if using Redux Toolkit or Zustand
  • utils/ → Contains helper functions (e.g., formatDate, validateEmail)
  • styles/ → Centralized styling for consistent UI themes

Best Practices for File Naming and Organization

1. Use Consistent Naming Conventions

  • PascalCase for Components → UserProfile.js
  • camelCase for functions, variables, and hooks → useAuth.js
  • kebab-case for asset files → user-icon.svg
  • UPPER_CASE for constants → API_BASE_URL

Example:

// Good
function UserCard() {}

// Bad
function user_card() {}

2. Group Related Files Together

Instead of having one massive components folder, group related files by feature or domain.

src/
└── features/
    ├── auth/
    │   ├── LoginPage.jsx
    │   ├── RegisterPage.jsx
    │   ├── AuthContext.js
    │   └── authService.js
    ├── dashboard/
    │   ├── DashboardPage.jsx
    │   ├── ChartWidget.jsx
    │   └── dashboardService.js

This makes it easier to maintain large applications as each feature is self-contained.

Coding Standards and Conventions

Maintaining consistency in your code style helps teams write clean, readable, and error-free code.

Here are some key standards to follow:

1. Use ESLint and Prettier

Install and configure ESLint and Prettier to automatically format and lint your code.

Example (ESLint + Prettier setup):

npm install eslint prettier eslint-config-prettier eslint-plugin-react --save-dev

Then create a .eslintrc.json file:

{
  "extends": ["react-app", "prettier"],
  "plugins": ["react"],
  "rules": {
    "react/prop-types": "off",
    "no-unused-vars": "warn"
  }
}

here,

  • Prettier keeps formatting consistent
  • ESLint ensures code follows best practices and catches common bugs

2. Keep Components Small and Focused

Each component should handle one responsibility.

Avoid:

function Dashboard() {
  // Handles API calls, rendering charts, managing modals, etc.
}

Instead, split logic:

function Dashboard() {
  return (
    <><DashboardHeader />
      <UserStats />
      <RecentActivities />
    </>
  );
}

3. Write Clean and Descriptive Code

  • Use meaningful variable and function names
  • Avoid deeply nested code
  • Add comments where logic is complex
  • Keep your JSX readable with proper indentation

Example:

// Good
const [userData, setUserData] = useState([]);

// Bad
const [a, b] = useState([]);

4. Separate Logic and UI

Keep data fetching and business logic separate from UI rendering.

Mixing logic inside components:

function UserList() {
  const [users, setUsers] = useState([]);
  useEffect(() => {
    fetchUsers().then(setUsers);
  }, []);
  return users.map(u => <p>{u.name}</p>);
}

Better approach:

// useUsers.js
export function useUsers() {
  const [users, setUsers] = useState([]);
  useEffect(() => {
    fetchUsers().then(setUsers);
  }, []);
  return users;
}

// UserList.jsx
import { useUsers } from "../hooks/useUsers";

function UserList() {
  const users = useUsers();
  return users.map(u => <p>{u.name}</p>);
}

5. Use Type Checking

Use PropTypes or TypeScript for validating props and ensuring type safety.

import PropTypes from "prop-types";

function UserCard({ name, age }) {
  return <div>{name} – {age}</div>;
}

UserCard.propTypes = {
  name: PropTypes.string.isRequired,
  age: PropTypes.number
};

or with TypeScript:

type UserCardProps = {
  name: string;
  age?: number;
};

const UserCard = ({ name, age }: UserCardProps) => (
  <div>{name} – {age}</div>
);

6. Reuse and Share Code Wisely

Use:

  • Custom hooks for repeated logic (e.g., API fetching, form handling)
  • Reusable UI components for consistent design
  • Constants and utility functions for app-wide configurations

7. Version Control & Documentation

  • Use Git for version control (git commit often and write clear messages)
  • Maintain a README.md explaining setup and usage
  • Use JSDoc or comments for documenting complex functions

Example of a Scalable React Folder Setup

src/
├── api/
│   └── axiosInstance.js
├── components/
│   ├── Button.jsx
│   ├── Card.jsx
│   └── Modal.jsx
├── context/
│   └── AuthContext.js
├── hooks/
│   ├── useAuth.js
│   └── useFetch.js
├── pages/
│   ├── Home.jsx
│   ├── Login.jsx
│   └── Dashboard.jsx
├── store/
│   └── index.js
├── styles/
│   ├── globals.css
│   └── variables.scss
└── utils/
    └── formatDate.js

Tips for Scalable React Apps

  • Keep files short and focused
  • Follow consistent naming and file structure
  • Use environment variables for configurations
  • Always lint and format before commits
  • Write tests for critical features

Summary Table

PracticeBenefit
Organized folder structureEasy navigation and scalability
ESLint + PrettierConsistent and clean code
Small, focused componentsReusable and testable
Separation of logic and UIBetter maintainability
Type checkingFewer runtime errors
Documentation & GitEasier collaboration


Article 0 of 0