Core Web Vitals untuk portal berita
Astro memberimu keuntungan besar di sini secara bawaan — lalu iklan, embed, dan gambar sampul mengambilnya kembali. Ini yang menentukan skor akhirmu.
Intisari
- Tiga metrik: LCP (memuat), INP (responsif), CLS (stabil).
- LCP di portal berita hampir selalu gambar sampul — jadikan
eager+fetchpriority="high". - CLS paling sering dirusak slot iklan tanpa tinggi tetap dan server island tanpa fallback berukuran.
- INP jarang jadi masalah di Astro — kecuali kamu memuat banyak JavaScript pihak ketiga.
- Yang dinilai Google adalah data lapangan (CrUX), bukan skor Lighthouse di laptopmu.
Ambang
| Metrik | Baik | Perlu perbaikan | Buruk |
|---|---|---|---|
| LCP — elemen terbesar terlihat | ≤ 2,5 dtk | ≤ 4,0 dtk | > 4,0 dtk |
| INP — respons terhadap interaksi | ≤ 200 ms | ≤ 500 ms | > 500 ms |
| CLS — pergeseran tata letak | ≤ 0,1 | ≤ 0,25 | > 0,25 |
Yang dinilai adalah persentil ke-75 dari pembaca sungguhan — bukan rata-rata, dan bukan angka di laptopmu. Artinya satu dari empat pembacamu yang paling lambat yang menentukan skormu.
LCP: hampir selalu gambar sampul
<!-- Elemen LCP: eager, prioritas tinggi, ukuran pasti -->
<img
src={urlGambar(artikel.gambar, 1200)}
srcset={`${urlGambar(artikel.gambar, 400)} 400w,
${urlGambar(artikel.gambar, 800)} 800w,
${urlGambar(artikel.gambar, 1200)} 1200w`}
sizes="(max-width: 700px) 100vw, 700px"
alt={artikel.gambarAlt ?? artikel.judul}
width="1200" height="675"
loading="eager"
fetchpriority="high"
decoding="async"
/>
<!-- Preload di head: browser mulai mengunduh sebelum mem-parsing body -->
<link
rel="preload" as="image"
href={urlGambar(artikel.gambar, 1200)}
imagesrcset={`… 400w, … 800w, … 1200w`}
imagesizes="(max-width: 700px) 100vw, 700px"
slot="kepala"
/>
| Perbaikan LCP | Dampak |
|---|---|
| Halaman dilayani dari edge Cloudflare | Terbesar — memangkas TTFB dari ratusan ms jadi puluhan |
fetchpriority="high" pada gambar sampul | Besar |
| Preload gambar sampul | Besar |
| AVIF/WebP, ukuran tepat | Besar di jaringan seluler |
Font: font-display: swap + preload | Sedang |
| CSS kritis sebaris | Kecil — Astro sudah kecil CSS-nya |
loading="lazy" pada gambar sampul | Negatif — jangan pernah |
Baris pertama itu yang paling sering diremehkan. LCP dimulai dari TTFB, dan TTFB adalah bagian terbesarnya untuk pembaca yang jauh dari origin-mu. Halaman yang dilayani dari edge Cloudflare di Jakarta punya TTFB puluhan milidetik; halaman yang harus menunggu render di ECS punya TTFB ratusan. Seluruh Fase 8 adalah pekerjaan LCP.
CLS: iklan dan island
/* Slot iklan: pesan ruangnya SEBELUM iklan datang */
.slot-iklan {
min-height: 250px; /* tinggi unit iklan yang kamu pakai */
display: flex;
align-items: center;
justify-content: center;
background: var(--abu-muda);
}
@media (max-width: 700px) {
.slot-iklan { min-height: 100px; }
}
/* Server island: fallback setinggi isi sungguhannya */
.paywall-rangka { min-height: 360px; }
| Penyebab CLS | Perbaikan |
|---|---|
| Slot iklan tanpa tinggi | min-height sesuai ukuran unit |
Gambar tanpa width/height | Selalu sertakan keduanya |
| Server island tanpa fallback berukuran | min-height pada fallback |
| Font yang mengganti ukuran teks | size-adjust pada @font-face |
| Embed media sosial | Bungkus dengan aspect-ratio |
| Banner yang muncul di atas | Jangan sisipkan di atas konten yang sudah dirender |
Iklan adalah penyebab CLS nomor satu di portal berita, dan sering di luar kendali langsungmu. Unit iklan responsif bisa mengembalikan tinggi apa pun. Yang bisa kamu lakukan: pesan tinggi minimum sesuai ukuran yang paling sering dikembalikan, dan hindari menyisipkan iklan di tengah artikel yang sudah terlihat. Jika perlu, bicarakan dengan tim monetisasi — skor CWV yang buruk memengaruhi peringkat, yang memengaruhi trafik, yang memengaruhi pendapatan iklan itu sendiri.
INP
Astro jarang bermasalah di sini karena hampir tidak ada JavaScript yang berjalan. Kalau INP-mu buruk, penyebabnya hampir pasti pihak ketiga:
| Penyebab | Perbaikan |
|---|---|
| Skrip iklan memblokir thread utama | Muat asinkron; pertimbangkan Partytown |
| Tag manager memuat banyak skrip | Audit isinya — biasanya ada yang sudah tidak dipakai |
| Island yang dihidrasi terlalu awal | client:visible alih-alih client:load |
| Tabel besar dirender di klien | Paginasi server (Fase 4) |
| Embed video | Fasad (Fase 8) |
Mengukur dari pembaca sungguhan
// src/components/Vitals.astro — kirim ke endpointmu sendiri
<script>
import { onLCP, onINP, onCLS, onTTFB } from "web-vitals";
function kirim(metrik) {
const data = JSON.stringify({
nama: metrik.name,
nilai: Math.round(metrik.value),
rating: metrik.rating,
jalur: location.pathname,
koneksi: navigator.connection?.effectiveType,
});
// sendBeacon: terkirim meski pembaca menutup tab
navigator.sendBeacon?.("/api/vitals", data);
}
onLCP(kirim); onINP(kirim); onCLS(kirim); onTTFB(kirim);
</script>
// src/pages/api/vitals.ts
export const POST: APIRoute = async ({ request }) => {
const teks = await request.text();
const hasil = SkemaVitals.safeParse(JSON.parse(teks));
if (hasil.success) {
// Masuk ke log terstruktur → metrik CloudWatch (Fase 10)
log("info", "vitals", hasil.data);
}
return new Response(null, { status: 204 });
};
Data lapanganmu sendiri jauh lebih berguna daripada CrUX. CrUX dilaporkan per bulan dan digabungkan per situs; datamu sendiri per halaman, per jenis koneksi, dan tersedia dalam hitungan menit. Saat kamu men-deploy perubahan yang seharusnya memperbaiki LCP, kamu ingin tahu hasilnya hari itu — bukan bulan depan.
Lighthouse vs lapangan
| Lighthouse | Data lapangan | |
|---|---|---|
| Perangkat | Simulasi | Ponsel sungguhan pembacamu |
| Jaringan | Simulasi | Jaringan seluler Indonesia yang sesungguhnya |
| Iklan | Sering diblokir | Berjalan penuh |
| Cache | Kosong | Campuran |
| Dipakai Google untuk peringkat | Tidak | Ya |
Lighthouse berguna untuk membandingkan sebelum-sesudah dari satu perubahan. Untuk mengetahui skormu yang sebenarnya, hanya data lapangan yang berlaku.
Latihan: pasang pengumpul web-vitals dan kirim ke endpointmu sendiri. Setelah
sehari, kelompokkan p75 LCP per jenis koneksi dengan Logs Insights. Bandingkan pembaca 4G dengan yang
di jaringan lebih lambat — selisihnya biasanya besar, dan menunjukkan di mana perbaikanmu paling
berarti. Lalu buka Search Console → Core Web Vitals dan bandingkan angka portal CI3-mu sekarang dengan
angka Astro.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.