Best Practice: File Component
Praktik Terbaik: Menyimpan Component dalam File dan Struktur Project React
Seiring berkembangnya aplikasi React, jumlah component akan semakin banyak. Menempatkan semua component dalam satu file dapat membuat kode sulit dibaca dan dipelihara.
Karena itu, kita perlu menggunakan struktur file dan folder yang terorganisasi.
1. Mengapa Component Perlu Dipisahkan ke File Terpisah?
Pada awal membuat aplikasi React, kita mungkin menempatkan semua component di dalam App.jsx.
function Header() {
// ...
}
function CoreConcept() {
// ...
}
function App() {
// ...
}
Untuk aplikasi sederhana, pendekatan tersebut masih dapat digunakan.
Namun, ketika aplikasi semakin besar, App.jsx dapat menjadi sangat panjang.
Masalah yang Dapat Muncul
- File menjadi terlalu besar.
- Sulit menemukan component tertentu.
- Kode sulit dibaca.
- Pemeliharaan menjadi lebih sulit.
- Component sulit digunakan kembali di tempat lain.
- Struktur project menjadi kurang terorganisasi.
Solusi
Pisahkan component ke dalam file masing-masing.
Contoh:
src/
├── App.jsx
├── main.jsx
├── components/
│ ├── Header.jsx
│ ├── CoreConcept.jsx
│ └── Button.jsx
└── assets/
└── react-logo.png
Dengan struktur tersebut, setiap component memiliki tempat yang jelas.
2. Membuat Folder components
Konvensi yang umum digunakan adalah membuat folder:
src/components/
Folder tersebut digunakan untuk menyimpan component React.
Contoh:
src/
└── components/
├── Header.jsx
├── CoreConcept.jsx
├── Product.jsx
└── Button.jsx
Nama folder components bukan aturan wajib dari React, tetapi merupakan konvensi yang umum digunakan agar struktur project lebih mudah dipahami.
3. Penamaan File Component
Sebaiknya nama file mengikuti nama component.
Contoh:
Header.jsx
berisi:
function Header() {
// ...
}
Contoh lainnya:
CoreConcept.jsx
berisi:
function CoreConcept() {
// ...
}
Konvensi ini membuat hubungan antara file dan component lebih mudah dikenali.
4. Satu Component Utama dalam Satu File
Sebagai praktik yang baik, sebuah file biasanya memiliki satu component utama.
Contoh:
components/
├── Header.jsx
├── Footer.jsx
├── Product.jsx
└── Button.jsx
Masing-masing file memiliki component yang sesuai.
Namun, satu file tidak secara mutlak hanya boleh memiliki satu function. Beberapa helper component yang sangat erat kaitannya masih dapat ditempatkan dalam file yang sama.
Yang terpenting adalah struktur tetap mudah dipahami dan dipelihara.
5. Membuat File Component Baru
Misalnya kita ingin memindahkan component Header dari App.jsx.
Buat file:
src/components/Header.jsx
Kemudian pindahkan component:
function Header() {
return (
<header>
<h1>React Essentials</h1>
</header>
);
}
Agar component dapat digunakan dari file lain, component tersebut harus diekspor.
6. Mengekspor Component dengan export default
Salah satu cara yang umum digunakan adalah Default Export.
export default function Header() {
return (
<header>
<h1>React Essentials</h1>
</header>
);
}
Dengan export default, component Header dapat digunakan oleh file lain.
7. Mengimpor Component
Setelah component diekspor, kita dapat mengimpornya di App.jsx.
import Header from "./components/Header.jsx";
Kemudian digunakan sebagai JSX:
function App() {
return (
<div>
<Header />
<main>
<h2>Welcome to React</h2>
</main>
</div>
);
}
8. Struktur App.jsx Setelah Refactoring
Sebelum dipisahkan:
function Header() {
// ...
}
function CoreConcept() {
// ...
}
function App() {
// ...
}
Setelah dipisahkan:
import Header from "./components/Header.jsx";
import CoreConcept from "./components/CoreConcept.jsx";
function App() {
return (
<div>
<Header />
<main>
<CoreConcept />
</main>
</div>
);
}
export default App;
Sekarang App.jsx lebih fokus pada penyusunan aplikasi.
9. Memahami Relative Path pada import
Ketika component dipindahkan ke folder lain, kita harus memperhatikan lokasi file saat menulis path.
Misalnya:
src/
├── App.jsx
├── components/
│ └── Header.jsx
└── assets/
└── react-core-concepts.png
Jika gambar diimpor dari App.jsx:
import reactImg from "./assets/react-core-concepts.png";
Karena App.jsx berada langsung di dalam folder src.
Namun jika gambar diimpor dari:
src/components/Header.jsx
kita perlu naik satu tingkat menggunakan:
../
Sehingga:
import reactImg from "../assets/react-core-concepts.png";
10. Memahami ./ dan ../
Relative path sangat penting ketika mengorganisasi file.
./
Berarti folder saat ini.
Contoh:
import Header from "./components/Header.jsx";
Jika file berada di:
src/App.jsx
maka:
./components/
mengarah ke:
src/components/
../
Berarti naik satu tingkat ke parent directory.
Misalnya:
src/components/Header.jsx
dan ingin mengakses:
src/assets/
gunakan:
import reactImg from "../assets/react-core-concepts.png";
Alurnya:
components/
│
│ ../
▼
src/
│
▼
assets/
11. Contoh Struktur Project React
Struktur sederhana aplikasi React dapat dibuat seperti berikut:
src/
├── assets/
│ ├── react-core-concepts.png
│ └── react-logo.png
│
├── components/
│ ├── Header.jsx
│ ├── CoreConcept.jsx
│ └── Button.jsx
│
├── App.jsx
└── main.jsx
Pembagian tanggung jawabnya:
App.jsx
│
├── Header.jsx
├── CoreConcept.jsx
└── Button.jsx
App.jsx menjadi component yang menyusun component lainnya.
12. Contoh Header.jsx
import reactImg from "../assets/react-logo.png";
export default function Header() {
return (
<header>
<img
src={reactImg}
alt="React logo"
/>
<h1>React Essentials</h1>
</header>
);
}
13. Contoh CoreConcept.jsx
export default function CoreConcept({
title,
description,
image
}) {
return (
<li>
<img
src={image}
alt={title}
/>
<h3>{title}</h3>
<p>{description}</p>
</li>
);
}
14. Menggunakan Component di App.jsx
import Header from "./components/Header.jsx";
import CoreConcept from "./components/CoreConcept.jsx";
function App() {
return (
<div>
<Header />
<main>
<section>
<h2>Core Concepts</h2>
<ul>
<CoreConcept
title="Components"
description="The core UI building block."
image="/components.png"
/>
</ul>
</section>
</main>
</div>
);
}
export default App;
Dengan cara ini, App.jsx tidak perlu mengetahui bagaimana Header atau CoreConcept dibuat secara internal.
App.jsx cukup menggunakan component tersebut.
15. Component sebagai Module
Setelah dipisahkan ke file, setiap component dapat dianggap sebagai sebuah module.
Contoh:
Header.jsx
│
│ export
▼
App.jsx
│
│ import
▼
<Header />
Hal ini membuat kode lebih modular.
Setiap file dapat memiliki tanggung jawab tertentu dan dapat digunakan oleh file lainnya.
16. Proses Refactoring Component
Misalnya awalnya:
src/
└── App.jsx
dan di dalamnya terdapat:
App
Header
CoreConcept
Button
Setelah dilakukan refactoring:
src/
├── App.jsx
└── components/
├── Header.jsx
├── CoreConcept.jsx
└── Button.jsx
Alur refactoring:
Satu File
│
▼
Identifikasi Component
│
▼
Pisahkan Component
│
▼
Buat File Baru
│
▼
Export Component
│
▼
Import Component
│
▼
Sesuaikan Relative Path
│
▼
Project Lebih Terorganisasi
17. Kesalahan yang Sering Terjadi
Lupa Melakukan export
Jika file berisi:
function Header() {
return <header>Header</header>;
}
tetapi tidak menggunakan:
export default Header;
component tersebut tidak dapat digunakan sebagai default export.
Cara yang benar:
export default function Header() {
return <header>Header</header>;
}
Salah Relative Path
Misalnya:
src/
├── assets/
│ └── logo.png
└── components/
└── Header.jsx
Dari Header.jsx, path yang benar adalah:
import logo from "../assets/logo.png";
bukan:
import logo from "./assets/logo.png";
Nama Component Diawali Huruf Kecil
Custom component harus menggunakan nama yang diawali huruf kapital.
Gunakan:
<Header />
bukan:
<header />
<header> merupakan HTML element, sedangkan <Header /> merupakan custom React component.
18. Poin Penting
Beberapa konsep utama yang perlu diingat:
- Pisahkan component ke file terpisah ketika project mulai berkembang.
- Gunakan folder
src/components/untuk mengorganisasi component. - Sebaiknya nama file mengikuti nama component.
- Gunakan
exportagar component dapat digunakan oleh file lain. - Gunakan
importuntuk menggunakan component yang sudah diekspor. - Perhatikan relative path seperti
./dan../. - Sesuaikan path asset setelah component dipindahkan.
- Satu file biasanya memiliki satu component utama.
- Struktur folder yang baik membantu meningkatkan readability dan maintainability.
Kesimpulan
Memisahkan component ke dalam file terpisah bukan sekadar membuat jumlah file menjadi lebih banyak. Tujuan utamanya adalah membuat aplikasi menjadi modular, terorganisasi, reusable, dan mudah dipelihara.
Struktur sederhana:
src/
├── assets/
│ └── react-logo.png