1 / 36
Arrow keys, Space, PageUp/PageDown, Home/End, scroll, swipe
Bab 7

Frontend Modern dengan React dan Next.js

Dari component architecture ke Personal Blog berbasis SSG, routing, dan MDX.

Bagian III

Full-Stack Modern

React Next.js Routing SSG
Tujuan Pembelajaran

Kompetensi 1-3

  • Memahami arsitektur component-based dan bedanya dengan vanilla JavaScript.
  • Membangun komponen React dengan props, state, dan event handling.
  • Menjelaskan routing dan rendering strategy: SSG, SSR, dan CSR.

Fokus Awal

Bab ini membangun mental model baru: UI bukan lagi kumpulan halaman statis, tetapi komposisi komponen dan strategi rendering.

Tujuan Pembelajaran

Kompetensi 4-5

  • Membangun Personal Blog dengan Next.js, routing multi-halaman, dan konten MDX.
  • Melakukan code review terhadap output AI dengan Checklist 7 Dimensi.
  • Menjelaskan mengapa kode yang berjalan belum tentu siap production.

Output Akhir

Di akhir bab, Anda punya frontend-only application yang terstruktur dan siap menjadi basis aplikasi full-stack di Bab 8.

Peta Posisi

Semua Fondasi Mulai Menyatu

Bab 1-4

Mental model web, HTML, CSS, dan JavaScript manual.

Bab 5-6

Prompting, debugging, dan audit kualitas kode.

Bab 7

Masuk ke ekosistem React dan Next.js sebagai standar industri modern.

Evolusi Arsitektur

Dari Static Pages ke Component Architecture

  • HTML statis memaksa copy-paste untuk elemen yang berulang.
  • Perubahan kecil mudah memicu inkonsistensi di banyak file.
  • React memperkenalkan komponen reusable seperti blueprint modular.

Analogi Rumah

Bukan lagi memasang jendela satu per satu di tiap ruangan, tetapi membuat satu komponen jendela yang dipakai ulang di seluruh bangunan.

Rendering Strategies

Dari CSR Tunggal ke Banyak Pilihan

SSG

Build time, cepat, aman, dan SEO-friendly.

SSR

Request time, data fresh, cocok untuk personalization.

CSR

Client-side, interaktif, cocok untuk dashboard dan live updates.

Trade-off

Next.js memberi kebebasan memilih strategi per halaman berdasarkan speed, freshness, dan personalization.

React Ecosystem

Prinsip yang Anda Bawa ke Framework Modern

Declarative UI

Deskripsikan apa yang ditampilkan, bukan langkah manipulasi DOM.

Unidirectional Flow

Data mengalir dari parent ke child melalui props.

Lifecycle & Hooks

State dan side-effect dikelola secara eksplisit.

Virtual DOM

React membandingkan UI lama dan baru sebelum update DOM nyata.

Arsitektur Tiga Layer

Browser, Next.js Server, Database

Browser
React App
↕
Next.js Server
Routing + Rendering
↓
Database / API
Bab 8
Koneksi

Task Manager, Tailwind, AI, dan Bab 8

  • Task Manager menjadi pembanding langsung antara vanilla JS vs React.
  • Tailwind dari Bab 3 tetap dipakai sehingga fokus bergeser ke arsitektur frontend.
  • Skill debugging dan review dari Bab 5-6 dipakai untuk menilai komponen AI yang lebih kompleks.

ATWS Level 3

AI kini boleh menjadi co-pilot untuk komponen lengkap, tetapi semua output tetap wajib melewati code review 7 dimensi.

Code Review Checklist

Tujuh Dimensi Wajib di Level 3

Correctness

Edge case dan hasil harus tepat.

Security

Waspadai XSS, secret leak, dan input tak tervalidasi.

Performance

Perhatikan re-render dan komputasi berat.

Maintainability

Nama, struktur, dan kejelasan logika.

Accessibility

HTML semantik dan keyboard support.

Scalability

Apakah pola tetap sehat saat data bertambah.

Idiomatic

Ikuti best practices React dan Next.js.

Bagian 1

Masalah yang React Selesaikan

// Vanilla JS
function renderTasks(tasks) {
  container.innerHTML = '';
  tasks.forEach(task => {
    const el = document.createElement('div');
    el.innerHTML = `...`;
    container.appendChild(el);
  });
}
  • Manual DOM update rawan lupa sinkronisasi UI.
  • Re-render seluruh list boros untuk perubahan kecil.
  • Rendering, state, dan event handling tercampur erat.
Prinsip 1

Declarative UI

// Imperative
const el = document.createElement('div');
el.className = 'task';
el.textContent = 'My Task';
container.appendChild(el);
// Declarative
function Task({ title, completed }) {
  return (
    <div className="task">
      <span>{title}</span>
    </div>
  );
}

Imperative memberi instruksi langkah demi langkah. Declarative menyatakan seperti apa UI berdasarkan state saat ini.

Prinsip 2

Component-Based Architecture

App
↓
Header
TaskList
Footer
↓
Task
Task
Task

Data mengalir dari parent ke child melalui props. Setiap node adalah unit reusable dan dapat dikomposisi ulang.

Prinsip 3

UI = f(state)

User Action
→
Update State
→
Re-render
→
DOM Update

Satu-satunya cara mengubah UI di React adalah mengubah state. React yang mengurus diffing dan update DOM yang diperlukan.

JSX

Syntax Sugar untuk React Elements

const element = <h1>Hello</h1>;
const element = React.createElement(
  'h1',
  null,
  'Hello'
);
  • `className`, `htmlFor`, dan event handler camelCase.
  • Ekspresi JavaScript masuk ke dalam `{}`.
  • Tujuannya adalah readability dan produktivitas.
Kunci Pemahaman

Separation of Concerns yang Baru

Tradisional

HTML, CSS, dan JS dipisah berdasarkan teknologi.

React

Concern dipisah per fitur, bukan per file teknologi.

Keuntungan

Colocation, reusability, dan encapsulation meningkat.

Bagian 2

Setup Project Next.js

npx create-next-app@latest personal-blog
cd personal-blog
npm run dev
  • TypeScript: No
  • ESLint: Yes
  • Tailwind CSS: Yes
  • App Router: Yes
Next.js Structure

Struktur Proyek dan File-Based Routing

app/
├── layout.js
├── page.js
├── about/page.js
└── blog/[slug]/page.js

Folder dan file di dalam `app/` langsung menjadi route. Tidak perlu konfigurasi router manual.

Root Layout

Layout sebagai Wrapper Persisten

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <Header />
        <main>{children}</main>
      </body>
    </html>
  );
}

Navigation bar dan footer tetap persisten saat user berpindah halaman. Hanya area `children` yang berganti.

Komponen Pertama

Header dan Homepage dengan Dynamic Content

{posts.map((post) => (
  <article key={post.id}>
    <h4>{post.title}</h4>
    <p>{post.excerpt}</p>
  </article>
))}
  • List rendering adalah pola inti React.
  • `key` wajib unique dan stabil.
  • Hardcoded posts hanya titik awal sebelum data fetching.
Vibe Coding

Extract PostCard, Conditional Rendering, Variant Styling

Extract Component

Post cards dipisah menjadi komponen reusable.

Conditional Badge

Tampilkan `New` atau `Popular` berdasarkan data.

Variant Prop

Gunakan props sebagai API untuk mengubah styling.

Deep Understanding Zone

Props, State, dan Data Flow

  • Gambar component tree dari Personal Blog.
  • Jelaskan perbedaan props vs state tanpa melihat dokumentasi.
  • Prediksi output list rendering dan identifikasi warning `key`.
  • Debug mental model: mengapa modifying props tidak mengubah UI.
Bagian 3

State Management dengan useState

const [count, setCount] = useState(0);

<button onClick={() => setCount(count + 1)}>
  Increment
</button>
  • State adalah memory lokal komponen.
  • Gunakan setter, jangan modifikasi state langsung.
  • Setelah state berubah, React me-render ulang komponen.
Hands-On

SearchBar sebagai Client Component

'use client';
const [query, setQuery] = useState('');

<input
  value={query}
  onChange={(e) => setQuery(e.target.value)}
/>

`value` dan `onChange` membentuk controlled component. Single source of truth berpindah ke state React, bukan DOM.

Data Flow

Search Flow: Lifting State Up

User Ketik
→
SearchBar State
→
onSearch(query)
→
Home Update filteredPosts
Engineering Checkpoint

Evaluasi Personal Blog Sejauh Ini

Security

Aman untuk client-only search.

Readability

Nama komponen dan fungsi jelas.

Performance

Fine untuk dataset kecil, hati-hati saat skala naik.

Maintainability

Struktur modular mudah dikembangkan.

Bagian 4

Routing dan Navigation di Next.js

app/
├── page.js        → /
├── about/page.js  → /about
└── blog/[slug]/page.js
  • Route dibentuk dari struktur folder.
  • Gunakan `Link` untuk navigasi tanpa full reload.
  • Layout tetap persisten saat route berubah.
Dynamic Route

Halaman Detail Post dengan [slug]

export default async function BlogPostPage({ params }) {
  const { slug } = await params;
  return <h1>Blog Post: {slug}</h1>;
}

`/blog/getting-started-nextjs` dan `/blog/react-components` memakai template halaman yang sama, hanya parameter slug yang berubah.

Bagian 5

SSG vs SSR vs CSR

Strategi
Kapan Dipakai
SSG
Blog, dokumentasi, landing page yang stabil.
SSR
Konten fresh, personalized, dan berubah per request.
CSR
Dashboard, chat, atau area interaktif tinggi.
Mental Model

Pilih Berdasarkan Speed, Freshness, Personalization

SSG

Build → generate HTML → serve instantly.

SSR

Request → fetch data → render HTML → send.

CSR

Request → load JS → fetch data → render di browser.

MDX Content

Menyimpan Blog Post sebagai MDX Files

npm install next-mdx-remote gray-matter

content/posts/
├── getting-started-nextjs.mdx
└── understanding-react-components.mdx

Frontmatter memisahkan metadata seperti title, date, excerpt, dan author dari konten markdown utama.

Data Utility

lib/posts.js Membaca File dan Parse Frontmatter

const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);

return {
  slug,
  content,
  ...data,
};

`fs` dan `path` hanya berjalan di server. Ini alasan kuat mengapa pembacaan MDX cocok dilakukan di Server Component atau build process.

SSG Data Flow

Build Time Melakukan Kerja Berat

npm run build
→
generateStaticParams
→
getPostBySlug
→
HTML Statis
SSR dan Hybrid

Konten Statis Bisa Digabung dengan Data Dinamis

  • Post content cocok di-SSG karena stabil dan SEO penting.
  • Komentar atau view count dapat diambil via SSR atau CSR.
  • Hybrid memberi first load cepat sekaligus data yang lebih fresh.

Strategi nyata jarang one-size-fits-all. Satu aplikasi bisa menggabungkan SSG, SSR, dan CSR pada area yang berbeda.

Bagian 7

AI Integration: Minta Komponen dengan Prompt yang Tepat

  • Berikan context: Next.js App Router, blog post page, dan target komponen.
  • Sebutkan behavior yang diinginkan: parse headings, nested links, smooth scroll, active highlight.
  • Tetapkan requirement teknis: Tailwind, semantic HTML, accessible, dan output format file.

Contoh Use Case

Table of Contents component untuk halaman blog post adalah latihan yang tepat untuk menguji AI sebagai co-pilot.

Penutup Bab 7

Working Code Belum Tentu Production-Ready

  • AI bisa menghasilkan komponen yang terlihat benar tetapi punya scope, accessibility, dan idiomatic issues.
  • Personal Blog final harus memenuhi acceptance criteria, siap deploy, dan terdokumentasi.
  • Bab 8 akan menghubungkan frontend ini ke backend dan database dengan Supabase.

Anda bukan sekadar pengguna AI. Anda adalah reviewer yang bertanggung jawab atas arsitektur, keamanan, dan kualitas seluruh aplikasi.