Next.js 14 menjadi standar de facto untuk pengembangan aplikasi React modern. Tutorial ini membimbing Anda langkah demi langkah menginstal, mengkonfigurasi, menulis kode contoh, serta menerapkan best practice untuk performa dan keamanan.

1. Prasyarat & Lingkungan Pengembangan

Pastikan Anda memiliki:

  • Node.js v20.10 atau lebih baru (node -v)
  • npm v10 atau Yarn v4
  • Git untuk version control
  • Editor kode (VS Code direkomendasikan dengan ekstensi ESLint & Prettier)

1.1. Verifikasi Instalasi

node -v
npm -v

Jika versi tidak sesuai, unduh Node.js terbaru.

2. Membuat Project Next.js 14 Baru

2.1. Inisialisasi dengan create‑next‑app

npx create-next-app@latest my-next14-app --ts --eslint --src-dir --app
cd my-next14-app

Opsi --app secara otomatis mengaktifkan App Router, yang menjadi fondasi Next.js 14.

2.2. Struktur Direktori

Setelah perintah selesai, struktur src/app akan muncul:

src/
  app/
    layout.tsx
    page.tsx
    globals.css
  components/
  lib/

Folder app menggantikan pages dan mendukung file‑based routing, streaming, dan Server Actions.

3. Konfigurasi Dasar

3.1. TypeScript & ESLint

File tsconfig.json sudah ter‑generate. Tambahkan aturan khusus:

{
  "extends": "next/core-web-vitals",
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true,
    "baseUrl": "./src"
  }
}

3.2. Pengaturan Environment

Buat file .env.local di root:

NEXT_PUBLIC_API_URL=https://api.example.com
NEXT_PUBLIC_GOOGLE_ANALYTICS=G-XXXXXXXXXX

Gunakan process.env.NEXT_PUBLIC_* di kode React tanpa takut terekspos pada server.

4. Implementasi Server Actions (Next.js 14)

4.1. Apa Itu Server Action?

Server Action memungkinkan Anda mengeksekusi fungsi di server langsung dari komponen React tanpa menulis API route terpisah. Ini meningkatkan keamanan karena logika tetap di server.

4.2. Membuat Action untuk Menyimpan Data

Tambahkan file src/app/contact/page.tsx:

import React from "react";

export default function ContactPage() {
  async function handleSubmit(formData: FormData) {
    "use server"; // menandakan eksekusi di server
    const name = formData.get("name") as string;
    const email = formData.get("email") as string;
    const message = formData.get("message") as string;

    // contoh panggilan ke API internal
    const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/contact`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ name, email, message })
    });
    if (!res.ok) throw new Error("Failed to submit");
    revalidatePath("/contact/success"); // optional, invalidate cache
  }

  return (
    

Contact Us