Revolusi rendering UI di NativePHP v4 "SuperNative": komponen Blade dirender sebagai view SwiftUI & Jetpack Compose asli tanpa WebView, mapping komponen ke native elements, state binding dua arah, dan konversi satu layar WebView-based menjadi native UI murni.

Setelah di episode 11 kita memahami persistent mode dan background execution, pada episode ini kita masuk ke paradigma baru yang paling revolusioner di NativePHP: v4 "SuperNative". Di versi ini, komponen Blade yang sebelumnya dirender di WebView kini dikonversi secara otomatis menjadi view SwiftUI (iOS) dan Jetpack Compose (Android) asli — tanpa WebView sama sekali.
Ini bukan iterasi kecil. WebView一直是 hybrid app yang membedakan dari native. Dengan SuperNative, NativePHP menutup gap ini: performa rendering asli, animasi 60fps, gesture native, dan UX yang tidak bisa dibedakan dari aplikasi native murni.
Blade Template → HTML/CSS/JS → WebView → Render di layarWebView adalah browser mini yang di-embed di dalam aplikasi. Ia menampilkan HTML, menjalankan JavaScript, dan merender CSS — persis seperti browser biasa. Kelemahannya: performa rendering, scrolling, dan animasi tidak sehalus native.
Blade Template → SuperNative Compiler → SwiftUI (iOS) / Jetpack Compose (Android) → Render di layarSuperNative compiler membaca komponen Blade dan menghasilkan view native yang sesuai. Hasilnya: rendering yang identik dengan aplikasi native murni, tanpa kompromi performa.
SuperNative menyediakan mapping dari komponen Blade ke native element:
| Blade/HTML | SwiftUI | Jetpack Compose |
|---|---|---|
<div> | VStack / HStack | Column / Row |
<button> | Button | Button |
<input> | TextField | TextField |
<img> | Image | Image |
<text> | Text | Text |
<list> | List | LazyColumn |
<card> | Card | Card |
Contoh Blade yang dikonversi:
<div class="task-card bg-white rounded-lg p-4 shadow-sm">
<h3 class="text-lg font-semibold">{{ $task->title }}</h3>
<p class="text-gray-500">{{ $task->description }}</p>
<button wire:click="toggle({{ $task->id }})">
{{ $task->completed ? 'Selesai' : 'Tandai Selesai' }}
</button>
</div>SuperNative mengkonversi ini menjadi:
SwiftUI (iOS):
VStack(alignment: .leading) {
Text(task.title).font(.headline)
Text(task.description).foregroundColor(.gray)
Button(action: { viewModel.toggle(task.id) }) {
Text(task.completed ? "Selesai" : "Tandai Selesai")
}
}
.padding()
.background(Color.white)
.cornerRadius(8)Jetpack Compose (Android):
Column(modifier = Modifier.padding(16.dp)) {
Text(text = task.title, style = MaterialTheme.typography.headlineMedium)
Text(text = task.description, color = Color.Gray)
Button(onClick = { viewModel.toggle(task.id) }) {
Text(if (task.completed) "Selesai" else "Tandai Selesai")
}
}Salah satu kekuatan SuperNative adalah state binding dua arah antara PHP dan native view. Saat PHP mengubah state, view update otomatis. Saat user berinteraksi dengan view, state PHP update otomatis.
<?php
use Livewire\Component;
class Counter extends Component
{
public $count = 0;
public function increment()
{
$this->count++;
}
public function decrement()
{
$this->count--;
}
public function render()
{
return view('livewire.counter');
}
}<div class="flex items-center gap-4">
<button wire:click="decrement">-</button>
<span class="text-2xl font-bold">{{ $count }}</span>
<button wire:click="increment">+</button>
</div>Saat tombol ditekan, state $count berubah di PHP → SuperNative memperbarui view native → tampilan berubah secara real-time. Semua terjadi di perangkat, tanpa network round-trip.
Untuk aplikasi yang sudah ada dengan WebView, migrasi ke SuperNative relatif mulus:
<?php
return [
'rendering' => [
'mode' => 'native', // 'webview' untuk backward compatibility
'fallback' => 'webview', // fallback jika komponen tidak didukung
],
];Jika ada komponen Blade yang belum didukung oleh SuperNative, ia akan menggunakan fallback ke WebView secara selektif — tidak perlu rewrite seluruh aplikasi sekaligus.
Note
SuperNative tidak menggantikan Livewire — ia menggantikan WebView. Livewire tetap menjadi state management layer, sedangkan rendering dilakukan oleh SwiftUI/Jetpack Compose. Pola development Blade + Livewire tetap berlaku.
Ambil layar list task berbasis WebView dan konversi ke native:
Sebelum (WebView):
<div class="max-w-md mx-auto p-4">
<h1 class="text-2xl font-bold mb-4">Tasks</h1>
@foreach($tasks as $task)
<div class="bg-white rounded-lg p-4 mb-2 shadow">
<span>{{ $task->title }}</span>
</div>
@endforeach
</div>Setelah diaktifkan SuperNative (mode: native), template yang sama dikonversi ke LazyColumn (Android) atau List (iOS) secara otomatis. Kode Blade tidak berubah — hanya rendering engine-nya yang berpindah dari WebView ke native.
Inti yang harus dibawa pulang:
<div> → VStack/Column, <button> → Button, <input> → TextField.Di episode 13 selanjutnya, kita akan membahas Native Components & Navigation — top bar, tab bar, list native, glass effects, transisi platform, native route middleware, dan navigasi dengan stack asli. Sampai jumpa di episode 13!