Partial Prerendering di Next.js 15: Kapan Sebaiknya Digunakan?

Halo, para suhu ngoding dan pecandu kecepatan! Pernah enggak sih ngerasain dilema pelik saat membangun sebuah website? Rasanya kayak disuruh milih antara dua hal yang sama-sama penting, tapi seolah enggak bisa jalan beriringan. Di satu sisi, kita mati-matian pengen loading-nya super ngebut biar pengunjung enggak kabur duluan karena jengkel nunggu. Kita tahu persis, setiap milidetik itu berharga buat user experience dan juga SEO.

Tapi di sisi lain, banyak website modern itu hidup dan bernapas, datanya berubah terus-menerus. Bayangkan toko online dengan stok yang fluktuatif, portal berita dengan breaking news setiap menit, atau dashboard yang menampilkan data real-time. Bagian-bagian ini harus selalu up-to-date. Nah, dulu kita kayak dihadapkan pada pilihan sulit: mau statis dan cepat kayak jalan tol kosong di tengah malam, atau dinamis tapi kadang macet kayak tol pas arus mudik? Rasanya seperti harus mengorbankan salah satu demi yang lain.

Untungnya, para jenius di balik Next.js sepertinya benar-benar mendengarkan keluh kesah kita, para developer yang sering terjebak di tengah dilema ini. Dan di Next.js 15 yang baru saja dirilis, mereka menghadirkan solusi brilian yang mengubah peta permainan, sebuah mainan baru yang namanya Partial Prerendering.

Jujur, pas pertama kali saya dengar namanya, pikiran saya langsung skeptis. "Apaan lagi nih? Jargon teknis baru doang kali yang sebenarnya cuma repackaging konsep lama?" Tapi setelah saya coba-coba, gali lebih dalam, dan bereksperimen dengan kode, ternyata fitur ini bukan sekadar gimmick. Partial Prerendering ini rasanya kayak punya kekuatan super yang bisa menggabungkan yang terbaik dari kedua dunia: bikin website kita kenceng maksimal di awal, tapi tetap fleksibel dan bisa menampilkan data terbaru tanpa refresh yang mengganggu. Penasaran kan gimana cara kerjanya dan kapan dia jadi penyelamat kita? Yuk, kita bedah bareng rahasianya!


Apa Itu Partial Prerendering? Kok Kedengarannya Ribet?

Image from Nextjs.org
Image from Nextjs.org

Jangan panik dulu denger namanya yang sedikit njelimet dan mungkin terdengar asing di telinga. Sebenarnya, konsep di baliknya itu cukup sederhana dan bisa kita analogikan dengan sesuatu yang dekat dengan kehidupan sehari-hari.

Gampangnya gini: bayangin kita lagi mau masak nasi goreng favorit. Ada bahan dasar yang udah pasti dan enggak bakal berubah, seperti nasi, telur, atau bumbu-bumbu inti kayak bawang dan garam. Bahan-bahan ini bisa kita siapkan di awal, bahkan sebelum ada yang pesan, kan? Ibaratnya, ini kayak bagian statis dari website Anda. Bagian-bagian ini udah siap sedia, baked in, dan enggak bakal berubah drastis dalam waktu dekat.

Nah, nasi goreng enggak lengkap tanpa topping yang bisa kita ganti-ganti sesuai selera atau ketersediaan bahan. Kadang pengen sosis, besoknya ayam suwir, lusa mungkin bakso, atau bahkan seafood kalau lagi niat. Topping inilah bagian dinamis dari website Anda, data yang bisa berubah sewaktu-waktu atau berbeda untuk setiap pengguna.

Partial Prerendering itu mirip banget konsepnya! Next.js bakal "memasak" sebagian besar halaman website kita (yang statis itu) di awal, tepatnya pas build time. Ini seperti menyiapkan nasi, telur, dan bumbu dasar nasi goreng jauh-jauh hari. Hasilnya? Halaman kita jadi cepet banget nongolnya di browser pengguna, karena mereka enggak perlu nunggu server meracik semuanya dari nol. Mereka langsung disuguhkan "kerangka" halaman yang sudah jadi.

Tapi, ada bagian-bagian tertentu yang dinamis, alias "topping" yang datanya bisa berubah sewaktu-waktu. Nah, bagian ini nanti baru disajikan belakangan, pas ada pengguna yang benar-benar mengakses halaman tersebut. Jadi, pengguna enggak perlu nunggu semua datanya siap dari awal. Mereka langsung bisa melihat kerangka dasar halamannya, terus data dinamisnya muncul belakangan secara mulus, tanpa perlu nge-reload seluruh halaman. Ini dia esensi dari Partial Prerendering: kecepatan loading awal yang impresif dikombinasikan dengan kemampuan untuk menampilkan data real-time atau yang paling baru. Keren, kan? Ini adalah solusi cerdas untuk dilema kecepatan vs. kesegaran data!


🍳 Apa Itu Partial Prerendering? Kok Kedengarannya Ribet?

Jangan buru-buru mundur gara-gara namanya terdegar kayak istilah dari luar angkasa. Partial Prerendering emang kedengarannya teknis banget, tapi sebenarnya konsepnya bisa dijelaskan pakai analogi yang… ya, dekat banget sama perut: nasi goreng.

Coba bayangin kamu buka warung nasi goreng. Tiap malam, kamu tahu pasti bakal ada yang pesan menu andalan: nasi, telur, bawang, sama bumbu dasar. Nah, bahan-bahan ini bisa kamu siapin dari awal sebelum pembeli datang, karena udah pasti dipake dan enggak berubah-ubah. Ini kayak bagian statis dari halaman web kamu—yang bisa diproses sekali aja di awal saat proses build, dan bisa langsung disajikan ke semua orang.

Tapi, tiap pembeli biasanya punya selera topping sendiri: ada yang minta sosis, ada yang pengen ayam suwir, ada juga yang maksa minta pake udang. 🦐

Topping ini fleksibel dan bisa berubah tergantung permintaan, kayak data dinamis di website—contohnya daftar produk terbaru, user login, atau notifikasi personal.

Nah, Partial Prerendering (PPR) itu strategi dari Next.js 14+ yang menggabungkan dua dunia ini. Ia menyiapkan bagian statis di awal (kayak nasi dan bumbunya), supaya website bisa muncul cepat banget pas pertama kali dibuka.

Terus, bagian dinamisnya (topping-nya) dimasak belakangan, langsung saat dibutuhkan. Tapi tenang, ini bukan berarti halaman jadi kedodoran—kerangka halamannya udah muncul duluan, dan data yang “belum siap” akan diisi secara mulus di background, tanppa harus reload halaman.

Image from Nextjs.org
Image from Nextjs.org

🎯 Jadi intinya:

Partial Prerendering = website tampil cepat kayak statis, tapi tetap punya fleksibilitas data dinamis.

Kamu bisa kasih pengalaman kilat ke pengguna, tanpa ngorbanin data terbaru atau konten personal.

Keren, kan? Ini bukan cuma tentang performa, tapi juga tentang pengalaman pengguna yang lebih mulus dan modern.

🔧 Cara kerjanya:

  1. Saat build time:
    • Next.js mem-pre-render bagian halaman yang statis (tidak tergantung data user atau waktu).
    • Halaman ini dikemas dalam HTML siap pakai yang bisa langsung dikirim ke browser secepat kilat.
  2. Saat runtime di client:
    • Next.js akan menunda bagian dinamis yang membutuhkan data terbaru atau personal (misalnya data user login, produk yang sedang diskon, atau jumlah notifikasi).
    • Bagian ini akan dirender secara streaming atau hydrated di client, tanpa nge-reload seluruh halaman.
  3. Dengan React Server Components (RSC) dan router app baru di Next.js, ini semua bisa dikontrol secara granular:
    • Komponen bisa ditandai sebagai dynamic, cache: "no-store", atau fetch langsung dari server.
    • Partial rendering pun bisa terjadi secara otomatis—tanpa perlu memecah halaman jadi beberapa route kecil seperti zaman dulu.

⚡ Hasilnya:

  • Time to First Byte (TTFB) cepat ✅
  • Initial Paint lebih ringan ✅
  • Data tetap segar
  • Developer happy

Kapan Si “Penyelamat” Ini Beraksi?

Image by Freepik
Image by Freepik

Oke, teori sudah kita bedah, sekarang mari kita lihat bagaimana Partial Prerendering ini beraksi di dunia nyata. Saya ada studi kasus fiktif, sebuah toko online yang saya beri nama "Kilat Jual". Bayangkan Kilat Jual ini spesialis barang elektronik, di mana stok barang bisa berubah setiap jam, dan harganya sering banget kena diskon mendadak atau promo kilat.

Skenario Lama (Tanpa Partial Prerendering):

Dulu, sebelum ada si penyelamat ini, kita punya beberapa pilihan, tapi semuanya ada "tapi"-nya:

  • Pilihan 1: Static Site Generation (SSG) murni. Semua halaman produk akan di-generate menjadi file HTML statis saat proses build. Hasilnya? Website ini super cepat, kayak melaju di jalan tol kosong. Tapi, masalah muncul saat ada perubahan data. Misalnya, stok smartphone habis atau harga TV diskon 50%. Untuk memperbarui info itu, kita harus rebuild lagi seluruh website. Bayangkan jika ada ribuan produk dan perubahan data terjadi berkali-kali dalam sehari. Repot banget, kan? Itu sama saja dengan harus membongkar dan membangun ulang seluruh jalan tol cuma karena ada satu rambu yang berubah.
export default function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>{post.title}</li>
      ))}
    </ul>
  )
}
  • Pilihan 2: Server-Side Rendering (SSR) murni. Setiap kali ada pengunjung mengakses halaman produk, server akan me-render ulang seluruh halaman dari nol. Keuntungannya, data yang ditampilkan akan selalu up-to-date. Tapi, ini punya efek samping. Server harus bekerja keras untuk setiap request, dan kadang ada latensi atau keterlambatan. Ini seperti jalan tol yang selalu macet karena setiap mobil harus melewati pos pemeriksaan yang sama berulang kali. Pengguna bisa saja harus menunggu beberapa detik sebelum halaman benar-benar siap dan tampil sempurna.
export default function Page({ data }) {
  // Render data...
}
 
// This gets called on every request
export async function getServerSideProps() {
  // Fetch data from external API
  const res = await fetch(`https://.../data`)
  const data = await res.json()
 
  // Pass data to the page via props
  return { props: { data } }
}

Masalahnya: Kita pengen website yang cepet kayak kilat, tapi di sisi lain, data produk (stok, harga) juga harus real-time. Ini dilema klasik yang bikin para developer pusing tujuh keliling!


Solusi dengan Partial Prerendering di "Kilat Jual":

Nah, di sinilah Partial Prerendering masuk dan jadi pahlawan! Kita bisa bayangin halaman produk di Kilat Jual. Beberapa bagian dari halaman itu bersifat statis dan tidak sering berubah, misalnya:

  • Judul Produk: "Smartphone Canggih X Pro Max"
  • Deskripsi Produk: Detail spesifikasi, fitur unggulan, dll. (kalau jarang diubah)
  • Gambar Produk: Foto-foto produk dari berbagai sudut.
  • Layout Umum Halaman: Header, footer, sidebar navigasi, dan elemen UI lainnya.

Bagian-bagian ini bisa Next.js prerender di awal, sehingga saat pengguna pertama kali mengakses halaman, mereka langsung melihat kerangka halaman yang lengkap dan informasi dasar produk dalam sekejap mata.


Sedangkan bagian yang dinamis dan perlu real-time karena bisa berubah kapan saja adalah:

  • Harga Saat Ini: Misalnya, dari Rp 10.000.000 menjadi Rp 7.500.000 karena ada diskon kilat tiba-tiba.
  • Ketersediaan Stok: "Tersedia 3 pcs!" atau bahkan "Stok Habis!" yang harus selalu akurat.
  • Rating dan Ulasan Terbaru: Ulasan baru dari pembeli, yang bisa muncul secara dinamis.
  • Rekomendasi Produk Terkait: Ini bisa sangat personal dan berubah berdasarkan riwayat penelusuran atau pembelian si pengguna.

Dengan Partial Prerendering, Next.js akan menyajikan bagian statisnya duluan, secepat kilat! Kemudian, untuk bagian seperti harga, stok, rating, dan rekomendasi, data akan di-load belakangan secara asinkron (mengalir di background). Pengguna sudah bisa melihat produknya, membaca deskripsinya, sambil menunggu data paling barunya muncul dengan mulus. Ini menciptakan pengalaman yang jauh lebih mulus dan responsif, daripada harus menunggu seluruh halaman dirender ulang hanya untuk menampilkan perubahan kecil pada harga atau stok. Pengguna merasa bahwa website ini sangat cepat dan informatif secara bersamaan.


Mari Ngoding! Contoh Kode Lengkap (Dijamin Nggak Bikin Pusing)

Oke, sekarang saatnya kita kotor-kotoran dikit dan lihat langsung gimana sih cara mengimplementasikan Partial Prerendering ini di Next.js 15. Jangan khawatir, prosesnya jauh lebih simpel dari yang kamu bayangkan, berkat pendekatan React Server Components (RSC) yang jadi jantung Next.js 15.

Kita akan bikin contoh sederhana di mana ada halaman utama (misalnya halaman homepage toko online) yang menampilkan daftar produk. Daftar produk ini mungkin butuh waktu sedikit lebih lama untuk di-load karena mengambil data dari API eksternal. Dengan Partial Prerendering, halaman utamanya akan langsung muncul, dan daftar produknya akan di-stream belakangan.

Pertama, kita akan punya file app/page.jsx (ini adalah homepage kita di Next.js App Router):

// app/page.jsx
import { Suspense } from "react";
import ProductList, { ListProductsSkeleton } from "@/components/ProductList";

export default function Home() {
  return (
    <div className="space-y-8 lg:space-y-14 py-8 px-12">
      <h1 className="text-4xl font-black">
        Contoh Partial Prerendering Next.js
      </h1>
      {/* Bagian ini adalah area "dinamis" yang akan di-stream.
        Saat ProductList sedang loading datanya, ListProductsSkeleton akan ditampilkan.
      */}
      <Suspense fallback={<ListProductsSkeleton />}>
        <ProductList />
      </Suspense>
    </div>
  );
}

Penjelasan Kode app/page.jsx:

  • import { Suspense } from "react";: Ini adalah komponen bawaan dari React yang krusial untuk Partial Prerendering. Suspense memungkinkan kita untuk "menunda" rendering bagian childnya sampai kondisi tertentu terpenuhi (dalam kasus ini, sampai data ProductList siap).
  • fallback={<ListProductsSkeleton />}: Saat ProductList sedang dalam proses loading (misalnya, menunggu data dari API), komponen yang ada di fallback ini (ListProductsSkeleton) akan ditampilkan terlebih dahulu. Ini gunanya untuk memberikan feedback visual ke pengguna bahwa ada sesuatu yang sedang dimuat, daripada hanya menampilkan layar kosong.
  • <ProductList />: Ini adalah komponen React Server Component kita yang akan berisi logika untuk mengambil (fetch) data produk. Karena ini RSC, proses fetching data akan berjalan di server.

Sekarang, mari kita buat komponen ProductList dan ListProductsSkeleton yang disebut di atas.


1. Komponen ProductList (React Server Component):

Komponen ini akan bertanggung jawab untuk mengambil data produk dari API dan menampilkannya. Ingat, karena ini adalah React Server Component, fungsi fetch di dalamnya akan berjalan di sisi server.

// components/ProductList.tsx
import type { ProductList as ProductListData } from "@/types/product-list";
import ProductCard from "./ProductCard"; // Import ProductCard
import { delayProducts, withDelay } from "@/lib/delay"; // Asumsi file ini ada dan berisi fungsi delay

const ProductList = async () => {
  const list: ProductListData = await withDelay(
    fetch(
      `https://dummyjson.com/products`,
      {
        cache: "no-store", // Penting: menonaktifkan cache untuk demonstrasi streaming
      }
    ).then((res) => res.json()),
    delayProducts
  );

  return (
    <section className="flex flex-col gap-4">
      <h2 className="text-3xl font-bold">Product List</h2>
      <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6"> {/* Sesuaikan grid untuk responsivitas */}
        {list.products?.map((item, idx) => (
          <ProductCard key={idx} {...item} />
        ))}
      </div>
    </section>
  );
};

export default ProductList;

// --- Komponen Skeleton untuk Loading State ---

const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`;

function ProductSkeleton() {
  return (
    <div className="col-span-1 space-y-4"> {/* Sesuaikan col-span */}
      <div className={`relative h-[167px] rounded-xl bg-gray-900 ${shimmer}`} />
      <div className="h-4 w-full rounded-lg bg-gray-900" />
      <div className="h-6 w-1/3 rounded-lg bg-gray-900" />
      <div className="h-4 w-full rounded-lg bg-gray-900" />
      <div className="h-4 w-4/6 rounded-lg bg-gray-900" />
    </div>
  );
}

export function ListProductsSkeleton() {
  return (
    <div className="space-y-6 pb-[5px]">
      <div className="space-y-2">
        <div className={`h-6 w-1/3 rounded-lg bg-gray-900 ${shimmer}`} />
        <div className={`h-4 w-1/2 rounded-lg bg-gray-900 ${shimmer}`} />
      </div>
      <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6"> {/* Sesuaikan grid */}
        <ProductSkeleton />
        <ProductSkeleton />
        <ProductSkeleton />
        <ProductSkeleton />
      </div>
    </div>
  );
}

Penjelasan Kode components/ProductList.tsx:

  • import type { ProductList as ProductListData } from "@/types/product-list";: Kita mengimpor interface ProductList dan memberinya alias ProductListData untuk menghindari konflik nama dengan komponen ProductList itu sendiri.
  • import ProductCard from "./ProductCard";: Kita mengimpor komponen ProductCard yang akan digunakan untuk menampilkan setiap produk.
  • const list: ProductListData = await withDelay(...): Di sini kita mengambil data produk dari dummyjson.com. Penggunaan withDelay (yang diasumsikan ada di lib/delay.ts) sengaja ditambahkan untuk mensimulasikan penundaan respons API. Ini penting agar kita bisa melihat efek loading skeleton dan streaming data.
  • cache: "no-store": Ini adalah konfigurasi penting pada fetch. Dengan cache: "no-store", kita memastikan bahwa Next.js tidak akan menyimpan cache dari respons API ini. Artinya, setiap kali halaman di-render (baik saat permintaan awal maupun navigasi selanjutnya), data produk akan selalu diambil yang terbaru. Ini adalah kunci agar ProductList bertindak sebagai bagian dinamis yang di-stream.

2. Komponen ProductCard (Komponen UI):

Ini adalah komponen presentasi yang bertanggung jawab menampilkan detail satu produk.

// components/ProductCard.tsx
/* eslint-disable @next/next/no-img-element */ // Menonaktifkan linting untuk penggunaan <img> native
import { Product } from "@/types/product"; // Mengimpor interface Product dari types/product.ts

const ProductCard: React.FC<Product> = ({
  title,
  description,
  thumbnail,
  price,
  rating,
}) => {
  return (
    <div className="max-w-sm rounded overflow-hidden shadow-lg bg-white transform transition duration-300 hover:scale-105 hover:shadow-xl">
      {/* Menggunakan <img> native karena Next.js Image tidak wajib untuk semua kasus,
          terutama jika Anda mengizinkan penggunaan domain gambar eksternal apa pun
          tanpa konfigurasi di next.config.js atau jika Anda ingin kesederhanaan.
          Namun, Next.js Image Component lebih disarankan untuk optimasi.
      */}
      <img className="w-full h-48 object-cover" src={thumbnail} alt={title} />
      <div className="px-6 py-4">
        <div className="font-bold text-xl mb-2 text-gray-800">{title}</div>
        <p className="text-gray-700 text-base mb-2 line-clamp-3">
          {description}
        </p>
        <div className="flex justify-between items-center mt-4">
          <span className="text-2xl font-bold text-indigo-600">
            ${price.toFixed(2)}
          </span>
          <div className="flex items-center">
            <span className="text-yellow-500 text-lg mr-1">⭐</span>
            <span className="text-gray-700 text-lg">{rating.toFixed(1)}</span>
          </div>
        </div>
      </div>
      <div className="px-6 pt-4 pb-2">
        <button className="bg-indigo-500 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-full w-full transition duration-300">
          View Details
        </button>
      </div>
    </div>
  );
};

export default ProductCard;

Penjelasan Kode components/ProductCard.tsx:

  • /* eslint-disable @next/next/no-img-element */: Baris ini menonaktifkan aturan ESLint khusus Next.js yang biasanya menganjurkan penggunaan <Image> dari next/image ketimbang tag <img> biasa. Di sini kita menggunakan <img> biasa untuk kesederhanaan, namun untuk production dengan optimasi gambar, next/image lebih disarankan.
  • ProductCard: React.FC<Product>: Ini adalah komponen fungsi React yang menerima props sesuai dengan interface Product yang kita definisikan.
  • Sisa kode adalah markup JSX dan styling Tailwind CSS untuk menampilkan judul, deskripsi, harga, rating, dan tombol "View Details" dari setiap produk.

Asumsi Tambahan:

Untuk kode di atas berfungsi dengan baik, Anda memerlukan beberapa file pendukung. Berdasarkan informasi terbaru yang Anda berikan, berikut adalah struktur dan isi filenya:

  • @/types/product.ts: Ini adalah definisi TypeScript untuk struktur data satu produk.
// types/product.ts
export interface Product {
  id: number;
  title: string;
  description: string;
  price: number;
  rating: number;
  thumbnail: string;
  // Properti lain seperti brand, category, images, dll. bisa ditambahkan jika relevan dengan API Anda
}
  • @/types/product-list.ts: Ini adalah definisi TypeScript untuk struktur respons API yang berisi daftar produk.
// types/product-list.ts
import { Product } from "./product"; // Pastikan mengimpor Product

export interface ProductList {
  products: Product[];
  // API dummyjson.com juga mengembalikan 'total', 'skip', 'limit',
  // Anda bisa menambahkannya di sini jika ingin menggunakan:
  // total?: number;
  // skip?: number;
  // limit?: number;
}
  • @/lib/delay.ts (atau .js): File ini berisi fungsi withDelay dan konstanta delayProducts untuk mensimulasikan penundaan respons API.
// Times are in milliseconds
export const delayProducts = 400;

export async function withDelay<T>(
  promise: Promise<T>,
  delay: number
): Promise<T> {
  // Ensure we throw if this throws
  const ret = await promise;
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(ret);
    }, delay);
  });
}

Dengan setup lengkap ini:

  1. Ketika pengguna mengakses halaman homepage, Next.js akan langsung menyajikan HTML untuk judul halaman dan layout dasarnya. Ini terjadi sangat cepat karena bagian ini di-prerender.
  2. Karena ProductList berada di dalam Suspense dan mengambil data dengan cache: "no-store" serta delay, ListProductsSkeleton akan langsung ditampilkan. Ini memberi feedback visual instan kepada pengguna bahwa konten sedang dimuat, bukan website yang macet.
  3. Di background (di server), ProductList akan mulai mengambil data produk dari dummyjson.com dan menunggu simulasi delay yang kita set.
  4. Begitu data produk siap, ListProductsSkeleton akan digantikan secara mulus dengan daftar produk yang sebenarnya, menampilkan setiap produk menggunakan komponen ProductCard.

Pengguna mendapatkan pengalaman loading awal yang instan, dan konten dinamis muncul setelahnya tanpa perlu full-page reload yang mengganggu. Ini adalah demonstrasi nyata dari kekuatan Partial Prerendering!


4. Hasilnya localhost:3000

Jalankan server dengan perintah bun dev atau npm run dev, lalu buka http://localhost:3000 di browser.

Partial Prerendering
Partial Prerendering

Kapan Sebaiknya Pakai, Kapan Jangan? (Panduan Anti Galau)

Oke, Partial Prerendering ini memang fitur yang keren dan powerful. Dia bisa jadi penyelamat di banyak skenario, tapi ingat, enggak ada satu pun teknologi yang jadi obat mujarab buat semua masalah. Ada kalanya dia jadi pahlawan super yang kita butuhkan, tapi ada juga kalanya dia justru bisa jadi beban tambahan.

Agar Anda enggak galau dalam memutuskan, yuk kita bedah kapan Partial Prerendering ini sebaiknya digunakan, dan kapan mungkin lebih baik dipertimbangkan ulang atau bahkan dihindari:

Image by Freepik
Image by Freepik

Gunakan Partial Prerendering Ketika:

  • Halaman Anda Punya Kombinasi Konten Statis dan Dinamis yang Jelas. Ini adalah skenario paling ideal untuk Partial Prerendering. Bayangkan halaman artikel berita: konten artikelnya (teks, gambar) cenderung statis setelah dipublikasikan, tapi bagian komentar, jumlah likes, atau daftar "berita terkait" bisa terus berubah. Atau pada studi kasus "Kilat Jual" kita, deskripsi produk dan gambar adalah statis, sementara harga diskon dan ketersediaan stok itu dinamis. Partial Prerendering akan menyajikan yang statis duluan dengan cepat, lalu mengalirkan yang dinamis belakangan.
  • Anda Mengejar Performa Loading Awal yang Super Cepat (Core Web Vitals Optimal) tapi Tetap Butuh Data Real-time. Ini adalah sweet spotnya Partial Prerendering. Anda ingin First Contentful Paint (FCP) dan Largest Contentful Paint (LCP) situs Anda secepat kilat untuk pengalaman pengguna yang superior dan nilai Core Web Vitals yang bagus di mata Google (penting buat SEO!). Namun, Anda juga enggak mau mengorbankan kesegaran data. Partial Prerendering memungkinkan Anda meraih keduanya: initial load yang instan, lalu data terbaru di bagian dinamis muncul secara seamless.
  • Server Anda Siap untuk Streaming Data Dinamis. Meskipun Partial Prerendering membuat loading awal di client lebih cepat, perlu diingat bahwa bagian dinamis yang di-stream itu tetap di-render di server. Jadi, ada beban komputasi di sisi server untuk setiap permintaan yang membutuhkan data dinamis tersebut. Pastikan infrastruktur server Anda mampu menangani beban ini, terutama jika Anda mengharapkan banyak traffic dan bagian dinamis yang kompleks.
Image by Freepik
Image by Freepik

Hindari atau Pertimbangkan Ulang Ketika:

  • Seluruh Halaman Sangat Dinamis dan Berubah Sepenuhnya. Jika hampir seluruh isi halaman Anda berubah-ubah setiap saat, dan sangat sedikit (atau tidak ada) bagian yang statis, maka Partial Prerendering mungkin kurang efisien. Dalam kasus ini, Server-Side Rendering (SSR) murni atau bahkan Client-Side Rendering (CSR) dengan strategi pre-fetching mungkin masih jadi pilihan yang lebih simpel dan langsung sesuai kebutuhan, karena tidak ada "bagian statis" yang bisa di-prerender.
  • Anda Membangun Aplikasi dengan Interaksi Real-time yang Sangat Intensif. Untuk aplikasi seperti live chat, multiplayer online game, atau trading dashboard yang datanya diperbarui setiap milidetik, Partial Prerendering mungkin tidak cukup. Interaksi real-time yang sangat intensif biasanya memerlukan teknologi khusus seperti WebSockets atau polling yang sangat agresif. Partial Prerendering ditujukan untuk streaming data dinamis, bukan untuk komunikasi dua arah yang super cepat dan terus-menerus.
  • Kesederhanaan dan Waktu Pengembangan adalah Prioritas Utama. Jika proyek Anda sangat kecil, sederhana, dan tidak memiliki kebutuhan data yang highly dynamic, mungkin menggunakan Static Site Generation (SSG) murni sudah lebih dari cukup. Mengimplementasikan Partial Prerendering akan menambah sedikit kompleksitas pada arsitektur kode Anda. Untuk blog pribadi sederhana atau landing page yang jarang berubah, terkadang keep it simple itu lebih baik.

Penutup: Masa Depan Web yang Lebih Cepat dan Responsif

Nah, sampai di sini, jelas sudah kalau Partial Prerendering di Next.js 15 ini bukan cuma gimmick atau sekadar nama baru. Ini bener-bener game-changer dalam dunia pengembangan web. Fitur ini membuktikan bahwa kita sebagai developer enggak perlu lagi terjebak dalam dilema klasik, harus kompromi antara kecepatan loading yang super cepat di satu sisi, dengan kebutuhan akan freshness data yang selalu up-to-date di sisi lain.

Dengan Partial Prerendering, kita sekarang bisa punya website yang kencengnya kebangetan, performanya luar biasa mulus di mata pengguna, tapi di saat yang sama, tetap mampu menyajikan data paling baru dan relevan secara dinamis. Ini seperti memiliki supercar yang irit bahan bakar tapi tetap bertenaga penuh!

Jadi, buat kalian semua, para developer yang sedang membangun website dengan Next.js, atau yang berencana untuk itu, jangan ragu lagi untuk eksplorasi fitur canggih ini. Cobain sendiri di proyek kalian, rasakan perbedaannya, dan nikmati sensasi punya website yang responsifnya juara, sekaligus informasinya selalu setajam berita pagi. Ini adalah langkah maju yang signifikan menuju pengalaman web yang lebih baik untuk semua.