How to Structure and Organize a React Application: A Comprehensive Guide

Danielle Dias
Geek Culture
Published in
5 min readJul 20, 2023
Photo by Free Nomad on Unsplash

React has gained immense popularity as a JavaScript library for building user interfaces. Its flexibility allows developers to create complex and scalable applications. However, with this freedom comes the responsibility of deciding on the architecture and organization of the application.

In this comprehensive guide, we will explore effective strategies for structuring and organizing a React application. We will cover various aspects such as directory structure, component organization, services, store management, utility functions, and views. By following these best practices, you can create a maintainable and scalable React application.

Before we dive into the details, let’s establish some assumptions about the technology stack we’ll be using for our example project:

  • Application: We will be using React, leveraging the power of React Hooks.
  • Global state management: Redux and Redux Toolkit will be employed for managing global application state.
  • Routing: React Router will handle the routing needs of the application.
  • Styles: Styled Components will be used for styling React components.
  • Testing: We will rely on Jest and React Testing Library for testing our React components.

It’s important to note that while these assumptions provide a solid foundation for the examples and explanations in this guide, you can adapt them to suit your project’s specific requirements and preferences.

Directory Structure

A well-organized directory structure is crucial for maintaining a clean and maintainable codebase. Let’s define a recommended directory structure for our React application:

. └── /src
├── /assets
├── /components
├── /services
├── /store
├── /utils
└── /views

Let’s explore each directory and its purpose:

assets

The assets directory serves as a centralized location for storing global static assets, such as images, SVGs, or the company logo. Placing these assets in a separate directory helps keep the project organized and ensures easy access to shared resources.

components

The components directory is where reusable and shared components reside. Rather than organizing components based on their type, we propose grouping them based on their features. For instance, you could have subfolders for forms, tables, buttons, and layout. This feature-focused approach allows for better modularity and reusability.

Within each component folder, you’ll find the following files:

  • Component.js: This file contains the actual React component.
  • Component.styles.js: The Styled Components file associated with the component for modular styling.
  • Component.test.js: Unit tests for the component.
  • Component.stories.js: Storybook file for showcasing the component in isolation.

By grouping these related files together, you can easily locate and work on a specific component or its associated resources.

services

The services directory is optional but can be useful for housing JavaScript modules that provide utility functions or encapsulate external services. For example, you could have a LocalStorage module that handles interactions with the browser's local storage.

The structure within the services directory could look like this:

. └── /services
└── /LocalStorage
├── LocalStorage.service.js
└── LocalStorage.test.js

The LocalStorage.service.js file would contain the implementation of the LocalStorage service, offering functions such as get, set, remove, and clear. Placing such services in a dedicated directory promotes modularity and reusability across the application.

store

The store directory is where the global Redux store resides. In this example, we'll be using Redux Toolkit, but the structure can be adapted for regular Redux usage as well. Each feature of the application will havea separate folder within the store directory.

For instance, let’s consider a “Library App” example with features like authentication, book management, and author management. The structure within the store directory could look like this:

. └── /store
├── /authentication
│ ├── /authentication.slice.js
│ ├── /authentication.actions.js
│ └── /authentication.test.js
├── /books
│ ├── /books.slice.js
│ ├── /books.actions.js
│ └── /books.test.js
└── /authors
├── /authors.slice.js
├── /authors.actions.js
└── /authors.test.js

Each feature folder contains files related to Redux, such as a slice file (slice.js), actions file (actions.js), and test file (test.js). These files encapsulate the Redux logic specific to each feature. The use of feature slices allows for better organization and separation of concerns.

In addition to the feature-specific folders, there is also a rootReducer.js file that combines all the individual feature reducers using the combineReducers function. This file provides a central location for managing the entire application's state.

The index.js file within the store directory is responsible for configuring the Redux store. It sets up middleware, applies any necessary enhancers, and creates the store instance that will be used throughout the application.

This organized structure within the store directory ensures that the Redux-related files are grouped by feature, making it easier to manage and maintain the global state of the application.

utils

The utils directory contains utility functions, helpers, constants, and other shared resources. It acts as a central repository for reusable code that is used across different sections of the application.

Within the utils directory, you can further categorize files based on their purpose. For example:

. └── /utils
├── /constants
│ └── countries.constants.js
└── /helpers
├── validation.helpers.js
├── currency.helpers.js
└── array.helpers.js

In this example, the constants directory contains files that define constants, such as countries.constants.js, which may store a list of country names or codes.

The helpers directory contains utility functions that assist with common tasks like validation, currency manipulation, or array operations. This modular organization allows for easy access to shared utility functions throughout the application.

Views

The views directory represents the main part of your React application, containing individual pages or views. Each view folder encapsulates components specific to that view, such as forms, modals, or unique layout components.

For instance, let’s consider our “Library App” example. The structure within the views directory could look like this:

. └── /views
├── /Books
│ ├── /BooksPage
│ │ ├── BooksPage.js
│ │ └── BooksPage.test.js
│ └── /BookForm
│ ├── BookForm.js
│ └── BookForm.test.js
├── /Authors
│ ├── /AuthorsPage
│ │ ├── AuthorsPage.js
│ │ └── AuthorsPage.test.js
│ └── /AuthorBlurb
│ ├── AuthorBlurb.js
│ └── AuthorBlurb.test.js
└── /Login
├── LoginPage
│ ├── LoginPage.styles.js
│ ├── LoginPage.js
│ └── LoginPage.test.js
└── LoginForm
├── LoginForm.js
└── LoginForm.test.js

In this example, each view has its own folder within the views directory. For example, the Books folder contains subfolders for the BooksPage and BookForm components.

The BooksPage component represents the main page for managing books in the application. It includes the BooksPage.js file, which contains the implementation of the component, and the BooksPage.test.js file for unit tests.

Similarly, the BookForm folder contains the files specific to the book form component, such as BookForm.js for the component implementation and BookForm.test.js for tests.

Following this structure, each view folder encapsulates the components, styles, and tests specific to that particular view. This organization approach makes it easy to navigate and work on different sections of the application, as each view folder contains everything related to that view.

Conclusion

By adopting these recommended practices and adapting them to your project’s needs, you can establish a solid foundation for structuring and organizing your React application. Following a consistent and modular approach will enhance collaboration among team members and improve code maintainability as your application grows.

--

--