Header Ads Widget

Cấu trúc thư mục React cho dự án lớn

Khi mới học React, rất nhiều người để toàn bộ component, page, API và CSS chung trong thư mục src. Điều này có thể chấp nhận được với những dự án nhỏ, nhưng khi ứng dụng phát triển lên hàng chục hoặc hàng trăm màn hình thì việc quản lý sẽ trở thành "ác mộng".

Xây dựng dự án kiến trúc Feature-Based Architecture. Đây cũng là cách tổ chức mã nguồn mà rất nhiều công ty và đội ngũ phát triển React chuyên nghiệp đang sử dụng.

Ví dụ cấu trúc như sau:

src/
├── app/
├── assets/
├── components/
│   ├── ui/
│   ├── common/
│   └── layouts/
├── features/
│   ├── auth/
│   ├── dashboard/
│   ├── fanpages/
│   ├── posts/
│   ├── scheduler/
│   ├── analytics/
│   ├── users/
│   ├── settings/
│   └── integrations/
│       ├── facebook/
│       ├── zalo/
│       ├── tiktok/
│       └── youtube/
├── hooks/
├── services/
├── store/
├── routes/
├── contexts/
├── constants/
├── types/
├── utils/
├── styles/
├── App.tsx
└── main.tsx

Hãy cùng tìm hiểu ý nghĩa của từng thư mục.


1. app/

Đây là nơi khởi tạo toàn bộ ứng dụng.

Thông thường sẽ chứa:

  • App.tsx

  • Theme

  • Provider

  • Global Config

  • Router Provider

  • Query Provider

  • Authentication Provider

Ví dụ:

app/
    AppProvider.tsx
    ThemeProvider.tsx
    QueryProvider.tsx

Mục đích:

  • Khởi tạo React

  • Đăng ký Provider

  • Khởi tạo Theme

  • Khởi tạo Redux

  • Khởi tạo React Query

Đây được xem là "bộ não" khi ứng dụng khởi động.


2. assets/

Nơi chứa toàn bộ tài nguyên tĩnh.

Ví dụ:

assets/
    images/
    icons/
    fonts/
    videos/
    svg/

Không nên để ảnh lung tung trong các component.

Ví dụ:

✔ assets/images/logo.png

✘ components/logo.png

Việc tập trung toàn bộ tài nguyên vào một nơi sẽ giúp quản lý dễ dàng hơn.


3. components/

Đây là nơi chứa các component có thể tái sử dụng.

Ví dụ:

Button
Input
Table
Modal
Card
Loading

Một component ở đây có thể được sử dụng ở rất nhiều màn hình.

Ví dụ:

components/
    ui/
        Button.tsx
        Input.tsx
        Select.tsx
        Table.tsx

Sau này khi đổi giao diện Button, chỉ cần sửa đúng một file.


ui/

Đây là các component cơ bản.

Ví dụ:

Button
Input
Checkbox
Badge
Avatar
Dropdown
Modal
Tabs
Tooltip

Đây gần giống như bộ LEGO của toàn bộ dự án.


common/

Là các component nghiệp vụ nhưng được dùng ở nhiều nơi.

Ví dụ:

Header
Sidebar
Breadcrumb
SearchBox
Pagination
EmptyState

Không phải component nào cũng chỉ có giao diện.

Ví dụ SearchBox có thể chứa logic debounce.


layouts/

Định nghĩa bố cục của website.

Ví dụ:

DashboardLayout
AuthLayout
BlankLayout
LandingLayout

Thay vì mỗi trang tự viết Header và Sidebar thì chỉ cần:

<DashboardLayout>
    <DashboardPage />
</DashboardLayout>

4. features/

Đây là thư mục quan trọng nhất.

Mỗi chức năng lớn sẽ có một module riêng.

Ví dụ:

features/
    auth/
    users/
    products/
    orders/

Mỗi module sẽ tự quản lý:

  • component

  • api

  • hook

  • type

  • page

  • service

Ví dụ:

features/
    users/
        components/
        hooks/
        pages/
        services/
        types.ts

Nhờ vậy code rất dễ bảo trì.


auth/

Quản lý:

  • Login

  • Register

  • Forgot Password

  • Change Password

  • JWT

  • Refresh Token


dashboard/

Màn hình tổng quan.

Ví dụ:

  • Card thống kê

  • Biểu đồ

  • Recent Activity

  • Doanh thu


fanpages/

Đây là module dành riêng cho Fanpage Facebook.

Ví dụ:

  • Danh sách Fanpage

  • Thêm Fanpage

  • Đồng bộ Fanpage

  • Xóa Fanpage


posts/

Quản lý bài viết.

Ví dụ:

  • Draft

  • Published

  • Queue

  • AI Generate

  • Lịch sử đăng


scheduler/

Lập lịch.

Ví dụ:

  • Đăng bài lúc 8h sáng

  • Đăng định kỳ

  • Hàng tuần

  • Hàng tháng


analytics/

Phân tích.

Ví dụ:

  • Reach

  • Like

  • Comment

  • Click

  • Conversion


users/

Quản lý người dùng.

Ví dụ:

  • Danh sách

  • Vai trò

  • Quyền

  • Nhật ký hoạt động


settings/

Toàn bộ cấu hình hệ thống.

Ví dụ:

  • Dark Mode

  • API Key

  • SMTP

  • Webhook

  • Notification


integrations/

Tích hợp với nền tảng bên ngoài.

Ví dụ:

facebook/
zalo/
tiktok/
youtube/

Mỗi nền tảng có:

  • API

  • OAuth

  • Token

  • Webhook

  • Đồng bộ dữ liệu

Việc tách riêng giúp sau này thêm nền tảng mới mà không ảnh hưởng phần còn lại.


5. hooks/

Đây là nơi chứa Custom Hook.

Ví dụ:

useAuth()

usePagination()

useDebounce()

useLoading()

useWindowSize()

Hook giúp tái sử dụng logic thay vì copy code.


6. services/

Toàn bộ API sẽ nằm ở đây.

Ví dụ:

auth.service.ts

user.service.ts

facebook.service.ts

axios.ts

Không nên viết:

fetch(...)

ngay trong component.


7. store/

Nếu dùng Redux hoặc Zustand.

Ví dụ:

store/

authStore.ts

themeStore.ts

userStore.ts

Toàn bộ dữ liệu dùng chung sẽ được quản lý tại đây.


8. routes/

Định nghĩa Router.

Ví dụ:

/

dashboard

/users

/settings

/login

Có thể phân quyền ngay tại Router.


9. contexts/

Nếu dùng React Context.

Ví dụ:

ThemeContext

LanguageContext

PermissionContext

10. constants/

Chứa dữ liệu không thay đổi.

Ví dụ:

Role

Permission

Country

Status

Language

Ví dụ:

export const USER_STATUS = {
    ACTIVE: 1,
    BLOCK: 2
}

11. types/

Toàn bộ interface và type.

Ví dụ:

User.ts

Post.ts

Fanpage.ts

Api.ts

Giúp tránh việc định nghĩa interface nhiều lần.


12. utils/

Các hàm tiện ích.

Ví dụ:

formatDate()

formatMoney()

slugify()

downloadFile()

generateUUID()

Các hàm này không liên quan tới React.


13. styles/

CSS dùng chung.

Ví dụ:

variables.css

theme.css

animation.css

Nếu dùng Tailwind thì thư mục này thường khá nhỏ.


14. App.tsx

Đây là component gốc của ứng dụng.

Thông thường chỉ còn:

<AppProvider>
    <Router />
</AppProvider>

Không nên viết hàng nghìn dòng code trong App.tsx.


15. main.tsx

Đây là điểm khởi động của React.

Ví dụ:

createRoot(...)

File này gần như rất ít khi phải sửa.


Vì sao nên tổ chức theo Feature-Based Architecture?

So với cách tổ chức truyền thống (chia theo pages, components, services...), Feature-Based Architecture mang lại nhiều lợi ích:

  • Dễ mở rộng khi dự án ngày càng lớn.

  • Nhiều lập trình viên có thể làm song song mà ít xung đột.

  • Mỗi module độc lập, dễ bảo trì và kiểm thử.

  • Google AI Studio, Gemini CLI, Cursor, Codex hay các AI hỗ trợ lập trình cũng hiểu cấu trúc rõ ràng hơn, từ đó sinh mã nhất quán và ít phá vỡ kiến trúc hiện có.

  • Khi cần thêm một tính năng mới (ví dụ tích hợp LinkedIn hoặc Telegram), chỉ cần tạo thêm một module trong features hoặc integrations mà không ảnh hưởng đến các phần khác.

Kết luận

Một dự án React chuyên nghiệp không chỉ nằm ở giao diện đẹp hay code chạy được, mà còn ở cách tổ chức mã nguồn. Một cấu trúc rõ ràng sẽ giúp dự án dễ mở rộng, dễ bảo trì và tận dụng AI hiệu quả hơn.

Nếu bạn đang bắt đầu một dự án React mới, hãy dành thời gian thiết kế kiến trúc ngay từ đầu. Điều này sẽ giúp bạn tiết kiệm rất nhiều công sức khi dự án phát triển lên hàng chục nghìn dòng mã và có nhiều lập trình viên cùng tham gia.

Nhận xét