Episode ini membangun fondasi tampilan Gatsby: membuat halaman melalui file di src/pages, memisahkan komponen reusable dengan pola layout, memilih strategi styling dari CSS Modules hingga Tailwind, dan mengelola metadata lewat Gatsby Head API.

Project Gatsby kalian sudah hidup. Sekarang saatnya membangun tampilan yang nyata: halaman, komponen, dan layout. Kualitas arsitektur komponen di tahap ini menentukan mudah-tidaknya project berkembang di episode-episode berikutnya.
Episode 4 membahas pembuatan halaman via file di src/pages, pola layout yang reusable, tiga strategi styling yang populer, dan pengelolaan metadata halaman menggunakan Gatsby Head API.
Setiap file di src/pages menjadi halaman dengan URL yang mengikuti nama file. Buat file baru src/pages/about.jsx:
const AboutPage = () => (
<main>
<h1>Tentang Saya</h1>
<p>Halaman ini tersedia di rute /about/ secara otomatis.</p>
</main>
)
export default AboutPageSimpan file, dan buka http://localhost:8000/about — halaman langsung ada tanpa konfigurasi routing tambahan. Beginilah cara kerja file-based routing Gatsby.
Perhatikan bahwa halaman hanyalah komponen React biasa. Kalian bisa memakai props, state, dan semua fitur React di dalamnya. Gatsby hanya menambahkan konvensi lokasi file sebagai penentu route.
Elemen seperti header, nav, dan footer biasanya sama di semua halaman. Pola yang umum: komponen Layout yang membungkus children:
import { Link } from "gatsby"
const Layout = ({ children }) => (
<div>
<header>
<nav>
<Link to="/">Home</Link>
<Link to="/about">Tentang</Link>
</nav>
</header>
<main>{children}</main>
<footer>Hak cipta Gatsby Belajar</footer>
</div>
)
export default LayoutKomponen Link dari Gatsby memberi dua keunggulan: navigasi client-side tanpa reload penuh dan prefetching otomatis. Layout ini lalu dipakai di setiap halaman dengan membungkus konten:
import Layout from "../components/Layout"
const AboutPage = () => (
<Layout>
<h1>Tentang Saya</h1>
</Layout>
)
export default AboutPageCSS Modules memberi scoping otomatis: nama class di-file tidak akan bentrok dengan file lain. Nama file harus diakhiri .module.css:
.container {
max-width: 720px;
margin: 0 auto;
}
.heading {
color: rebeccapurple;
}import * as styles from "./styles.module.css"
const AboutPage = () => (
<section className={styles.container}>
<h1 className={styles.heading}>Tentang Saya</h1>
</section>
)import * as styles from "./styles.module.css" memberikan object berisi nama class yang sudah di-scope; gunakan lewat className={styles.heading}.
Untuk styling berbasis komponen, pasang styled-components bersama gatsby-plugin-styled-components agar SSR bekerja benar. Untuk utility-first, Tailwind CSS juga didukung melalui PostCSS — cukup ikuti panduan pemasangan Tailwind resmi untuk Gatsby. Ketiganya valid; pilih sesuai preferensi tim.
Sejak Gatsby 4.19, cara yang direkomendasikan untuk metadata halaman adalah Gatsby Head API. Ekspor fungsi Head dari file page:
const AboutPage = () => <h1>Tentang Saya</h1>
export default AboutPage
export function Head() {
return (
<>
<title>Tentang Saya</title>
<meta name="description" content="Profil singkat penulis" />
</>
)
}Fungsi Head dari file page merender elemen yang akan disisipkan ke bagian head HTML — menggantikan plugin react-helmet yang dulu menjadi standar, karena Head dirender saat build time tanpa overhead runtime.
Karena Head menempel pada halaman, metadata bisa disusun per-halaman, bahkan bisa memakai data dari page query. Ini penting untuk SEO: setiap halaman punya title dan description unik tanpa duplikasi.
Episode 4 membangun tampilan dasar Gatsby: routing berbasis file, komponen layout yang reusable, tiga pendekatan styling, dan pengelolaan metadata dengan Gatsby Head API.
Inti yang harus dibawa pulang:
src/pages otomatis menjadi route.Layout membungkus children dan dipakai ulang di tiap halaman.Link dari Gatsby memberi navigasi client-side dan prefetching.Di episode 5 selanjutnya kita masuk ke jantung Gatsby: data fetching dan GraphQL — memahami data layer, membedakan page query dan static query, menyediakan konten dari Markdown dan JSON, serta querying gambar dan relasi antar konten.