Catatan Belajar · · 3 menit baca
Belajar Astro: situs cepat dengan nol JavaScript default
Tutorial Astro dari instalasi: halaman .astro, komponen + scoped style, islands architecture (client:load vs client:visible), dan content collections untuk blog markdown.
Astro adalah framework untuk situs yang kontennya lebih banyak daripada interaksinya — landing page, blog, dokumentasi, company profile. Prinsipnya radikal: nol JavaScript di browser secara default, dan kamu “menyalakan” interaktivitas hanya di komponen yang membutuhkannya (islands architecture).
1. Instalasi
Prasyarat: Node.js 20+.
npm create astro@latest situs-saya
# pilih template "Empty" untuk belajar dari nol
cd situs-saya
npm run dev # buka http://localhost:4321
2. Halaman = file .astro
Setiap file di src/pages/ otomatis jadi route (index.astro → /, tentang.astro → /tentang):
---
// Bagian antara pagar ini berjalan DI SERVER saat build — tidak pernah sampai ke browser.
const produk = await fetch("https://api.example.com/produk").then(r => r.json());
const judul = "Toko Saya";
---
<html lang="id">
<body>
<h1>{judul}</h1>
<ul>
{produk.map(p => <li>{p.nama} — Rp {p.harga.toLocaleString("id-ID")}</li>)}
</ul>
</body>
</html>
Sintaksnya seperti JSX, tapi hasil akhirnya HTML murni — fetch di atas terjadi saat build, bukan di browser pengunjung.
3. Komponen & props
---
// src/components/Kartu.astro
const { judul, harga } = Astro.props;
---
<article class="kartu">
<h3>{judul}</h3>
<p>Rp {harga.toLocaleString("id-ID")}</p>
</article>
<style>
/* scoped otomatis — tidak bocor ke komponen lain */
.kartu { border: 1px solid #e4e4e7; padding: 1rem; }
</style>
---
import Kartu from "../components/Kartu.astro";
---
<Kartu judul="Kopi Gayo" harga={85000} />
4. Islands: interaktif hanya di tempat yang perlu
Butuh komponen React/Vue/Svelte yang benar-benar interaktif? Pasang sebagai “pulau”:
npx astro add react
---
import Keranjang from "../components/Keranjang.jsx";
---
<h1>Halaman ini 100% HTML statis...</h1>
<Keranjang client:load /> <!-- ...kecuali pulau yang satu ini -->
Direktif client:* menentukan kapan JavaScript-nya dimuat:
client:load— segera saat halaman dibukaclient:visible— baru saat komponen masuk viewport (paling sering kupakai)client:idle— saat browser senggang
Tanpa direktif itu, komponen React pun dirender jadi HTML statis — nol JS terkirim.
5. Konten markdown terkelola (content collections)
Simpan artikel di src/content/blog/*.md, definisikan skemanya dengan Zod di src/content.config.ts, dan Astro memvalidasi frontmatter setiap artikel saat build — judul lupa diisi = build gagal, bukan halaman rusak diam-diam.
Tips dari pengalaman
- Astro menang di kasus yang sama dengan pendekatan situs ini (Hono SSR + HTMX): konten dulu, JavaScript belakangan. Ukur dengan Lighthouse dan bandingkan sendiri dengan SPA.
- Mulai dari
client:visible, bukanclient:load— sebagian besar interaktivitas ada di bawah lipatan layar. - Kalau semua halamanmu butuh data real-time per request, Astro mode server (SSR adapter) bisa, tapi pertimbangkan apakah framework lain lebih cocok — kekuatan utama Astro tetap konten statis yang cepat.
Mau fitur seperti ini dibangun untuk bisnismu?