Untuk waktu yang lama, saya berasumsi bahwa skor Lighthouse yang tinggi sebagian besar merupakan hasil dari penyetelan. Mengompresi gambar, menunda skrip, memperbaiki pergeseran tata letak, menyesuaikan tema, mengganti plugin, dan mengulangi siklus setiap kali peringatan baru muncul.
Seiring waktu, asumsi tersebut berhenti sesuai dengan apa yang saya lihat dalam praktik.
Situs yang konsisten mendapat skor baik bukanlah yang memiliki upaya optimasi paling banyak. Mereka adalah situs di mana browser hanya memiliki lebih sedikit pekerjaan yang harus dilakukan.
Pada titik itu, Lighthouse berhenti terasa seperti alat optimasi dan mulai terasa seperti sinyal diagnostik untuk pilihan arsitektur.
Lighthouse tidak mengevaluasi framework atau alat. Lighthouse mengevaluasi hasil.
Seberapa cepat konten yang bermakna muncul.
Seberapa banyak JavaScript memblokir thread utama.
Seberapa stabil tata letak tetap selama pemuatan.
Seberapa mudah diakses dan di-crawl struktur dokumen.
Hasil-hasil ini adalah efek hilir dari keputusan yang dibuat jauh lebih awal dalam stack. Secara khusus, mereka mencerminkan seberapa banyak komputasi yang ditangguhkan ke browser saat runtime.
Ketika sebuah halaman bergantung pada bundle sisi klien yang besar untuk menjadi dapat digunakan, skor yang buruk tidak mengejutkan. Ketika sebuah halaman sebagian besar adalah HTML statis dengan logika sisi klien yang terbatas, kinerja menjadi jauh lebih dapat diprediksi.
Di seluruh audit yang telah saya jalankan dan proyek yang telah saya kerjakan, eksekusi JavaScript adalah sumber paling umum dari regresi Lighthouse.
Ini bukan karena kodenya berkualitas rendah. Ini karena JavaScript bersaing untuk lingkungan eksekusi single-threaded selama pemuatan halaman.
Runtime framework, logika hidrasi, grafik dependensi, dan inisialisasi state semuanya mengonsumsi waktu sebelum halaman menjadi interaktif. Bahkan fitur interaktif kecil sering memerlukan bundle yang tidak proporsional besar.
Arsitektur yang mengasumsikan JavaScript secara default memerlukan upaya berkelanjutan untuk menjaga kinerja tetap terkendali. Arsitektur yang memperlakukan JavaScript sebagai opt-in eksplisit cenderung menghasilkan hasil yang lebih stabil.
Output yang telah di-render sebelumnya menghilangkan beberapa variabel dari persamaan kinerja.
Tidak ada biaya rendering sisi server pada saat permintaan.
Tidak ada bootstrap sisi klien yang diperlukan agar konten muncul.
Browser menerima HTML yang dapat diprediksi dan lengkap.
Dari perspektif Lighthouse, ini meningkatkan metrik seperti TTFB, LCP, dan CLS tanpa memerlukan pekerjaan optimasi yang ditargetkan. Generasi statis tidak menjamin skor sempurna, tetapi secara signifikan mempersempit rentang mode kegagalan.
Sebelum membangun kembali blog pribadi saya, saya menjelajahi beberapa pendekatan umum, termasuk pengaturan berbasis React yang mengandalkan hidrasi secara default. Mereka fleksibel dan mampu, tetapi kinerja memerlukan perhatian berkelanjutan. Setiap fitur baru memperkenalkan pertanyaan tentang mode rendering, pengambilan data, dan ukuran bundle.
Karena penasaran, saya mencoba pendekatan berbeda yang mengasumsikan HTML statis terlebih dahulu dan memperlakukan JavaScript sebagai pengecualian. Saya memilih Astro untuk eksperimen ini, karena batasan defaultnya selaras dengan pertanyaan yang ingin saya uji.
Yang menonjol bukanlah skor awal yang dramatis, tetapi seberapa sedikit upaya yang diperlukan untuk mempertahankan kinerja dari waktu ke waktu. Menerbitkan konten baru tidak memperkenalkan regresi. Elemen interaktif kecil tidak bercascade menjadi peringatan yang tidak terkait. Baseline hanya lebih sulit untuk terkikis.
Saya mendokumentasikan proses build dan trade-off arsitektur dalam catatan teknis terpisah saat mengerjakan eksperimen ini pada blog pribadi dengan skor Lighthouse sempurna.
Pendekatan ini tidak secara universal lebih baik.
Arsitektur static-first tidak ideal untuk aplikasi yang sangat dinamis dan stateful. Mereka dapat memperumit skenario yang sangat bergantung pada data pengguna yang diautentikasi, pembaruan real-time, atau manajemen state sisi klien yang kompleks.
Framework yang mengasumsikan rendering sisi klien menawarkan lebih banyak fleksibilitas dalam kasus tersebut, dengan biaya kompleksitas runtime yang lebih tinggi. Intinya bukan bahwa satu pendekatan lebih unggul, tetapi bahwa trade-off tercermin langsung dalam metrik Lighthouse.
Apa yang ditampilkan Lighthouse bukanlah upaya, tetapi entropi.
Sistem yang mengandalkan komputasi runtime mengakumulasi kompleksitas saat fitur ditambahkan. Sistem yang melakukan lebih banyak pekerjaan pada waktu build membatasi kompleksitas tersebut secara default.
Perbedaan itu menjelaskan mengapa beberapa situs memerlukan pekerjaan kinerja konstan sementara yang lain tetap stabil dengan intervensi minimal.
Skor Lighthouse yang tinggi jarang merupakan hasil dari optimasi agresif. Mereka biasanya muncul secara alami dari arsitektur yang meminimalkan apa yang harus dilakukan browser pada pemuatan pertama.
Alat datang dan pergi, tetapi prinsip dasarnya tetap sama. Ketika kinerja adalah batasan default daripada tujuan, Lighthouse berhenti menjadi sesuatu yang Anda kejar dan menjadi sesuatu yang Anda amati.
Pergeseran itu kurang tentang memilih framework yang tepat dan lebih tentang memilih di mana kompleksitas diizinkan untuk ada.


