Mengoptimalkan Livewire untuk produksi: query efficiency dan eager loading, caching dengan Cache dan #[Computed], pagination dan lazy loading, route cache & OPcache, serta mengukur payload dan DOM diff sebelum deploy.

Komponen yang berfungsi belum tentu siap produksi. Aplikasi Livewire yang lambat biasanya bukan karena framework-nya, melainkan karena cara pemakaiannya: query yang boros, state yang terlalu banyak, atau caching yang tidak ada sama sekali. Di episode ini kita merangkai semua teknik performa yang sudah disinggung — dan menambah lapisan yang wajib dilakukan sebelum deploy.
Pola pikir yang benar: ukur dulu, optimasi kemudian. Jangan menebak mana yang lambat — ukur payload, jumlah query, dan waktu render. Setelah punya data, terapkan teknik yang tepat di titik yang benar.
Aturan yang sudah dibahas di series Laravel berlaku penuh di Livewire:
#[Computed]
public function posts()
{
return Post::paginate(20); // user query per post!
}#[Computed]
public function posts()
{
return Post::with('author:id,name')->paginate(20);
}Setiap kali komponen me-render (dan re-render), query dijalankan ulang — jadi efisiensi query adalah prioritas nomor satu.
Gunakan #[Computed] agar query dijalankan sekali per request, berapa pun kali dipakai (episode 6):
#[Computed]
public function totalRevenue()
{
return Revenue::sum('total');
}Jangan pernah Post::all() di halaman data. paginate(20) + $posts->links() (episode 11) membatasi kerja server sekaligus payload.
Data agregat yang tidak berubah setiap detik layak di-cache:
use Illuminate\Support\Facades\Cache;
#[Computed]
public function totalRevenue()
{
return Cache::remember('revenue.total', now()->addMinutes(5), function () {
return Revenue::sum('total');
});
}Di Livewire v4, computed property mendukung cache eksplisit dengan TTL:
#[Computed]
public function topProducts()
{
return Cache::remember('top-products', 300, function () {
return Product::orderBy('sales', 'desc')->limit(5)->get();
});
}Cache yang tepat memindahkan beban dari database ke memori — dan di aplikasi Livewire yang sering me-render ulang, dampaknya langsung terasa. Jangan lupa membatalkan cache saat data berubah (misalnya di hook updated atau setelah simpan).
Warning
Hati-hati dengan stale cache: data yang di-cache terlalu lama menampilkan nilai basi. Aturan praktisnya: cache untuk data yang memang jarang berubah (statistik, ranking), jangan untuk data yang wajib real-time (saldo, status pesanan). Dan selalu buat kunci cache menyertakan konteks penting (misalnya revenue.total saja cukup, tapi tambahkan scope bila ada filter).
Kombinasikan teknik dari episode 14 dan 16:
lazy atau defer agar tidak memblokir initial render.wire:init daripada query di mount().bundle), mengurangi jumlah request paralel.Sebelum deploy, jalankan optimization Laravel:
php artisan optimize
php artisan view:cache
php artisan event:cache
php artisan config:cacheconfig:cache — melindungi config sekaligus mempercepat boot.route:cache — mempercepat resolusi route (jalankan terpisah bila perlu).view:cache — meng-kompilasi Blade termasuk view Livewire.Pastikan OPcache aktif di PHP (wajib di produksi):
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0Dengan validate_timestamps=0, OPcache tidak mengecek timestamp file — lebih cepat, tapi berarti perubahan kode baru berlaku setelah php-fpm di-restart (pola standar deploy).
Kurang berguna mengoptimasi tanpa tahu angkanya. Tiga cara mengukur:
livewire/update — snapshot besar = state boros.composer require barryvdh/laravel-debugbar --devMenampilkan jumlah query, waktu render, dan memory per request — cara tercepat menemukan N+1 dan query mahal.
Di response livewire/update, periksa bagian snapshot JSON: semakin besar data, semakin besar state yang dikirim bolak-balik. Jika besar, pindahkan nilai turunan ke #[Computed].
Tanda-tanda yang harus segera dikoreksi:
livewire/update dengan response ratusan KB → pindah ke computed + lazy.with()) — tidak ada N+1.#[Computed] untuk nilai turunan; tidak ada query berulang per render.php artisan optimize + OPcache aktif.APP_DEBUG=false di produksi).Post::all() di komponen: membengkakkan payload dan mengulur render.validate_timestamps=1 di produksi: masih mengecek file per request — buang kecepatannya.Inti yang harus dibawa pulang:
Cache::remember + invalidation yang benar.php artisan optimize dan aktifkan OPcache sebelum deploy.Di episode 22 — episode terakhir — kita akan membahas SFC & refleksi akhir: single-file components untuk project skala kecil-menengah, rekap seluruh perjalanan episode 0-21, checklist production lengkap, dan sumber resmi untuk terus berkembang. Sampai jumpa di episode 22!