Membedah cara kerja Livewire dari request sampai DOM: komponen di-render di server menjadi JSON kecil, client melakukan DOM morphing lewat snapshot dan diff, state hidup di server, serta peran root element dan perbedaan class component dengan Volt.

Setelah di episode 1 kita memahami mengapa Livewire ada, sekarang saatnya membedah bagaimana ia bekerja. Memahami arsitektur ini bukan sekadar pengetahuan teori — ia menentukan keputusan praktis yang akan kalian buat sepanjang series: kenapa state komponen harus dijaga seminimal mungkin, kenapa query di mount() hanya berjalan sekali, dan kenapa payload bisa membengkak jika kita asal memakai banyak properti publik.
Inti arsitektur Livewire sangat berbeda dari SPA. React/Vue merender di client dan berkomunikasi dengan server lewat API. Livewire melakukan kebalikannya: komponen hidup di server, dan browser hanyalah cermin tipis yang menampilkan HTML terakhir.
Ketika halaman dimuat, Livewire tidak mengirim JavaScript framework ke browser. Ia mengirim HTML hasil render Blade seperti biasa. Bedanya muncul saat user berinteraksi:
Alur lengkapnya:
Poin kuncinya: state hidup di server. Ketika satu interaksi selesai, server adalah sumber kebenaran. Ini berbeda total dari SPA yang menyimpan state di browser — dan inilah kenapa auth, validasi, dan query database di Livewire "gratis": semuanya sudah server-side sejak awal.
Note
Karena state di-serialisasi dan dikirim bolak-balik, prinsip sederhana berlaku: semakin sedikit public property, semakin kecil payload. Properti yang hanya dipakai di view sesaat sebaiknya dihitung ulang saat render (kita lihat solusinya: #[Computed] di episode 6) daripada disimpan sebagai state.
Semua yang kalian lihat di layar adalah kumpulan komponen. Secara konsep, komponen Livewire adalah gabungan:
Ada dua cara menulis komponen yang sama:
<?php
namespace App\Livewire;
use Livewire\Component;
class Counter extends Component
{
public int $count = 0;
public function increment()
{
$this->count++;
}
public function render()
{
return view('livewire.counter');
}
}<div>
<h1>Jumlah: {{ $count }}</h1>
<button wire:click="increment">Tambah</button>
</div><?php
use Livewire\Volt\Component;
new class extends Component {
public int $count = 0;
public function increment()
{
$this->count++;
}
};
?>
<div>
<h1>Jumlah: {{ $count }}</h1>
<button wire:click="increment">Tambah</button>
</div>Keduanya melakukan hal identik. Class component lebih eksplisit dan mudah di-test secara unit; Volt lebih ringkas dan cepat untuk komponen kecil. Perbandingan mendalam kita bahas di episode 19 — untuk sekarang cukup paham bahwa keduanya ada.
Ada satu aturan yang sering membuat pemula tersandung: setiap komponen harus memiliki satu elemen root — satu elemen paling luar yang membungkus seluruh view.
<div>
<h1>Counter</h1>
<button wire:click="increment">+</button>
</div><h1>Counter</h1>
<button wire:click="increment">+</button>Mengapa? Karena Livewire mengidentifikasi dan mengganti komponen lewat root element-nya. Saat render baru tiba, Livewire mencari div (atau elemen root) tersebut dan me-morph isinya. Jika ada dua elemen akar tanpa pembungkus, Livewire tidak tahu mana yang harus diganti.
Root element juga menjadi pembatas zona morphing: perubahan di dalamnya di-track, perubahan di luar (misalnya bagian layout yang statis) tidak.
Setiap request Livewire membawa snapshot — representasi JSON dari seluruh state komponen — dan menerima snapshot baru beserta diff HTML. Yang perlu kalian pahami bukan detail formatnya, melainkan implikasinya:
Karena state di-serialisasi, ada dua aturan emas:
protected/private untuk dependensi (misalnya service) tidak dikirim ke client.public string $search = ''; // state — dikirim ke client
protected UserRepository $repo; // dependensi — tidak dikirim
private string $internalToken = 'x'; // rahasia — tidak dikirimInti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan langsung praktik: menginstall Livewire (composer require livewire/livewire), menyiapkan layout Blade dengan @livewireStyles/@livewireScripts, membuat komponen pertama dengan php artisan make:livewire, dan merendernya di halaman. Sampai jumpa di episode 3!