Next.js 14 menjadi standar baru untuk pengembangan React full‑stack. Tutorial ini memberi langkah demi langkah instalasi, konfigurasi, contoh kode, serta best practice untuk membangun aplikasi modern yang siap produksi.
1. Prasyarat dan Persiapan Lingkungan
Pastikan Anda memiliki:
- Node.js v20.x atau yang lebih baru (direkomendasikan LTS 20.15)
- npm v10 atau Yarn v4
- Git untuk version control
- Editor kode, misalnya VS Code dengan ekstensi
ESLintdanPrettier
Jika belum terinstall, unduh Node.js dari nodejs.org dan verifikasi versi:
node -v
npm -v
2. Membuat Project Next.js 14 Baru
Gunakan perintah create-next-app@latest yang otomatis meng‑install versi terbaru.
npx create-next-app@latest my-next14-app
# Pilih "Yes" untuk TypeScript jika diinginkan
# Pilih "App Router" saat ditanya
cd my-next14-app
Struktur folder utama akan terlihat seperti:
app/ # App Router (new)
pages/ # legacy, tetap ada untuk fallback
public/ # static assets
styles/ # CSS/SCSS
next.config.mjs
tsconfig.json (jika TypeScript)
3. Instalasi Dependency Tambahan
Berikut beberapa paket yang sering dipakai bersama Next.js 14:
npm i tailwindcss@latest postcss@latest autoprefixer@latest
npm i @tanstack/react-query@latest
npm i zod@latest
npm i prisma@latest @prisma/client
npm i next-auth@latest
# Dev tools
npm i -D eslint prettier eslint-config-next
Jalankan inisialisasi Tailwind:
npx tailwindcss init -p
Sesuaikan tailwind.config.ts untuk mendukung app directory:
/** @type {import('tailwindcss').Config} */
export default {
content: ["./app/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}"],
theme: { extend: {} },
plugins: [],
};
4. Konfigurasi Next.js (next.config.mjs)
export default defineConfig({
reactStrictMode: true,
experimental: {
serverActions: true, // aktifkan Server Actions
},
images: {
remotePatterns: [{ hostname: "images.unsplash.com" }],
},
});
Konfigurasi di atas mengaktifkan fitur eksperimental Server Actions yang stabil sejak Next.js 14, serta menyiapkan remote image loading.
5. Membuat Layout Global dengan Server Component
// app/layout.tsx
import "./globals.css";
import { Inter } from "next/font/google";
const inter = Inter({ subsets: ["latin"] });
export const metadata = {
title: "My Next.js 14 App",
description: "Demo app with App Router and Server Actions",
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
Next.js 14 Demo
{children}
);
}
6. Implementasi Server Action untuk Formulir Kontak
Server Actions memungkinkan Anda menulis fungsi server langsung di dalam komponen React tanpa API route terpisah.
// app/contact/page.tsx
"use server";
import { redirect } from "next/navigation";
import { z } from "zod";
const schema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
});
async function sendContact(formData: FormData) {
const data = Object.fromEntries(formData.entries());
const result = schema.safeParse(data);
if (!result.success) {
// Throw to client side validation error
throw new Error("Validation failed");
}
// Simulasi penyimpanan, misalnya ke Prisma atau webhook
console.log("Contact submitted:", result.data);
// Setelah sukses, redirect ke halaman terima kasih
redirect("/contact/thanks");
}
export default function ContactPage() {
return (
);
}
Penjelasan
- Keyword
"use server"menandai fungsi tersebut hanya dijalankan di server. - Form menggunakan attribute
action={sendContact}, sehingga tidak perlu fetch API manual. - Validasi dengan
zodmenjamin data bersih sebelum diproses.
7. Menghubungkan Database dengan Prisma
Inisialisasi Prisma di proyek:
npx prisma init --datasource-provider postgresql
Edit prisma/schema.prisma:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Contact {
id Int @id @default(autoincrement())
name String
email String @unique
message String
createdAt DateTime @default(now())
}
Jalankan migrasi:
npx prisma migrate dev --name init
Update Server Action untuk menyimpan ke DB:
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function sendContact(formData: FormData) {
const data = Object.fromEntries(formData.entries());
const result = schema.safeParse(data);
if (!result.success) throw new Error("Validation failed");
await prisma.contact.create({ data: result.data });
redirect("/contact/thanks");
}
8. Menambahkan Authentication menggunakan NextAuth.js
Instalasi:
npm i next-auth@latest @auth/prisma-adapter
Buat file app/api/auth/[...nextauth]/route.ts (App Router style):
import NextAuth from "next-auth";
import GithubProvider from "next-auth/providers/github";
import { PrismaAdapter } from "@auth/prisma-adapter";
import { prisma } from "@/lib/prisma";
export const runtime = "nodejs"; // optional
export const auth = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [
GithubProvider({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
],
secret: process.env.NEXTAUTH_SECRET,
});
Gunakan useSession() di komponen client untuk mengamankan halaman:
"use client";
import { signIn, signOut, useSession } from "next-auth/react";
export default function NavBar() {
const { data: session } = useSession();
return (
);
}
9. Optimasi Performansi untuk Production
- Image Optimization: gunakan
next/imageatau remotePatterns yang sudah di‑config. - Static Generation untuk halaman yang tidak memerlukan data pribadi: export
export const revalidate = 60;pada page. - Incremental Static Regeneration (ISR) untuk konten yang berubah sporadis.
- Compress HTML & CSS: Next.js secara default meng‑gzip; pastikan
next.config.mjsmemilikicompress: truebila deploy ke custom server. - Bundle Analyzer:
npm i @next/bundle-analyzerdan tambahkan script "analyze" untuk memeriksa ukuran chunk.
10. CI/CD dengan GitHub Actions + Vercel
Contoh workflow .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'
- run: npm ci
- run: npm run lint
- run: npm 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 }}
Pastikan VERCEL_TOKEN dan environment variables seperti DATABASE_URL telah diset di repository Settings → Secrets.
11. Best Practice Tambahan
- Type‑Safety: gunakan TypeScript di seluruh stack; tambahkan
strict" : trueditsconfig.json. - Linting & Formatting: konfigurasikan
.eslintrc.jsondenganextends: ["next", "next/core-web-vitals"]danprettieruntuk konsistensi kode. - Security: aktifkan
Content‑Security‑Policydinext.config.mjs, gunakanhelmetpada custom server jika diperlukan. - Monitoring: integrasikan dengan Vercel Analytics atau gunakan
next‑sentryuntuk error tracking. - Testing: pilih Jest + React Testing Library; contoh script
npm testmengeksekusijestdengan presetts-jest.
12. Deploy ke Vercel (atau alternatif)
Jika repository telah terhubung ke Vercel, push ke main otomatis memicu deployment. Untuk self‑hosted, jalankan:
npm run build
npm start
Gunakan pm2 start npm --name "next14" -- start untuk proses daemon.
Dengan mengikuti langkah‑langkah di atas, Anda dapat membangun aplikasi Next.js 14 modern yang memanfaatkan App Router, Server Actions, Prisma, dan NextAuth, sekaligus mengoptimalkan performa dan keamanan untuk produksi. Integrasi CI/CD via GitHub Actions memastikan rilis cepat dan terkontrol, sementara best practice yang diterapkan menjaga kualitas kode dalam jangka panjang.
Tutorial lengkap Next.js 14 dengan App Router, Server Actions, Prisma, NextAuth, CI/CD, dan optimasi production. Langkah demi langkah untuk developer modern.
Programming,Software Engineering,Web Development
#Programming #SoftwareEngineering #WebDev #Tech #Coding
0 Komentar