Next.js 14 menjadi standar de‑facto untuk aplikasi React modern. Tutorial ini membimbing Anda dari instalasi, konfigurasi, hingga deployment optimal di Vercel, lengkap dengan contoh kode Server Actions dan best practice keamanan serta performa.

1. Prasyarat dan Persiapan Lingkungan

Pastikan Anda memiliki:

  • Node.js v20.12.0 atau lebih tinggi (LTS)
  • npm 10.5.0 atau Yarn 4
  • Git 2.45
  • Akun Vercel (opsional untuk deployment)

Verifikasi versi dengan node -v dan npm -v. Jika belum terpasang, unduh dari nodejs.org.

2. Membuat Project Next.js 14 Baru

npx create-next-app@latest my-next14-app --ts --app
cd my-next14-app

Parameter --ts mengaktifkan TypeScript, sedangkan --app menginisialisasi struktur App Router (folder app/).

3. Instalasi Dependensi Tambahan

Kita akan menambahkan beberapa library yang kini menjadi standar di ekosistem Next.js 14:

  • next-auth untuk otentikasi
  • zod untuk validasi schema
  • react-query (atau @tanstack/react-query) untuk data fetching
npm i next-auth zod @tanstack/react-query
npm i -D @types/node

4. Konfigurasi next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  experimental: {
    serverActions: true, // aktivasi Server Actions (stable sejak v14.1)
    appDir: true,
  },
  images: {
    remotePatterns: [{
      protocol: 'https',
      hostname: 'images.unsplash.com',
    }],
  },
};
export default nextConfig;

Aktifkan serverActions agar fungsi "use server" dapat dipanggil dari komponen client.

5. Membuat Layout Global dengan Tailwind CSS

Next.js 14 terintegrasi baik dengan Tailwind. Install dan konfigurasikan:

npm i -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

Update tailwind.config.js:

module.exports = {
  content: [
    './app/**/*.{js,ts,jsx,tsx}',
    './pages/**/*.{js,ts,jsx,tsx}',
    './components/**/*.{js,ts,jsx,tsx}',
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};

Tambahkan Tailwind directives ke app/globals.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

6. Implementasi Server Action: Formulir Kontak

Server Actions memungkinkan eksekusi kode server langsung dari komponen client tanpa API route terpisah.

6.1. Buat file app/contact/page.tsx

"use client";
import { useState, FormEvent } from 'react';
import { z } from 'zod';

// Definisikan schema validasi
const ContactSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
  message: z.string().min(10),
});

export default function ContactPage() {
  const [status, setStatus] = useState('idle');
  const [error, setError] = useState('');

  async function handleSubmit(event: FormEvent) {
    event.preventDefault();
    setStatus('loading');
    const formData = new FormData(event.currentTarget);
    const payload = Object.fromEntries(formData);
    try {
      // Validasi di client dulu (optional)
      ContactSchema.parse(payload);
      // Panggil Server Action
      await sendContact(payload as any);
      setStatus('success');
    } catch (e: any) {
      setError(e.message);
      setStatus('error');
    }
  }

  return (
    

Hubungi Kami