React vs Next.js hampir selalu muncul di setiap kickoff call kami dengan klien baru. Kedua nama ini sering dipakai bergantian oleh orang yang baru baca satu artikel blog, dan kebingungan itu berujung pada pilihan teknologi yang salah, yang baru terasa mahal enam bulan kemudian. Berikut perbedaan sebenarnya, bukan versi marketingnya.
Apa Itu React Sebenarnya
React adalah library JavaScript, bukan framework. React memberi cara membangun user interface dari komponen yang bisa dipakai ulang, dan mengurus state serta re-render untuk Anda. React sendiri tidak menentukan bagaimana aplikasi sampai ke browser, bagaimana routing bekerja, atau bagaimana data diambil. Pada setup React murni (dibangun dengan Vite atau dulu Create React App), browser mengunduh file HTML yang hampir kosong plus satu bundle JavaScript, lalu React berjalan di browser untuk membangun halaman. Ini disebut client-side rendering (CSR): semua proses rendering terjadi di perangkat pengunjung, setelah JS selesai dimuat dan dijalankan.
Arsitektur inilah yang membuat React jadi pilihan default untuk single-page application (SPA) — dashboard, internal tools, admin panel, dan aplikasi web di mana user sudah login dan berinteraksi dengan data, bukan sekadar membaca konten.
Apa Itu Next.js Sebenarnya
Next.js adalah framework yang dibangun di atas React. Next.js menambahkan bagian yang sengaja tidak disediakan React: file-based routing, optimasi gambar, API routes, dan yang paling penting, strategi rendering di luar CSR. Dengan Next.js Anda bisa memilih server-side rendering (SSR, HTML dibuat per request di server), static site generation (SSG, HTML dibuat sekali saat build), incremental static regeneration (ISR, halaman statis yang diperbarui secara terjadwal), atau React Server Components (RSC, model App Router yang lebih baru di mana komponen berjalan di server secara default dan mengirim lebih sedikit JavaScript ke browser).
Singkatnya: React adalah lapisan UI, Next.js adalah framework aplikasi lengkap yang menentukan di mana dan kapan UI itu di-render.
Perbedaan Inti: Di Mana Rendering Terjadi
Ini bagian yang paling menentukan untuk keputusan bisnis, lebih penting dari daftar fitur mana pun. Pada React SPA murni, crawler mesin pencari atau pengunjung dengan koneksi lambat pertama kali menerima HTML yang hampir kosong. Konten baru muncul setelah JavaScript diunduh dan dijalankan. Dengan Next.js (SSR/SSG) atau React yang di-prerender, crawler dan pengunjung langsung menerima HTML yang sudah lengkap, dan JavaScript baru datang setelahnya untuk membuat halaman interaktif.
Implikasi SEO
Crawler Google bisa menjalankan JavaScript dan mengindeks halaman CSR, tapi ini terjadi lewat rendering pass kedua yang bisa tertunda berhari-hari bahkan berminggu-minggu pada situs dengan otoritas rendah, dan tidak dijamin selesai untuk semua halaman. Crawler lain juga penting: rendering JS Bing lebih lemah, dan scraper link preview yang dipakai WhatsApp, Facebook, dan LinkedIn untuk Open Graph card umumnya sama sekali tidak menjalankan JavaScript — ini masalah nyata untuk bisnis yang membagikan link lewat media sosial dan aplikasi chat, dua sumber traffic dominan di Indonesia. Kalau visibilitas di pencarian organik atau preview link yang rapi di sosial media penting untuk bisnis Anda, mengirim HTML yang sudah di-prerender atau di-render di server bukan opsional, itu kebutuhan dasar.
Performa dan Core Web Vitals
SSR dan SSG biasanya unggul di Largest Contentful Paint (LCP) karena browser langsung punya konten untuk digambar, tanpa menunggu eksekusi JS. Aplikasi CSR murni tetap bisa mencapai skor Core Web Vitals yang bagus, tapi butuh kerja ekstra: code splitting, lazy loading komponen di bawah lipatan layar, dan menjaga ukuran bundle JS awal tetap kecil. Next.js melakukan banyak hal ini secara otomatis lewat build pipeline-nya; React SPA murni menyerahkan semuanya ke developer untuk dikerjakan dengan benar, dan di sinilah banyak situs React yang tidak dioptimasi berakhir dengan performa mobile yang buruk.
Hosting dan Biaya untuk UKM Indonesia
Di sinilah keputusan jadi praktis. Situs React statis atau yang sudah di-prerender hanyalah kumpulan file — HTML, CSS, JS — yang bisa dilayani nginx apa pun, hosting cPanel, atau static host gratis. Tidak ada proses Node.js yang harus terus dijaga hidup, tidak ada biaya server yang naik sesuai traffic, dan tidak ada cold-start latency. Aplikasi Next.js dengan SSR butuh server Node.js yang berjalan terus-menerus (atau serverless function di platform seperti Vercel), artinya harus membayar tingkat hosting itu atau menerima skema harga berdasar pemakaian begitu keluar dari free tier — pertimbangan nyata untuk UKM yang masih memvalidasi model bisnisnya. Free tier Vercel cukup murah hati untuk situs kecil, tapi traffic SSR yang lebih berat, transformasi gambar, atau revalidasi ISR bisa mendorong bisnis yang sedang tumbuh ke paket berbayar lebih cepat dari perkiraan. Kalau aplikasi Next.js Anda 100% static-generated (SSG) saat build, kekhawatiran biaya ini sebagian besar hilang, karena hasilnya kembali jadi file statis biasa.
Developer Experience dan Kecepatan Rilis
Next.js memang lebih cepat untuk memulai project — routing, penanganan gambar, dan API routes sudah tersedia, jadi lebih sedikit keputusan boilerplate di awal. Kemudahan ini datang dengan lebih banyak opini soal struktur folder dan model rendering, yang bisa memperlambat tim begitu project menyimpang dari asumsi framework. React murni dengan Vite punya jejak awal lebih kecil dan lebih sedikit opini, tapi setiap bagian — router, pengambilan data, penanganan SEO — jadi keputusan terpisah yang harus dibuat dan dijaga sendiri oleh tim.
Jalan Tengah: Vite + React dengan Prerendering
Ada opsi ketiga yang sering dilewatkan di kebanyakan perbandingan React vs Next.js: SPA React + Vite dengan tahap prerendering saat build (kami memakai Puppeteer di KayFreyTech). Proses build menjalankan headless browser terhadap setiap route, menangkap HTML yang sudah sepenuhnya di-render, lalu menulisnya ke disk. Hasilnya adalah file HTML statis yang secara prinsip identik dengan SSG Next.js — crawler dan scraper link preview langsung mendapat konten asli — tapi dihosting sebagai file statis biasa tanpa biaya atau kompleksitas server SSR. Ini tidak cocok untuk halaman yang butuh personalisasi per-request atau data real-time (dashboard yang sudah login, harga live, isi keranjang belanja), karena prerendering hanya terjadi sekali saat build. Tapi untuk situs marketing, landing page, blog, dan sebagian besar website UKM di mana kontennya sama untuk setiap pengunjung, ini alternatif yang sah dan sering kali lebih murah dibanding Next.js.
Kerangka Keputusan Berdasarkan Jenis Bisnis
Rekomendasi Kami
Untuk sebagian besar website bisnis UKM Indonesia — company profile, katalog produk, halaman layanan, blog — kami defaultnya memakai React + Vite dengan prerendering Puppeteer. Ini memberi visibilitas SEO penuh, skor PageSpeed yang konsisten bagus, dan biaya hosting yang tetap flat saat traffic naik, hal yang penting ketika budget klien terbatas. Kami baru memakai Next.js kalau project memang butuh logika server per-request: inventori real-time, harga khusus per user, atau produk seperti aplikasi di mana interaktivitas CSR lebih penting dibanding SEO statis. Tidak ada framework yang objektif lebih baik; kesalahannya adalah memilih satu tanpa memetakan ke kebutuhan render bisnis yang sebenarnya, dan kapan itu terjadi. Kalau belum yakin project Anda masuk kategori mana, [hubungi kami](/get-quote/) dan kita bahas dulu sebelum satu baris kode pun ditulis.
Kesimpulan
React menjawab "bagaimana saya membangun interface." Next.js menjawab "di mana dan kapan interface itu di-render, dan bagaimana pengunjung serta crawler melihatnya sebelum JavaScript dimuat." Aplikasi React yang hanya CSR adalah pilihan salah untuk apa pun yang perlu ranking di pencarian atau tampil benar sebagai preview di media sosial. Next.js menyelesaikan itu tapi menambah biaya server dan opini framework yang belum tentu Anda butuhkan. React yang di-prerender dengan Vite sering jadi jalan tengah paling pragmatis untuk situs UKM yang butuh SEO tanpa biaya berkelanjutan dari server Node.
