Next.js 14 menjadi standar baru untuk pengembangan aplikasi React full‑stack dengan performa tinggi. Tutorial ini memandu Anda langkah demi langkah menginstal, mengkonfigurasi, dan menulis contoh kode menggunakan App Router, Server Actions, dan TypeScript, serta memberikan best practice untuk produksi.
1. Persiapan Lingkungan
Pastikan Anda memiliki versi Node.js v20.9 atau lebih baru serta pnpm (atau npm/yarn) terpasang. Verifikasi dengan:
node -v
pnpm -v
Jika belum terpasang, unduh Node.js dari situs resmi dan instal pnpm dengan npm i -g pnpm.
2. Membuat Proyek Next.js 14
Jalankan perintah berikut untuk membuat proyek baru dengan template TypeScript:
pnpm create next-app@latest my-next14-app --ts
Anda akan diminta memilih opsi:
- App Router: pilih
Yes(default). - ESLint:
Yes. - Tailwind CSS: optional, tapi contoh ini menggunakannya untuk styling cepat.
Setelah selesai, masuk ke folder proyek:
cd my-next14-app
3. Instalasi Dependency Tambahan
Untuk contoh API dan otentikasi sederhana, tambahkan paket berikut:
pnpm add prisma @prisma/client
pnpm add bcryptjs jsonwebtoken
pnpm add -D prisma-cli
Jika menggunakan Tailwind, pastikan file tailwind.config.js sudah terkonfigurasi (otomatis dari template).
4. Setup Prisma dan Database SQLite (dev)
Inisialisasi Prisma:
npx prisma init --datasource-provider sqlite
Ubah prisma/schema.prisma menjadi:
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
password String
createdAt DateTime @default(now())
}
Jalankan migrasi:
npx prisma migrate dev --name init
Prisma Client sekarang tersedia untuk di‑import di server actions.
5. Membuat Server Action untuk Registrasi
Buat file app/api/auth/register/route.ts (Next.js 14 API Route dengan Server Action):
import { NextResponse } from 'next/server';
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const JWT_SECRET = process.env.JWT_SECRET || 'dev-secret';
export async function POST(request: Request) {
const { email, password } = await request.json();
if (!email || !password) {
return NextResponse.json({ error: 'Email dan password diperlukan' }, { status: 400 });
}
const existing = await prisma.user.findUnique({ where: { email } });
if (existing) {
return NextResponse.json({ error: 'User sudah terdaftar' }, { status: 409 });
}
const hashed = await bcrypt.hash(password, 12);
const user = await prisma.user.create({ data: { email, password: hashed } });
const token = jwt.sign({ id: user.id, email: user.email }, JWT_SECRET, { expiresIn: '7d' });
return NextResponse.json({ token }, { status: 201 });
}
Catatan: gunakan .env untuk JWT_SECRET dan DATABASE_URL.
6. Membuat Halaman Registrasi dengan App Router
Di folder app/register/page.tsx tambahkan komponen berikut:
"use client";
import { useState } from 'react';
import { useRouter } from 'next/navigation';
export default function RegisterPage() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const router = useRouter();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError('');
const res = await fetch('/api/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
if (!res.ok) {
const data = await res.json();
setError(data.error || 'Terjadi kesalahan');
return;
}
const { token } = await res.json();
localStorage.setItem('authToken', token);
router.push('/dashboard');
};
return (
Registrasi
{error && {error}
}
);
}
Komponen di atas menggunakan use client karena berinteraksi dengan DOM.
7. Membuat Dashboard yang Terproteksi
Buat app/dashboard/page.tsx. Kita akan memanfaatkan middleware.ts untuk otorisasi.
export default function DashboardPage() {
return (
Selamat datang di Dashboard!
Anda berhasil masuk dengan token JWT yang valid.
);
}
8. Middleware Otentikasi
Tambah middleware.ts di root proyek:
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('authToken')?.value || request.headers.get('authorization')?.split(' ')[1];
const protectedPaths = ['/dashboard'];
if (protectedPaths.some(p => request.nextUrl.pathname.startsWith(p))) {
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
try {
// verifikasi token secara ringan tanpa library full untuk demo
const [, payload] = token.split('.');
const decoded = JSON.parse(atob(payload));
if (decoded.exp * 1000 < Date.now()) throw new Error('Expired');
} catch (e) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
return NextResponse.next();
}
export const config = { matcher: ['/dashboard/:path*'] };
Middleware ini memeriksa JWT di cookie atau header dan mengarahkan ke halaman login bila tidak valid.
9. Menjalankan Aplikasi Secara Lokal
pnpm dev
Akses http://localhost:3000/register, daftarkan akun, lalu Anda akan diarahkan ke /dashboard. Semua proses terjadi di server side lewat Server Actions, sehingga tidak ada kode API terpisah di client.
10. Best Practice untuk Produksi
- Gunakan Environment Variables yang aman: simpan
DATABASE_URL,JWT_SECRETdi.env.productiondan jangan pernah commit ke repo. - Enable Incremental Static Regeneration (ISR) untuk halaman publik yang tidak sensitif, mengurangi beban server.
- Audit dependencies dengan
pnpm auditdan perbarui rutin. - Gunakan TypeScript strict mode (aktifkan
strict: trueditsconfig.json) untuk menghindari bug runtime. - Cache Prisma queries bila diperlukan, gunakan
prisma.$cacheatau library sepertilru-cache. - Deploy ke Vercel atau Render yang sudah optimal untuk Next.js – pastikan
output: "standalone"dinext.config.jsuntuk Docker builds.
11. Deploy dengan Docker (Opsional)
# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN pnpm install --frozen-lockfile
RUN pnpm build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
Build dan jalankan:
docker build -t next14-app .
docker run -p 3000:3000 next14-app
Aplikasi kini siap diakses secara production‑grade.
12. Monitoring & Logging
Integrasikan Sentry atau LogRocket untuk error tracking. Tambahkan SDK di app/layout.tsx dengan useEffect pada client side.
13. Penutup
Dengan mengikuti langkah‑langkah di atas, Anda telah menyiapkan proyek Next.js 14 modern, memanfaatkan App Router, Server Actions, TypeScript, serta keamanan JWT. Struktur ini skalabel untuk tim kecil hingga enterprise, dan siap di‑deploy ke platform cloud pilihan.
Next.js 14 membuka cara baru untuk membangun aplikasi full‑stack yang cepat, aman, dan mudah dipelihara. Dengan App Router dan Server Actions, logika backend berada tepat di sekitar komponen UI, mengurangi boilerplate dan meningkatkan developer experience. Ikuti best practice keamanan, tipe kuat, serta deployment container‑aware, dan Anda akan memiliki fondasi solid untuk proyek Web Development modern yang siap bersaing di era cloud native.
Panduan lengkap step‑by‑step setup Next.js 14 dengan App Router, Server Actions, TypeScript, Prisma, dan JWT untuk developer Web Development tahun 2026.
Programming,Software Engineering,Web Development
#Programming #SoftwareEngineering #WebDev #Tech #Coding
0 Komentar