BLOG — SEO & DEVELOPMENT
Next.js heeft uitstekende SEO-mogelijkheden ingebouwd. Maar je moet ze wel goed inzetten. In dit artikel doorlopen we elke stap — van metadata tot structured data.
Metadata is de basis van SEO in Next.js. De App Router biedt een krachtig systeem via de generateMetadata functie. Elke pagina kan zijn eigen title, description en Open Graph tags definiëren.
import type { Metadata } from 'next'
export async function generateMetadata(): Promise<Metadata> {
return {
title: 'Mijn pagina — Mijn Site',
description: 'Een korte beschrijving voor zoekmachines.',
openGraph: {
title: 'Mijn pagina — Mijn Site',
description: 'Een korte beschrijving.',
type: 'article',
},
}
}Pro tip: gebruik een title template in je root layout zodat je niet overal ' | Mijn Site' hoeft te herhalen:
// app/layout.tsx
export const metadata: Metadata = {
title: {
template: '%s | Mijn Site',
default: 'Mijn Site',
},
}Vergeet alternates niet voor meertalige sites. Dit vertelt Google welke taalversies er bestaan:
alternates: {
canonical: 'https://example.com/nl/pagina',
languages: {
nl: 'https://example.com/nl/pagina',
en: 'https://example.com/en/page',
},
}Een sitemap vertelt zoekmachines welke pagina's je site heeft. Next.js ondersteunt dit native via een sitemap.ts bestand:
// app/sitemap.ts
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{
url: 'https://example.com',
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 1,
},
]
}Voor robots.txt maak je een soortgelijk bestand:
// app/robots.ts
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
},
sitemap: 'https://example.com/sitemap.xml',
}
}Beide bestanden worden automatisch gegenereerd als /sitemap.xml en /robots.txt wanneer je de site bouwt.
Structured data helpt Google je content beter te begrijpen en kan resulteren in rich snippets — verrijkte zoekresultaten met sterren, FAQ-dropdowns, of breadcrumbs.
Het meest voorkomende formaat is JSON-LD. In Next.js voeg je dit toe als een script-tag:
function FAQSchema({ items }: { items: { q: string; a: string }[] }) {
const schema = {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: items.map((item) => ({
'@type': 'Question',
name: item.q,
acceptedAnswer: {
'@type': 'Answer',
text: item.a,
},
})),
}
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
)
}Andere nuttige schema types: Article (voor blogposts), Organization (voor je bedrijfspagina), BreadcrumbList (voor navigatie), en HowTo (voor tutorials).
Google gebruikt Core Web Vitals als rankingfactor. De drie metrics die ertoe doen:
Hoe snel laadt het grootste element op de pagina? Doel: onder 2.5 seconden. Gebruik next/image voor automatische optimalisatie van afbeeldingen.
Hoe snel reageert de pagina op interactie? Doel: onder 200ms. Minimaliseer client-side JavaScript en gebruik Server Components waar mogelijk.
Verspringt de layout tijdens het laden? Doel: onder 0.1. Geef altijd width en height mee aan afbeeldingen, en laad fonts via next/font.
Next.js helpt je bij elk van deze punten: next/image optimaliseert afbeeldingen automatisch, next/font voorkomt layout shifts bij fonts, en Server Components reduceren de JavaScript-bundle.
import Image from 'next/image'
import { GeistSans } from 'geist/font/sans'
// Geoptimaliseerde afbeelding
<Image
src="/hero.jpg"
alt="Hero afbeelding"
width={1200}
height={630}
priority
/>
// Font zonder layout shift
<body className={GeistSans.className}>De App Router van Next.js gebruikt standaard Server Components. Dit is een groot voordeel voor SEO om twee redenen:
Ten eerste: Server Components renderen op de server. Google ziet de volledige HTML zonder JavaScript uit te hoeven voeren. Dit is betrouwbaarder dan client-side rendering waar Googlebot de JavaScript moet uitvoeren.
Ten tweede: Server Components sturen geen JavaScript naar de browser. Minder JavaScript = snellere pagina = betere Core Web Vitals = hogere ranking.
Vuistregel: maak alles een Server Component tenzij je interactiviteit nodig hebt (formulieren, dropdowns, animaties). Markeer alleen die componenten met 'use client'.
// Server Component (standaard) — goed voor SEO
export default async function BlogPost() {
const post = await getPost()
return <article>{post.content}</article>
}
// Client Component — alleen voor interactiviteit
'use client'
export function ContactForm() {
const [name, setName] = useState('')
return <form>...</form>
}Traditionele SPAs die volledig op client-side rendering draaien zijn lastiger voor SEO — Google moet JavaScript uitvoeren om de content te zien. Next.js lost dit op met Server Components en SSR: de HTML wordt op de server gerenderd, waardoor zoekmachines de content direct kunnen indexeren.
Gebruik SSG (Static Site Generation) voor content die niet vaak verandert — blogposts, landingspagina's, documentatie. Gebruik SSR (Server-Side Rendering) voor content die per request kan verschillen — gepersonaliseerde pagina's, zoekresultaten. In Next.js kun je dit per pagina kiezen.
Gebruik Google Search Console voor indexeringsstatus en zoekprestaties. Lighthouse (in Chrome DevTools) meet Core Web Vitals. En Google's Rich Results Test controleert je structured data. Test altijd op een productie-build (next build + next start), niet op de dev server.
We helpen developers en bedrijven met technische SEO-implementatie in Next.js. Van audit tot implementatie.