kodingup.camp

Beranda/Next.js Mastery: Dasar, Routing & Rendering

Kenapa Next.js

Modul 1 dari 106 menit bacaWhy Next.js

Isi modul

    Kenapa ini penting

    Sebelum belajar alat baru, kamu perlu tahu masalah apa yang mau diselesaikan. Kalau tidak, Next.js cuma terasa seperti "React dengan aturan tambahan yang merepotkan". Begitu paham alasannya, setiap aturan (folder app, "use client", "use cache") jadi masuk akal.

    Next.js juga dipakai luas di dunia kerja. Banyak lowongan frontend di Indonesia menulis "React/Next.js" sebagai satu paket, dan dokumentasi resmi React sendiri menyarankan memakai framework saat membuat aplikasi baru. Jadi ini bukan sekadar pilihan gaya, tapi keterampilan yang dicari.

    Konsep inti

    React murni vs framework

    Aplikasi yang kamu buat dengan Vite di fase sebelumnya disebut SPA (Single Page Application). Cara kerjanya:

    1. Browser meminta halaman, server mengirim HTML yang hampir kosong: cuma <div id="root"></div> dan tag <script>.
    2. Browser mengunduh file JavaScript (bisa ratusan KB).
    3. JavaScript berjalan, React membangun tampilan, lalu baru mengambil data dari API.
    4. Setelah data datang, barulah user melihat isi halaman.

    Bayangkan kamu pesan nasi goreng, lalu pelayan datang membawa kompor, wajan, beras, dan resep, dan kamu disuruh masak sendiri di meja. Hasilnya memang nasi goreng, tapi kamu menunggu lama, dan kalau kompormu (HP murah) lemah, makin lama lagi.

    Framework seperti Next.js membuat dapurnya ada di server. Server memasak HTML yang sudah berisi konten, lalu mengirimnya ke browser. User langsung melihat isi halaman. JavaScript tetap dikirim, tapi hanya untuk bagian yang memang interaktif (tombol, form, dropdown).

    Empat cara merender halaman

    Singkatan Nama Kapan HTML dibuat Cocok untuk
    CSR Client-Side Rendering Di browser, setelah JS jalan Dashboard internal di balik login
    SSR Server-Side Rendering Di server, setiap ada request Data yang beda per user atau per detik
    SSG Static Site Generation Di server, saat npm run build Blog, dokumentasi, landing page
    ISR Incremental Static Regeneration Saat build, lalu diperbarui berkala Katalog produk, berita

    Di Next.js 16 dengan Cache Components, keempatnya bisa dicampur dalam satu halaman. Bagian statis (header, menu) dibuat saat build, bagian yang di-cache diperbarui berkala, dan bagian personal (keranjang belanja) dikirim belakangan lewat streaming. Teknik ini disebut Partial Prerendering (PPR), dan di Next.js 16 ini jadi perilaku bawaan saat Cache Components aktif. Kamu akan melihatnya di modul Caching.

    SEO: kenapa HTML dari server penting

    SEO (Search Engine Optimization) adalah usaha agar halaman muncul di hasil pencarian Google. Mesin pencari membaca HTML. Kalau HTML-mu kosong dan isinya baru muncul setelah JavaScript jalan, crawler harus kerja ekstra, dan banyak crawler lain (preview link WhatsApp, Facebook, X) sama sekali tidak menjalankan JavaScript. Itu sebabnya link SPA yang dibagikan ke grup WhatsApp sering tampil tanpa judul dan gambar. Dengan Next.js, judul, deskripsi, dan gambar Open Graph sudah ada di HTML sejak awal.

    Full-stack dalam satu proyek

    Next.js bukan cuma frontend. Dalam satu proyek kamu bisa:

    API key dan password database tetap di server dan tidak pernah terkirim ke browser.

    Posisi Next.js di antara pilihan lain

    Alat Karakter Pilih kalau...
    Vite + React (SPA) Ringan, semua di browser Aplikasi di balik login, tidak butuh SEO
    Next.js Full-stack, server-first, ekosistem terbesar Situs publik + aplikasi, butuh SEO dan data server
    React Router (framework mode, penerus Remix) Fokus web standar: loader, action, form Kamu suka pola loader/action dan banyak form
    Astro Konten dulu, JavaScript nol secara default Blog/dokumentasi yang hampir tanpa interaksi

    Tidak ada yang "paling benar". Untuk camp ini kita pilih Next.js karena paling banyak dipakai di industri, dokumentasinya lengkap, dan satu proyek bisa menampung frontend sekaligus backend ringan.

    Sedikit sejarah: Pages Router vs App Router

    Next.js lama memakai folder pages/ dengan fungsi seperti getServerSideProps dan getStaticProps. Sistem itu disebut Pages Router dan masih didukung untuk proyek lama. Sejak Next.js 13, ada App Router (folder app/) yang dibangun di atas React Server Components. Semua proyek baru sebaiknya memakai App Router, dan seluruh materi ini memakai App Router. Kalau di tutorial kamu melihat getServerSideProps, itu tanda tutorialnya untuk Pages Router.

    Contoh kode

    Bandingkan HTML yang diterima browser dari SPA biasa dan dari Next.js. Kamu bisa membuktikannya dengan curl (atau "View Page Source" di browser).

    # SPA Vite (setelah npm run build && npm run preview)
    curl -s http://localhost:4173 | grep -o '<div id="root">.*</div>'
    # → <div id="root"></div>          ← kosong, isi baru muncul setelah JS jalan
    
    # Next.js (setelah npm run build && npm start)
    curl -s http://localhost:3000/blog | grep -o '<li>.*</li>' | head -3
    # → <li><a href="/blog/halo-nextjs">Halo, Next.js!</a></li> ...  ← konten sudah ada
    

    Halaman Next.js pertamamu cukup satu file. Perhatikan: tidak ada useEffect, tidak ada useState untuk loading. Komponen boleh async karena berjalan di server.

    // app/page.jsx, Server Component (bawaan di App Router)
    export default async function HomePage() {
      // fetch berjalan di SERVER, bukan di browser user
      const res = await fetch('https://jsonplaceholder.typicode.com/users/1')
      const user = await res.json()
    
      return (
        <main className="p-6">
          <h1 className="text-2xl font-bold">Halo dari server!</h1>
          <p>User pertama di API: {user.name}</p>
        </main>
      )
    }
    // → HTML yang dikirim ke browser sudah berisi "User pertama di API: Leanne Graham"
    

    Bandingkan dengan versi SPA yang harus mengurus loading sendiri:

    // Versi SPA (React + Vite), semua terjadi di browser
    import { useEffect, useState } from 'react'
    
    export default function HomePage() {
      const [user, setUser] = useState(null)
    
      useEffect(() => {
        fetch('https://jsonplaceholder.typicode.com/users/1')
          .then((res) => res.json())
          .then(setUser)
      }, [])
    
      if (!user) return <p>Memuat...</p> // → crawler sering hanya melihat teks ini
      return <p>User pertama di API: {user.name}</p>
    }
    

    Kesalahan umum

    1. Menganggap Next.js "pengganti" React. Next.js memakai React. Semua yang kamu pelajari (komponen, props, hooks) tetap berlaku. Next.js menambah routing, rendering di server, dan caching.
    2. Mengikuti tutorial Pages Router untuk proyek App Router. getServerSideProps, getStaticProps, dan _app.js tidak berlaku di folder app/. Cek dulu apakah tutorial memakai app/ atau pages/.
    3. Memakai Next.js untuk semua hal. Dashboard internal kecil tanpa kebutuhan SEO mungkin lebih sederhana dengan Vite. Pilih alat sesuai kebutuhan, bukan tren.
    4. Mengira "server" berarti harus sewa VPS. Proyek Next.js bisa di-deploy ke platform seperti Vercel, Netlify, atau Cloudflare yang mengurus servernya untukmu, atau dijalankan sendiri dengan next start di server Node.js.
    5. Percaya tutorial lama soal caching. Model caching berubah besar di Next.js 15 dan 16. Selalu cek versi tutorial dan dokumentasi resmi.

    Latihan

    1. Mudah, Buka dua situs: satu SPA (misalnya proyek Vite-mu) dan satu situs Next.js (misalnya nextjs.org). Klik kanan → View Page Source. Catat perbedaan isi <body> keduanya.
    2. Sedang, Untuk setiap halaman berikut, tentukan strategi render yang paling cocok (CSR/SSR/SSG/ISR) dan alasannya: (a) halaman "Tentang Kami", (b) daftar harga emas yang berubah tiap menit, (c) halaman profil yang hanya bisa dilihat user yang login, (d) katalog 5.000 produk yang stoknya berubah beberapa kali sehari.
    3. Menantang, Tulis ulang komponen SPA di atas menjadi Server Component Next.js yang menampilkan tiga user pertama (/users?_limit=3) dalam bentuk daftar.
    Lihat solusi

    1. Di SPA, <body> hanya berisi <div id="root"></div> dan tag <script>. Di situs Next.js, <body> sudah berisi teks, heading, link, dan gambar, ditambah beberapa <script> untuk bagian interaktif.

    2. - (a) SSG: isinya jarang berubah, cukup dibuat sekali saat build. - (b) SSR (atau cache sangat pendek): data berubah tiap menit, harus segar per request. - (c) SSR di server (membaca cookie login) atau CSR. Halaman ini tidak perlu SEO karena di balik login. - (d) ISR: dibuat statis lalu diperbarui berkala atau saat stok berubah, agar cepat tapi tetap cukup segar.

    3.

    // app/page.jsx
    export default async function HomePage() {
      const res = await fetch('https://jsonplaceholder.typicode.com/users?_limit=3')
      const users = await res.json()
    
      return (
        <main className="p-6">
          <h1 className="text-2xl font-bold">Tiga user pertama</h1>
          <ul className="list-disc pl-6">
            {users.map((u) => (
              <li key={u.id}>{u.name}</li>
            ))}
          </ul>
        </main>
      )
    }
    // → Leanne Graham, Ervin Howell, Clementine Bauch
    

    Ringkasan

    Video pendamping

    Kalau penjelasan di atas belum masuk, tonton ini. Video dari kanal YouTube pihak lain.

    1. Next.js 13 Dasar Bahasa IndonesiaFahrezi Adha · Bahasa IndonesiaBuka di YouTube

    Kuis pemahaman

    Pilih satu jawaban per soal. Penjelasan muncul setelah kamu menjawab.