← Semua pembelajaran / Astro Nol → Portal Berita
Fase 11 · Performa & Capstone

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.

Sumber asli web.dev Resmi Rangkuman ~9 menit baca

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

MetrikBaikPerlu perbaikanBuruk
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 LCPDampak
Halaman dilayani dari edge CloudflareTerbesar — memangkas TTFB dari ratusan ms jadi puluhan
fetchpriority="high" pada gambar sampulBesar
Preload gambar sampulBesar
AVIF/WebP, ukuran tepatBesar di jaringan seluler
Font: font-display: swap + preloadSedang
CSS kritis sebarisKecil — Astro sudah kecil CSS-nya
loading="lazy" pada gambar sampulNegatif — 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 CLSPerbaikan
Slot iklan tanpa tinggimin-height sesuai ukuran unit
Gambar tanpa width/heightSelalu sertakan keduanya
Server island tanpa fallback berukuranmin-height pada fallback
Font yang mengganti ukuran tekssize-adjust pada @font-face
Embed media sosialBungkus dengan aspect-ratio
Banner yang muncul di atasJangan 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:

PenyebabPerbaikan
Skrip iklan memblokir thread utamaMuat asinkron; pertimbangkan Partytown
Tag manager memuat banyak skripAudit isinya — biasanya ada yang sudah tidak dipakai
Island yang dihidrasi terlalu awalclient:visible alih-alih client:load
Tabel besar dirender di klienPaginasi server (Fase 4)
Embed videoFasad (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

LighthouseData lapangan
PerangkatSimulasiPonsel sungguhan pembacamu
JaringanSimulasiJaringan seluler Indonesia yang sesungguhnya
IklanSering diblokirBerjalan penuh
CacheKosongCampuran
Dipakai Google untuk peringkatTidakYa

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.