- Bab 2 dari 10
- 30 menit
- 1 latihan kode
- 4 soal kuis
Virtual DOM, gaya deklaratif, dan proyek pertama dengan Vite
Di bab ini (9 bagian)
Tujuan bab ini
- Menjelaskan cara kerja Virtual DOM dan reconciliation langkah demi langkah.
- Membedakan gaya imperatif (DOM manual) dan deklaratif (React).
- Membuat proyek React pertama dengan Vite dan menjalankannya.
- Mengenali fungsi tiap file dan folder di proyek Vite.
DOM itu mahal
DOM (Document Object Model) adalah representasi halaman web yang dipegang browser. Setiap kali kamu mengubah DOM, misalnya mengganti teks atau menambah elemen, browser mungkin harus menghitung ulang posisi elemen (layout) lalu menggambar ulang layar (repaint). Kalau perubahan kecil terjadi berkali-kali dan tersebar, proses ini bisa berat dan kodenya gampang berantakan.
React mengatasi ini dengan satu ide: jangan sentuh DOM sebelum tahu persis apa yang berubah.
Virtual DOM dan reconciliation
Virtual DOM adalah gambaran tampilan dalam bentuk objek JavaScript biasa. Objek di memori jauh lebih murah dibuat dan dibandingkan daripada elemen DOM asli.
Alurnya ada empat langkah:
- State berubah. Misalnya pengguna menekan tombol dan
setAngkadipanggil. - Render ulang. React memanggil lagi fungsi komponen dan mendapat pohon elemen baru.
- Diffing. Pohon baru dibandingkan dengan pohon sebelumnya untuk mencari perbedaan.
- Commit ke DOM. Hanya bagian yang berbeda yang diubah di DOM asli.
Proses mencocokkan pohon lama dan baru ini disebut reconciliation. Ada dua aturan penting yang dipakai React:
- Elemen dengan tipe sama di posisi yang sama (misalnya
<p>tetap<p>) dipertahankan; React cuma memperbarui atribut atau teksnya. - Elemen dengan tipe berbeda (misalnya
<p>berganti<div>) dibuang beserta seluruh isinya, lalu dibuat ulang dari nol.
Untuk daftar item, React memakai atribut key untuk tahu item mana yang sama, mana yang baru, dan mana yang dihapus. Itu sebabnya key sangat penting, dan kita bahas di bab props dan list.
Contoh konkret. Misal komponen ini dirender dengan angka 3, lalu berubah jadi 4:
Analogi: Virtual DOM itu seperti menulis draf revisi di kertas buram, mencoret bagian yang beda, lalu menyalin hanya bagian yang dicoret ke dokumen asli. Kamu tidak mengetik ulang seluruh dokumen.
Satu koreksi mitos: Virtual DOM tidak membuat React "lebih cepat dari JavaScript murni". Manipulasi DOM manual yang ditulis sangat hati-hati tetap bisa lebih cepat. Keunggulan React adalah kamu mendapat pembaruan yang cukup efisien secara otomatis tanpa harus memikirkan setiap perubahan DOM sendiri.
Imperatif vs deklaratif
Bandingkan dua cara membuat tombol penghitung.
Imperatif dengan JavaScript biasa. Kamu menulis setiap langkah:
Deklaratif dengan React. Kamu cukup menjelaskan tampilan untuk setiap nilai data:
Di versi React tidak ada querySelector atau textContent. Kamu bilang "tombol ini menampilkan Nilai: {count}", lalu React yang memastikan layar selalu cocok dengan count.
Kenapa ini penting? Bayangkan angka yang sama juga tampil di header, di badge notifikasi, dan di judul tab. Dengan gaya imperatif, kamu harus ingat memperbarui tiga tempat setiap kali data berubah, dan lupa satu saja berarti tampilan tidak sinkron. Dengan gaya deklaratif, ketiganya membaca count yang sama dan otomatis ikut berubah.
Rumus yang sering dipakai: UI = f(state). Tampilan adalah hasil fungsi dari data.
Persiapan lingkungan kerja
Yang kamu butuhkan:
| Alat | Keterangan |
|---|---|
| Node.js | Versi LTS terbaru (minimal 20.19 untuk Vite versi terbaru). Sudah termasuk npm. |
| Package manager | npm sudah cukup; yarn atau pnpm juga bisa. |
| Code editor | VS Code dengan ekstensi ESLint dan Prettier. |
| Browser | Chrome atau Firefox, plus ekstensi React Developer Tools. |
Cek instalasi di terminal:
Membuat proyek pertama dengan Vite
Buka http://localhost:5173 di browser. Coba ubah teks di src/App.jsx lalu simpan: halaman langsung berubah tanpa refresh. Fitur ini disebut Hot Module Replacement (HMR), dan state di halaman biasanya tetap terjaga.
Skrip lain yang tersedia di package.json:
npm run buildmembuat versi produksi yang sudah dioptimasi ke folderdist/.npm run previewmenjalankan hasil build secara lokal untuk dicek.npm run lintmemeriksa kode dengan ESLint.
Struktur proyek Vite
Urutan file yang dijalankan saat aplikasi dibuka:
- Browser memuat
index.html. Di dalamnya ada<div id="root"></div>dan<script type="module" src="/src/main.jsx">. Di Vite,index.htmlada di akar proyek, bukan dipublic/. src/main.jsxmencari elemen#rootlalu menempelkan komponenAppke sana:
src/App.jsxadalah komponen paling atas. Dari sinilah semua komponen lain dirangkai.
StrictMode hanya aktif saat development. Ia sengaja menjalankan beberapa hal dua kali untuk membantu menemukan bug, jadi jangan kaget kalau console.log di komponen muncul dua kali.
Folder public/ cocok untuk file yang dipanggil lewat URL tetap, misalnya favicon.svg yang diakses sebagai /favicon.svg. Gambar yang di-import dari kode taruh di src/assets/. package.json mencatat dependensi seperti react dan react-dom, serta skrip dev, build, preview, dan lint.
Saat proyek membesar, banyak tim menambah folder components/, pages/, hooks/, dan services/ di dalam src/. React tidak memaksa struktur tertentu; yang penting konsisten.
Kesalahan umum
- Memakai
create-react-app, padahal sudah usang. Pakai Vite. - Lupa
npm installsetelah membuat proyek atau meng-clone repo, sehingganpm run devgagal. - Mengubah DOM langsung dengan
document.querySelectordi dalam komponen React. Biarkan React yang mengurus DOM. - Mengira Virtual DOM mengganti seluruh halaman setiap render. Yang diganti hanya bagian yang berbeda.
- Mengedit isi
node_modules/atau meng-commit folder itu ke Git.
Rangkuman
- Virtual DOM adalah objek JavaScript yang menggambarkan UI; React membandingkan versi lama dan baru (reconciliation) lalu hanya mengubah DOM yang berbeda.
- Tipe elemen sama diperbarui, tipe berbeda dibuat ulang; key membantu mencocokkan item daftar.
- Imperatif berarti menulis langkah mengubah DOM; deklaratif berarti menjelaskan tampilan untuk tiap state.
- Proyek baru:
npm create vite@latest,npm install,npm run dev, lalu buka port 5173. - Alur proyek Vite:
index.htmlmemuatsrc/main.jsx, yang merenderApp.jsxke#root.
Slide 9 sampai 13 dari deck ReactJS. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Diffing sederhana ala Virtual DOM
Simulasikan langkah diffing. Buat fungsi bandingkan(lama, baru) yang menerima dua array teks (isi baris list sebelum dan sesudah render) lalu mengembalikan array operasi, diperiksa dari index 0 sampai index terakhir array yang lebih panjang:
- Teks sama: tidak ada operasi.
- Teks berbeda:
{ op: "ubah", index, ke: teksBaru }. - Hanya ada di
baru:{ op: "tambah", index, ke: teksBaru }. - Hanya ada di
lama:{ op: "hapus", index }.
Contoh: bandingkan(["a", "b"], ["a", "c", "d"]) menghasilkan [{ op: "ubah", index: 1, ke: "c" }, { op: "tambah", index: 2, ke: "d" }].
React melakukan hal serupa (tentu jauh lebih canggih) saat state berubah: hanya operasi hasil perbandingan inilah yang diterapkan ke DOM asli. Perhatikan juga bahwa perbandingan per index ini yang membuat key penting: tanpa key, menghapus item pertama terlihat seperti mengubah semua baris.
Cek pemahaman
1Apa yang dilakukan React setelah membandingkan Virtual DOM lama dan baru?
2Jika elemen <p> berganti menjadi <div> di posisi yang sama, React cukup memperbarui atributnya saja.
3HTML apa yang dihasilkan saat komponen ini dirender dengan <Skor angka={4} />?
function Skor({ angka }) { return ( <div className="skor"> <h2>Skor</h2> <p>{angka * 2}</p> </div> ); }4Perintah apa yang menjalankan server pengembangan Vite di http://localhost:5173?