Next.js 14 menjadi standar baru untuk pengembangan aplikasi React full‑stack. Tutorial ini memberikan langkah‑langkah detail mulai dari instalasi, konfigurasi, contoh kode, hingga best practice untuk keamanan dan performa, lengkap dengan tips debugging dan deployment ke Vercel.
1. Prasyarat dan Persiapan Lingkungan
Sebelum memulai, pastikan Anda memiliki:
- Node.js versi 20.x atau lebih baru (
node -v) - npm 10.x atau Yarn 4 (kelas terbaru)
- Git untuk version control
- Akun Vercel (opsional untuk deployment)
Jika belum terpasang, instal Node.js dari situs resmi dan verifikasi dengan perintah node -v serta npm -v.
2. Membuat Proyek Next.js 14 Baru
npx create-next-app@latest my-next14-app --ts --experimental-app
cd my-next14-app
Parameter --ts menambahkan TypeScript, sementara --experimental-app mengaktifkan App Router (fitur standar di Next.js 14). Struktur folder utama akan terlihat seperti:
app/
layout.tsx
page.tsx
api/
route.ts
public/
next.config.mjs
Folder app menggantikan pages yang lama dan mendukung server components secara default.
3. Instalasi Dependensi Tambahan
npm install tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init -p
Konfigurasikan tailwind.config.cjs dengan content mengarah ke folder app:
module.exports = {
content: ["./app/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"],
theme: { extend: {} },
plugins: [],
};
Lalu tambahkan Tailwind directives ke app/globals.css:
@tailwind base;
@tailwind components;
@tailwind utilities;
4. Membuat Layout Global dengan Server Component
// app/layout.tsx
import './globals.css';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Next.js 14 Demo',
description: 'A modern full‑stack app with App Router & Server Actions',
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
{children}
);
}
Karena layout.tsx berada di server, Anda dapat mengakses env vars langsung tanpa mengekspor ke client.
5. Implementasi Server Action untuk Formulir Kontak
Server Actions memungkinkan Anda menulis fungsi async yang berjalan di server tapi dipanggil dari komponen client.
// app/contact/page.tsx
'use client';
import { useState, FormEvent } from 'react';
export default function ContactPage() {
const [status, setStatus] = useState('');
async function sendMessage(formData: FormData) {
'use server';
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const message = formData.get('message') as string;
// Simulasi penyimpanan ke DB (misal Supabase atau Prisma)
console.log('Menerima pesan', { name, email, message });
return { ok: true };
}
const handleSubmit = async (e: FormEvent) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const res = await sendMessage(formData);
setStatus(res.ok ? 'Terima kasih! Pesan terkirim.' : 'Gagal mengirim');
};
return (
Hubungi Kami
{status && {status}
}
);
}
Catatan: Tambahkan 'use server' di dalam fungsi yang harus dijalankan di backend. Karena fungsi berada dalam file client, Anda tetap dapat memanggilnya secara langsung.
6. Menghubungkan ke Database dengan Prisma 5
# Install Prisma CLI & driver PostgreSQL
npm install prisma@latest @prisma/client@latest
npx prisma init --datasource-provider postgresql
Ubah .env dengan DATABASE_URL Anda, lalu definisikan skema:
// prisma/schema.prisma
model Message {
id Int @id @default(autoincrement())
name String
email String
content String
createdAt DateTime @default(now())
}
Jalankan migrasi:
npx prisma migrate dev --name init
Update Server Action untuk menyimpan data:
'use server';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export async function sendMessage(formData: FormData) {
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const content = formData.get('message') as string;
await prisma.message.create({
data: { name, email, content },
});
return { ok: true };
}
7. Konfigurasi Optimasi Produksi
- Image Optimization: gunakan
next/imagedenganloader: 'custom'bila memakai CDN eksternal. - Metadata Caching: di
next.config.mjsaktifkanrevalidateuntuk ISR (Incremental Static Regeneration). - Bundling: tambahkan
experimental: {appDir: true}(default di 14) untuk mengurangi ukuran bundle client.
// next.config.mjs
import { defineConfig } from 'next';
export default defineConfig({
reactStrictMode: true,
swcMinify: true,
images: { remotePatterns: [{ protocol: 'https', hostname: '**' }] },
experimental: { appDir: true },
// ISR default 60 detik
async rewrites() { return [{ source: '/sitemap.xml', destination: '/api/sitemap' }]; },
});
8. Testing dan Debugging
Gunakan next dev untuk development dengan hot‑reload. Untuk unit test, install Vitest dan React Testing Library:
npm i -D vitest @testing-library/react @testing-library/jest-dom
Contoh test sederhana untuk komponen kontak:
// __tests__/ContactPage.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import ContactPage from '@/app/contact/page';
test('renders form and submits', async () => {
render( );
fireEvent.input(screen.getByPlaceholderText('Nama'), { target: { value: 'Budi' } });
fireEvent.input(screen.getByPlaceholderText('Email'), { target: { value: 'budi@example.com' } });
fireEvent.input(screen.getByPlaceholderText('Pesan'), { target: { value: 'Halo' } });
fireEvent.click(screen.getByText('Kirim'));
expect(await screen.findByText(/Terima kasih/)).toBeInTheDocument();
});
9. Deploy ke Vercel
- Push repository ke GitHub.
- Buka dashboard Vercel, pilih New Project → import repo.
- Vercel otomatis mendeteksi
next.config.mjsdan mengatur build commandnpm run buildserta output directory.next. - Tambahkan Environment Variable
DATABASE_URLdi Settings → Environment Variables. - Deploy dan verifikasi URL akhir.
Untuk domain custom, konfigurasi DNS CNAME ke cname.vercel-dns.com.
10. Best Practice & Keamanan
- Rate Limiting: gunakan middleware Edge Function untuk membatasi request ke API route.
- CSRF Protection: Next.js 14 sudah melindungi API routes dengan token built‑in bila memakai
next-authataucsrflibrary. - Environment Isolation: Simpan semua secret di Vercel/Env dan hindari hard‑code.
- Code Splitting: letakkan komponen heavy (chart, map) dalam
dynamic(() => import(...), { ssr: false })agar tidak memperlambat initial load. - Accessibility: gunakan elemen semantik,
aria‑label, dan pastikan kontras warna memenuhi WCAG AA.
11. Monitoring dan Logging
Integrasikan dengan Vercel Analytics atau gunakan Sentry untuk error tracking. Tambahkan wrapper di app/_middleware.ts untuk mencatat request latency.
// app/_middleware.ts
import { NextResponse } from 'next/server';
export async function middleware(request) {
const start = Date.now();
const response = NextResponse.next();
const duration = Date.now() - start;
console.log(`${request.method} ${request.nextUrl.pathname} - ${duration}ms`);
return response;
}
12. Skalabilitas Lanjutan dengan Turborepo
Jika Anda mengelola monorepo (frontend + backend), tambahkan Turborepo untuk caching build:
npx create-turbo@latest my-monorepo
# Pindahkan folder app ke packages/web dan tambahkan package api yang memakai NestJS atau Fastify.
Konfigurasi turbo.json dengan pipeline build, lint, test sehingga CI/CD di GitHub Actions menjadi cepat.
Next.js 14 dengan App Router dan Server Actions menawarkan cara modern untuk membangun aplikasi full‑stack yang cepat, aman, dan mudah di‑scale. Dengan mengikuti langkah‑langkah di atas—mulai dari instalasi, integrasi Prisma, hingga deployment di Vercel—Anda dapat menghasilkan produk yang siap produksi dalam hitungan jam. Selalu terapkan best practice keamanan, testing otomatis, dan monitoring untuk menjaga kualitas codebase dalam jangka panjang.
Tutorial step‑by‑step setup Next.js 14 dengan App Router, Server Actions, Tailwind, Prisma, testing, dan deployment Vercel. Panduan lengkap untuk developer Web Development di 2026.
Programming,Software Engineering,Web Development,Next.js 14,App Router,Server Actions,TailwindCSS,Prisma,Vercel
#Programming #SoftwareEngineering #WebDev #Tech #Coding
0 Komentar