Next.js 14 menjadi standar de‑facto untuk aplikasi React modern. Tutorial ini membimbing Anda langkah demi langkah menginstal, mengonfigurasi, menulis kode, serta menerapkan best practice untuk keamanan, performa, dan CI/CD.
1. Persiapan Lingkungan
Pastikan sistem Anda memiliki Node.js versi 20.10.0 atau lebih baru, serta git dan pnpm (disarankan karena kecepatan instalasi). Anda dapat memeriksa versi dengan:
node -v
pnpm -v
git --version
1.1 Instalasi Node.js
Gunakan NodeSource pada Linux atau installer resmi untuk Windows/macOS.
1.2 Instalasi pnpm
npm install -g pnpm
2. Membuat Proyek Next.js 14
Jalankan perintah berikut untuk membuat aplikasi baru dengan App Router aktif secara default:
pnpm create next-app@latest my-next14-app --ts
Parameter --ts menyiapkan TypeScript, yang kini menjadi pilihan utama untuk projek berskala.
2.1 Struktur Direktori Utama
/app– folder App Router (pages digantikan)./components– komponen UI yang dapat dipakai kembali./lib– utilitas, API client, dan helper./public– aset statis.
3. Konfigurasi Dasar
3.1 next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
experimental: {
serverActions: true, // aktifkan Server Actions (fitur eksperimental stabil pada v14)
appDir: true,
},
images: {
remotePatterns: [{ protocol: 'https', hostname: 'images.unsplash.com' }],
},
};
export default nextConfig;
Konfigurasi di atas mengaktifkan Server Actions, memperbaiki ukuran bundle dengan SWC, serta menambahkan remote image pattern untuk next/image.
3.2 TypeScript Strict Mode
Pastikan tsconfig.json memiliki "strict": true untuk mendeteksi potensi bug pada waktu kompilasi.
4. Membuat Halaman Utama dengan Server Action
4.1 Buat File /app/page.tsx
import React from 'react';
import { addTodo } from '@/lib/actions';
export default function Home() {
const [title, setTitle] = React.useState('');
const [loading, setLoading] = React.useState(false);
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setLoading(true);
await addTodo(title);
setTitle('');
setLoading(false);
}
return (
<main className="container mx-auto p-4">
<h1 className="text-3xl font-bold mb-4">Todo List (Next.js 14)</h1>
<form onSubmit={handleSubmit} className="flex gap-2 mb-6">
<input
type="text"
value={title}
onChange={e => setTitle(e.target.value)}
placeholder="Tambahkan todo..."
required
className="flex-1 p-2 border rounded"
/>
<button
type="submit"
disabled={loading}
className="px-4 py-2 bg-blue-600 text-white rounded"
>
{loading ? 'Menyimpan...' : 'Tambah'}
</button>
</form>
{/* Render list di sini – akan dibahas pada step berikutnya */}
</main>
);
}
4.2 Server Action di /lib/actions.ts
"use server"; // deklarasi Server Action
import { prisma } from '@/lib/prisma'; // contoh ORM Prisma v5
export async function addTodo(title: string) {
'use server'; // memastikan fungsi dijalankan di server
await prisma.todo.create({ data: { title } });
}
Catatan: "use server" adalah pragma baru yang menandai fungsi hanya dapat dipanggil dari server, meningkatkan keamanan karena tidak mengekspos logika ke client.
5. Menyambungkan Database dengan Prisma 5
5.1 Instalasi Prisma
pnpm add -D prisma@latest
pnpm add @prisma/client
npx prisma init --datasource-provider postgresql
5.2 Konfigurasi .env
DATABASE_URL="postgresql://user:password@localhost:5432/next14_demo?schema=public"
5.3 Definisikan Model Todo
model Todo {
id Int @id @default(autoincrement())
title String
createdAt DateTime @default(now())
}
npx prisma migrate dev --name init
5.4 Membuat Prisma Client Singleton
// /lib/prisma.ts
import { PrismaClient } from '@prisma/client';
let prisma: PrismaClient;
if (process.env.NODE_ENV === 'production') {
prisma = new PrismaClient();
} else {
// In development, reuse the same client for HMR
if (!(global as any).prisma) {
(global as any).prisma = new PrismaClient();
}
prisma = (global as any).prisma;
}
export { prisma };
6. Menampilkan Daftar Todo dengan Streaming Server Component
6.1 Buat Komponen /app/components/TodoList.tsx
import { prisma } from '@/lib/prisma';
import Link from 'next/link';
export default async function TodoList() {
const todos = await prisma.todo.findMany({ orderBy: { createdAt: 'desc' } });
return (
<ul className="space-y-2">
{todos.map(todo => (
<li key={todo.id} className="p-2 border rounded">
{todo.title}
</li>
))}
</ul>
);
}
Karena komponen ini berada di dalam app directory dan tidak menggunakan "use client", Next.js akan merendernya di server secara streaming, mengurangi waktu to‑first‑byte.
6.2 Sisipkan di page.tsx
import TodoList from '@/app/components/TodoList';
... // kode sebelumnya
<TodoList />
...
7. Optimasi Performance & Security
- Edge Runtime: Tambahkan
export const runtime = 'edge';pada file yang tidak memerlukan akses Node.js, misalnya halaman statis. - Image Optimization: Gunakan
<Image>darinext/imagedengan loader default untuk meng‑serve gambar dalam WebP/AVIF otomatis. - HTTP Caching: Pada
next.config.mjssetheadersuntuk asset static:Cache-Control: public, max-age=31536000, immutable. - Content Security Policy (CSP): Tambahkan header CSP di middleware untuk mencegah XSS.
- Rate Limiting: Implementasikan
next-rate-limitpada API routes atau Server Actions.
8. CI/CD dengan GitHub Actions & Vercel
8.1 File .github/workflows/deploy.yml
name: Deploy to Vercel
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm run lint
- run: pnpm run build
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-args: '--prod'
working-directory: .
github-token: ${{ secrets.GITHUB_TOKEN }}
Vercel secara otomatis meng‑detect next.config.mjs dan melakukan preview deployment pada setiap PR.
9. Debugging & Monitoring
- Gunakan
next devdengan flag--inspectuntuk attach debugger pada Node. - Integrasikan Sentry untuk error tracking (install
@sentry/nextjs). - Aktifkan
next-telemetryuntuk mengukur LCP, TTFB, dan CLS.
10. Deploy ke Production
Setelah CI selesai, Vercel menghasilkan URL https://my-next14-app.vercel.app. Pastikan environment variable DATABASE_URL di‑set pada dashboard Vercel, serta aktifkan Edge Functions untuk fungsi yang ditandai runtime = 'edge'.
11. Best Practice Ringkas
- Gunakan TypeScript dengan
strictmode. - Prefer Server Components & Server Actions untuk logika bisnis.
- Cache data yang jarang berubah dengan
revalidateatauincremental static regeneration (ISR). - Hindari menaruh credential di kode; manfaatkan
process.envdan secret manager Vercel. - Lakukan code review dan linting (ESLint + Prettier) pada setiap PR.
Dengan mengikuti langkah‑langkah di atas, Anda kini memiliki aplikasi Next.js 14 yang menggunakan App Router, Server Actions, Prisma 5, dan CI/CD otomatis. Kombinasi server components dan edge runtime menghasilkan time‑to‑first‑byte yang sangat cepat, sementara praktik keamanan dan monitoring menjaga kualitas produksi. Mulailah bereksperimen dengan fitur baru seperti Turbopack bundler atau React Server Components v2 untuk tetap berada di depan tren pengembangan web modern.
Tutorial lengkap setup Next.js 14 dengan App Router, Server Actions, Prisma, dan CI/CD Vercel. Panduan step‑by‑step, contoh kode, dan best practice untuk Programming, Software Engineering, dan Web Development.
Programming,Software Engineering,Web Development,Next.js 14,App Router,Server Actions,Prisma,CI/CD
#Programming #SoftwareEngineering #WebDev #Tech #Coding
0 Komentar