Template Blade yang kita tulis bukan kode yang dijalankan PHP — ia adalah bahasa perantara yang harus dikompilasi menjadi PHP murni setiap kali berkas berubah. Kompilasi ini pintar: hasilnya disimpan di storage/framework/views/ dan dipakai ulang selama berkas sumber tidak berubah. Tetapi ada satu momen yang tetap mahal: render pertama setelah deploy, ketika setiap template harus dikompilasi, dan momen itu jatuh pada pengunjung pertama yang paling sial. Chapter ini membedah proses kompilasi Blade dengan berkas hasil nyata, lalu menutupnya dengan ritual produksi view:cache yang memindahkan biaya kompilasi dari pengunjung ke pipeline deployment.
Blade Mengompilasi Diri Menjadi PHP #
Mari kita buat template kecil resources/views/latihan.blade.php:
<h1>{{ $judul }}</h1>
@if ($posts->isNotEmpty())
<ul>
@foreach ($posts as $post)
<li>{{ $post->judul }} — {{ $post->user->name }}</li>
@endforeach
</ul>
@else
<p>Belum ada post.</p>
@endifSaat view ini dirender, Laravel menerjemahkannya menjadi PHP murni dan menyimpan hasilnya di storage/framework/views/b611ed4a1bfd5456c145d6ce1bc6cf4e.php (603 byte). Isinya persis seperti ini:
<h1><?php echo e($judul); ?></h1>
<?php if($posts->isNotEmpty()): ?>
<ul>
<?php $__currentLoopData = $posts; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $post): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($post->judul); ?> — <?php echo e($post->user->name); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
<?php else: ?>
<p>Belum ada post.</p>
<?php endif; ?>
<?php /**PATH .../resources/views/latihan.blade.php ENDPATH**/ ?>
Setiap directive berubah menjadi struktur PHP asli: {{ }} menjadi echo e(...) (dengan escaping), @if menjadi if():, dan @foreach menjadi loop yang dilengkapi pelacak $loop. Nama berkas hasil adalah hash dari path sumber — begitu sumber berubah, hash-nya tidak berubah tetapi isi berkas dikompilasi ulang. Saat itulah biaya muncul, dan biayanya terukur:
use App\Models\Post;
$data = [
'judul' => 'Latihan Blade',
'posts' => Post::with('user')->orderBy('id')->limit(3)->get(),
];
$mulai = hrtime(true);
$html = view('latihan', $data)->render(); // render pertama = kompilasi + eksekusi
$ms1 = (hrtime(true) - $mulai) / 1e6;
$mulai = hrtime(true);
$html = view('latihan', $data)->render(); // render kedua = eksekusi saja
$ms2 = (hrtime(true) - $mulai) / 1e6;
echo sprintf("render pertama (kompilasi): %5.2f ms\n", $ms1);
echo sprintf("render kedua (pakai cache): %5.2f ms\n", $ms2);Output yang Dihasilkan:
render pertama (kompilasi): 7.02 ms
render kedua (pakai cache): 0.08 msRender pertama membayar 7,02 ms karena menulis berkas PHP baru; render kedua hanya 0,08 ms — hampir 90 kali lebih cepat — karena cukup include berkas yang sudah jadi. Di pengembangan, cache ini kadang jadi sumber kebingungan: template yang sudah diubah tetap menampilkan tampilan lama. Solusinya satu perintah:
view:clear dan view:cache #
php artisan view:clearOutput yang Dihasilkan:
INFO Compiled views cleared successfully.view:clear menghapus seluruh isi storage/framework/views/ sehingga semua template dikompilasi ulang pada render berikutnya. Di produksi, kebalikannya yang kita inginkan — semua template dikompilasi sebelum pengunjung datang:
php artisan view:cacheOutput yang Dihasilkan:
INFO Blade templates cached successfully.Perintah ini me-render setiap template yang ditemukan — termasuk view bawaan paket seperti pagination dan mail — dan menyimpan hasil kompilasinya. Pada sandbox, hasilnya 63 berkas PHP seukuran total 468 KB. Setelah perintah ini, tidak ada pengunjung yang membayar biaya kompilasi: request pertama setelah deploy sama cepatnya dengan request ke-10.000. Inilah makna baris views ... 35.29ms DONE pada output php artisan optimize di chapter sebelumnya — perintah optimize menjalankan view:cache sebagai bagian dari paketnya, jadi pipeline yang memakai optimize sudah otomatis prakompilasi.
Kapan View Cache Berdampak #
Kejujuran angka diperlakukan sama seperti bab-bab sebelumnya. Kompilasi template kecil kita hanya 7 ms — pada aplikasi dengan trafik rendah, pengunjung pertama tidak akan menyadari bedanya. Dampaknya nyata pada kombinasi: template yang kompleks (ratusan baris, banyak component dan layout), jumlah template yang banyak, dan trafik yang menyentuh halaman baru segera setelah deploy. E-commerce saat kampanye besar adalah contoh klasiknya — pengunjung pertama pada halaman kategori yang baru di-deploy tidak selayaknya menjadi penguji kompilasi.
Trio cache framework — route, config, view — kini lengkap: definisi dibekukan sekali di pipeline agar permintaan hanya membayar eksekusi. Sisa beban yang dirasakan pengunjung ada di browser: berkas CSS, JavaScript, dan gambar. Chapter berikutnya mengecilkan aset itu dengan build produksi Vite dan strategi cache browser.