← Semua pembelajaran / Astro Nol → Portal Berita
Fase 0 · Fondasi: Node, TypeScript & Cara Pikir Astro

Arsitektur island — kenapa Astro, bukan Next

Portal berita adalah kasus terbaik untuk Astro dan kasus terburuk untuk SPA. Alasannya bukan selera — ia turun langsung dari bentuk trafikmu.

Sumber asli docs.astro.build Resmi Rangkuman ~9 menit baca

Intisari

  • Astro mengirim nol JavaScript secara default. Setiap kilobyte yang sampai ke pembaca adalah sesuatu yang kamu minta secara eksplisit.
  • Island = komponen interaktif yang dihidrasi sendiri-sendiri. Sisanya HTML statis yang tidak pernah dihidrasi.
  • Ini MPA, bukan SPA: tiap navigasi adalah dokumen baru. Itu yang membuat halamannya bisa di-cache utuh di Cloudflare.
  • Untuk portal berita, 95% halaman tidak butuh JavaScript sama sekali — dan itu 95% yang bisa dilayani dari edge tanpa menyentuh origin.
  • Kelemahannya nyata: state yang harus hidup lintas navigasi butuh kerja ekstra, dan aplikasi yang benar-benar mirip aplikasi lebih cocok di framework lain.

Perbandingan yang sebenarnya

Framework modern membagi diri berdasarkan apa yang dikirim ke browser. Tiga jawaban yang berbeda:

SPA (React/Vue murni)SSR/Hydration penuh (Next, Nuxt)Island (Astro)
HTML pertamaNyaris kosongLengkapLengkap
JS yang dikirimSeluruh aplikasiSeluruh pohon komponen halamanHanya komponen yang ditandai
HidrasiSeluruh halamanSeluruh halamanPer island
NavigasiClient-sideClient-sideDokumen baru (MPA)
Bisa di-cache utuh di CDNShell-nya sajaRumit — tergantung data per-requestYa, HTML-nya langsung

Kenapa ini penting justru di trafik besar

Bayangkan halaman artikel di portalmu. Isinya: judul, byline, tanggal, badan artikel, gambar, daftar artikel terkait, dan — di kaki halaman — satu widget "berita terpopuler" yang bisa difilter per periode.

Di framework hidrasi penuh, seluruh pohon komponen itu dikirim sebagai JavaScript dan dijalankan ulang di browser hanya supaya widget terpopuler di kaki halaman bisa diklik. Pembaca membayar 200–400 KB JavaScript untuk membaca teks yang sudah ada di HTML.

Di Astro, yang dikirim adalah HTML, ditambah JavaScript untuk widget itu saja — biasanya belasan kilobyte. Sisanya tidak pernah menjadi JavaScript sama sekali:

---
import Layout from "../layouts/Artikel.astro";
import BadanArtikel from "../components/BadanArtikel.astro";
import Terpopuler from "../components/Terpopuler.vue";

const artikel = await ambilArtikel(Astro.params.slug);
---
<Layout judul={artikel.judul}>
  <BadanArtikel artikel={artikel} />

  <!-- Ini satu-satunya yang jadi JavaScript di halaman ini -->
  <Terpopuler client:visible />
</Layout>

BadanArtikel.astro tidak punya runtime. Ia dijalankan sekali saat render dan hasilnya HTML. Terpopuler.vue punya runtime, dan client:visible menyuruh Astro mengirim JavaScript-nya hanya saat komponen itu masuk viewport — jadi pembaca yang tidak pernah menggulir sampai kaki halaman tidak pernah mengunduhnya.

Konsekuensi yang paling menentukan untuk kasusmu

Karena halamannya HTML utuh tanpa data per-pengguna, ia bisa di-cache utuh di Cloudflare. Ini bukan efek samping kecil — ini seluruh alasan arsitektur ini dipilih untuk portal berita. Satu artikel yang dibaca 50.000 orang dirender sekali, lalu 49.999 sisanya dilayani dari edge tanpa menyentuh AWS-mu sama sekali.

Bandingkan dengan CI3-mu sekarang: tiap pembaca anonim yang membuka artikel yang sama tetap membangunkan PHP, membuka sesi, dan memukul MySQL. Perbedaannya bukan "Astro lebih cepat dari PHP" — dua-duanya cepat kalau diukur per request. Perbedaannya adalah berapa banyak request yang sampai ke origin sama sekali.

Lalu bagaimana dengan paywall?

Ini keberatan pertama yang wajar: kalau halamannya di-cache dan sama untuk semua orang, bagaimana membedakan member dan non-member?

Jawabannya server islands — pulau yang dirender di server, per pembaca, setelah kerangka halamannya sudah sampai. Kerangkanya tetap di-cache; hanya blok kecil itu yang dinamis:

<BadanArtikel artikel={artikel} potong={artikel.premium} />

<!-- Dirender di server, per pembaca, di luar cache halaman -->
<GerbangPaywall server:defer artikelId={artikel.id}>
  <div slot="fallback" class="paywall-skeleton">Memuat…</div>
</GerbangPaywall>

Ini dibahas tuntas di Fase 1 dan Fase 5. Yang perlu kamu bawa dari sini cuma satu kalimat: halaman bisa tetap cacheable meski isinya berbeda antar pembaca — dan itulah yang tidak bisa dilakukan CI3 tanpa menulis ulang cara sesinya bekerja.

Kapan Astro justru pilihan yang salah

Kalau produkmu…Pertimbangkan
Dashboard di balik login, tiap layar personal, state hidup lintas layarNuxt atau SPA murni — cache CDN tidak menolongmu di sana
Editor real-time, kanvas, aplikasi mirip desktopSPA. Model MPA akan melawanmu terus-menerus
Butuh transisi halus antar halaman yang mempertahankan pemutar videoBisa di Astro dengan ClientRouter, tapi ada biayanya (Fase 4)

Portalmu ada di sisi yang benar: mayoritas mutlak trafiknya adalah pembaca anonim membaca satu artikel lalu pergi. Bagian "aplikasi"-nya — dashboard member, riwayat tagihan, filter data perusahaan — nyata tapi kecil, dan itu tepat yang dilayani island.

Empat direktif hidrasi yang akan kamu pakai

DirektifKapan JavaScript-nya jalanContoh di portalmu
client:loadSegera, prioritas tinggiTombol login di header
client:idleSaat browser senggangWidget kurs mata uang
client:visibleSaat masuk viewportDefault yang benar — grafik, tabel, komentar
client:only="vue"Hanya di browser, tanpa render serverKomponen yang butuh window saat inisialisasi

client:only adalah yang paling sering disalahgunakan. Ia melewati render server sepenuhnya, jadi isinya tidak ada di HTML — artinya tidak terbaca mesin pencari dan menimbulkan pergeseran tata letak saat muncul. Untuk portal berita yang hidup dari SEO, pakai hanya kalau memang tidak ada jalan lain.

Latihan: ambil satu halaman artikel di portal CI3-mu sekarang. Buka DevTools → Network, filter JS, muat ulang dengan cache kosong, dan catat total kilobyte JavaScript yang terunduh. Lalu hitung berapa dari itu yang benar-benar dibutuhkan supaya halaman itu berfungsi — bukan yang membuatnya cantik. Simpan angkanya; di Fase 11 kamu akan membandingkannya dengan hasil Astro.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.