Next.js 14 telah menjadi standar de‑facto untuk aplikasi React modern. Artikel ini memberikan tutorial step‑by‑step mulai dari instalasi, konfigurasi, hingga contoh kode Server Actions, lengkap dengan best practice untuk produksi.
1. Prasyarat dan Persiapan Lingkungan
Sebelum memulai, pastikan Anda memiliki:
- Node.js >= 20.10 (LTS) – unduh di nodejs.org
- Git terpasang
- Editor kode (VS Code direkomendasikan) dengan ekstensi ESLint dan Prettier
- Akun Vercel untuk deployment cepat
2. Instalasi Next.js 14
- Buatas folder proyek baru dan inisialisasi repo Git:
mkdir next14-demo && cd next14-demo git init - Jalankan
create‑next‑appdengan templateapp-router:
Pilih TypeScript saat prompt muncul untuk mendapatkan tipe yang kuat.npx create-next-app@latest . --experimental-app-router - Instal dependensi tambahan yang dibutuhkan untuk server actions dan image optimization:
npm install @next/third-parties next-auth@latest bcryptjs
3. Struktur Direktori Baru (App Router)
.
├─ app/
│ ├─ layout.tsx # Root layout dengan metadata global
│ ├─ page.tsx # Landing page
│ ├─ dashboard/
│ │ ├─ layout.tsx
│ │ └─ page.tsx
│ └─ api/
│ └─ auth/
│ └─ route.ts # Server Action untuk login
├─ public/
│ └─ favicon.ico
├─ styles/
│ └─ globals.css
├─ next.config.js
├─ tsconfig.json
└─ package.json
4. Konfigurasi next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
images: {
remotePatterns: [{
protocol: 'https',
hostname: '**',
}],
},
experimental: {
serverActions: true, // Aktifkan Server Actions
},
};
module.exports = nextConfig;
Konfigurasi di atas mengaktifkan mode strict React, SWC minify, dukungan gambar remote, dan fitur eksperimental serverActions yang sudah stabil di Next.js 14.
5. Membuat Layout Global dengan Metadata SEO
// app/layout.tsx
import './globals.css';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Next.js 14 Demo – Modern Web Development',
description: 'Tutorial step‑by‑step Next.js 14 dengan App Router, Server Actions, dan best practice 2026.',
keywords: ['Programming', 'Software Engineering', 'Web Development', 'Next.js', 'React'],
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
{children}
);
}
6. Implementasi Server Action – Login dengan bcrypt
Server Actions memungkinkan Anda menulis fungsi asynchronous yang dijalankan di server tanpa API route terpisah.
// app/api/auth/route.ts
'use server';
import { redirect } from 'next/navigation';
import bcrypt from 'bcryptjs';
import { cookies } from 'next/headers';
// Simulasi DB user (sebaiknya gunakan Prisma atau Drizzle dalam produksi)
const USERS = [{ email: 'admin@example.com', passwordHash: bcrypt.hashSync('P@ssw0rd!', 10) }];
export async function loginAction(formData: FormData) {
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const user = USERS.find(u => u.email === email);
if (!user) {
return { error: 'Email tidak terdaftar' };
}
const valid = await bcrypt.compare(password, user.passwordHash);
if (!valid) {
return { error: 'Password salah' };
}
// Simulasi token JWT sederhana
const token = Buffer.from(`${email}:auth`).toString('base64');
cookies().set('auth-token', token, { httpOnly: true, sameSite: 'lax', path: '/' });
redirect('/dashboard');
}
Catatan best practice: gunakan httpOnly cookie, panjang sameSite, dan enkripsi JWT dengan secret environment variable.
7. Membuat Form Login Menggunakan Server Action
// app/login/page.tsx
'use client';
import { useState } from 'react';
import { loginAction } from '../api/auth/route';
export default function LoginPage() {
const [error, setError] = useState('');
async function handleSubmit(event: React.FormEvent) {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const result = await loginAction(formData);
if (result?.error) setError(result.error);
}
return (
);
}
8. Dashboard yang Dilindungi (Middleware)
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('auth-token');
const url = request.nextUrl.clone();
if (!token && url.pathname.startsWith('/dashboard')) {
url.pathname = '/login';
return NextResponse.redirect(url);
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*'],
};
Middleware memastikan route sensitif hanya diakses bila token ada. Untuk production, verifikasi JWT dengan secret dan gunakan zod untuk schema validation.
9. Optimasi Gambar dengan @next/third-parties
// app/dashboard/page.tsx
import Image from 'next/image';
export default function Dashboard() {
return (
Selamat Datang di Dashboard
Gunakan komponen next/image untuk lazy‑loading otomatis dan format WebP modern.
);
}
10. CI/CD dengan GitHub Actions ke Vercel
# .github/workflows/deploy.yml
name: Deploy to Vercel
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20.x'
- run: npm ci
- run: npm run build --if-present
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
working-directory: .
prod: true
CI/CD otomatis memastikan setiap commit ke main ter‑deploy ke lingkungan produksi Vercel. Simpan token dan ID di GitHub Secrets.
11. Best Practice Tambahan untuk Produksi
- TypeScript Strict Mode: aktifkan
strict: trueditsconfig.jsonagar bug tipe terdeteksi dini. - Linting & Formatting: gunakan
eslint-config-nextbersama Prettier; jalankannpm run lint -- --fixdi pipeline. - Env Variable Management: simpan rahasia di Vercel Dashboard atau .env.production, dan akses via
process.env.NEXT_PUBLIC_*untuk variabel yang boleh di‑expose. - Performance Monitoring: integrasikan Vercel Analytics atau
@sentry/nextjsuntuk error tracking. - Security Headers: tambahkan header CSP, X‑Content‑Type‑Options, dan Referrer‑Policy lewat
next.config.jsatau middleware.
12. Testing dengan Playwright
// package.json (scripts)
"test:e2e": "playwright test",
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
test('user can login', async ({ page }) => {
await page.goto('/login');
await page.fill('input[name="email"]', 'admin@example.com');
await page.fill('input[name="password"]', 'P@ssw0rd!');
await page.click('button[type="submit"]');
await expect(page).toHaveURL('/dashboard');
});
Playwright memastikan UI login berfungsi di Chrome, Firefox, dan WebKit secara paralel.
13. Deploy dan Verifikasi
- Push kode ke GitHub
mainbranch. - GitHub Actions akan memicu workflow di atas.
- Setelah selesai, buka URL Vercel yang diberikan.
- Uji login, periksa cookie
auth-token, dan pastikan dashboard menampilkan gambar yang di‑optimasi.
Jika semua langkah berhasil, aplikasi Next.js 14 Anda siap dipakai oleh tim atau klien.
Dengan mengikuti tutorial ini, Anda tidak hanya menguasai setup Next.js 14 menggunakan App Router dan Server Actions, tetapi juga memahami alur CI/CD, keamanan, dan performa produksi. Kombinasi TypeScript, middleware, dan Vercel membuat stack modern yang scalable, aman, dan siap menghadapi tantangan Web Development di 2026. Selamat coding!
Tutorial lengkap Next.js 14 2026: instalasi, konfigurasi App Router, Server Actions, middleware, CI/CD, dan best practice untuk Web Development modern.
Programming,Software Engineering,Web Development,Next.js,React,Server Actions
#Programming #SoftwareEngineering #WebDev #Tech #Coding
0 Komentar