Dokumen ini bertujuan untuk menjadi panduan resmi bagi tim dalam mengatur struktur folder dan file pada proyek React kita. Mengikuti struktur yang konsisten akan membantu meningkatkan maintainability, skalabilitas, dan kolaborasi antar developer.
Struktur ini dirancang dengan beberapa prinsip utama:
- Modular: Kode diorganisir berdasarkan fitur atau domain, bukan hanya berdasarkan tipe file.
- Reusable: Komponen, hooks, dan utilitas mudah ditemukan dan digunakan kembali.
- Scalable: Mudah untuk menambahkan fitur baru tanpa merusak struktur yang sudah ada.
- Separation of Concerns: Setiap bagian dari aplikasi (UI, state, logic, services) memiliki tempatnya sendiri yang jelas.
Berikut adalah struktur dasar pada level root proyek kita:
/nama-proyek
├── /public/ # Aset statis yang tidak diproses oleh bundler
├── /src/ # Folder utama kode aplikasi kita
├── .gitignore # File dan folder yang diabaikan oleh Git
├── package.json # Dependensi dan skrip proyek
├── README.md # Informasi umum tentang proyek
├── tsconfig.json # Konfigurasi TypeScript
├── vite.config.js # Konfigurasi Vite
└── .eslintrc.json # Konfigurasi ESLint
Folder /src adalah tempat di mana 99% pekerjaan kita akan dilakukan. Semua kode sumber aplikasi React berada di sini.
/src
├── /assets/ # Aset statis (gambar, font, svg) yang diimpor ke komponen
├── /components/ # Komponen UI yang dapat digunakan kembali (reusable)
├── /config/ # Konfigurasi aplikasi (variabel environment, dll.)
├── /features/ # Logika dan komponen yang spesifik untuk sebuah fitur
├── /hooks/ # Custom React hooks
├── /layouts/ # Komponen layout (Header, Sidebar, MainLayout)
├── /pages/ # Komponen halaman yang terhubung ke rute
├── /router/ # Konfigurasi routing aplikasi
├── /services/ # Komunikasi dengan API eksternal
├── /store/ # State management global (Zustand, Redux, Context)
├── /styles/ # File styling global (CSS, SASS)
├── /types/ # Definisi tipe TypeScript
├── /utils/ # Fungsi bantuan umum (helper functions)
└── index.jsx # Titik masuk utama aplikasi (entry point)
Berikut penjelasan rinci untuk setiap folder.
- Tujuan: Menyimpan aset statis seperti gambar, ikon (SVG), dan font yang akan diimpor dan digunakan di dalam komponen.
- Contoh:
logo.svg,user-avatar-default.png.
- Tujuan: Berisi komponen UI yang generik dan dapat digunakan kembali di berbagai bagian aplikasi. Komponen di sini tidak boleh memiliki logika bisnis yang spesifik.
- Aturan: Pikirkan komponen ini seperti "Lego". Mereka harus bodoh (dumb components) dan hanya menerima props.
- Contoh:
/components ├── /ui/ # Komponen UI dari Shadcn/Radix (Button, Card, Input) ├── /common/ # Komponen umum buatan sendiri (Modal, Spinner, Table) └── index.js # Opsional: untuk ekspor semua komponen dari satu file
- Tujuan: Menyimpan semua konfigurasi aplikasi, terutama variabel environment. Ini memisahkan konfigurasi dari logika.
- Contoh:
/config └── index.js // export const API_BASE_URL = import.meta.env.VITE_API_URL;
- Tujuan: Ini adalah folder paling penting untuk skalabilitas. Setiap folder di dalamnya mewakili satu fitur bisnis aplikasi. Folder ini berisi semua hal yang berhubungan dengan fitur tersebut: komponen spesifik, hooks, dan bahkan state.
- Aturan: Jika sebuah komponen hanya digunakan dalam satu fitur, letakkan di sini, bukan di
/components. - Contoh:
/features ├── /authentication/ # Fitur login, register, logout │ ├── /components/ # LoginForm.jsx, RegisterForm.jsx │ ├── /hooks/ # useAuth.js │ └── index.js └── /order-management/ # Fitur manajemen pesanan ├── /components/ # OrderTable.jsx, OrderDetail.jsx ├── /services/ # orderService.js └── index.js
- Tujuan: Menyimpan custom hooks yang dapat digunakan kembali di seluruh aplikasi.
- Aturan: Hanya hooks yang benar-benar generik yang disimpan di sini. Jika hook hanya untuk satu fitur, letakkan di dalam folder fitur tersebut.
- Contoh:
useDebounce.js,useLocalStorage.js.
- Tujuan: Komponen yang mendefinisikan struktur tata letak halaman, seperti
Header,Sidebar, danFooter. - Aturan: Layout biasanya berisi komponen
<Outlet />dari React Router. - Contoh:
MainLayout.jsx,DashboardLayout.jsx.
- Tujuan: Komponen yang mewakili satu halaman penuh dari aplikasi. Komponen ini biasanya dipetakan ke satu rute URL.
- Aturan: Halaman bertugas untuk "merakit" komponen dari
/componentsdan/featuresmenggunakan sebuah/layouts. Halaman tidak boleh berisi terlalu banyak logika. - Contoh:
HomePage.jsx,ProfilePage.jsx,SettingsPage.jsx.
- Tujuan: Tempat untuk mendefinisikan semua rute (routes) aplikasi menggunakan React Router.
- Aturan: Memisahkan konfigurasi rute membuat
App.jsxataumain.jsxmenjadi lebih bersih. - Contoh:
index.jsxyang berisicreateBrowserRouter.
- Tujuan: Mengelola semua komunikasi dengan dunia luar, terutama panggilan API.
- Aturan: Gunakan
axiosataufetchdi sini. Pisahkan logika panggilan API dari komponen agar lebih mudah di-test dan di-maintain. - Contoh:
authService.js,productService.js.
- Tujuan: Untuk state management global. Semua file terkait Zustand, Redux, atau Context API diletakkan di sini.
- Aturan: Pisahkan store atau slice berdasarkan domain atau fitur.
- Contoh:
useAuthStore.js,useCartStore.js.
- Tujuan: Menyimpan file styling global.
- Contoh:
index.cssuntuk styling global atau reset CSS.
- Tujuan: (Khusus TypeScript) Berisi definisi tipe atau interface yang dapat digunakan kembali di seluruh aplikasi.
- Contoh:
user.d.ts,api.d.ts.
- Tujuan: Kumpulan fungsi bantuan (helper/utility) yang murni dan tidak memiliki side-effect.
- Aturan: Fungsi-fungsi ini bisa digunakan di mana saja.
- Contoh:
formatDate.js,calculateDiscount.js.