Artikel

Next.js SEO — rendering-strategier, Metadata API og App Router

Next.js understøtter Static Generation, SSR og ISR i samme app. App Router's Metadata API håndterer SEO-konfiguration per route med TypeScript-support. Rendering-strategi per side afgør crawlbarhed og performance.

Tre parallelle horisontale planer — abstrakt metafor for rendering-lag

Next.js er et React-framework der understøtter Static Generation (SSG), Server-Side Rendering (SSR) og Incremental Static Regeneration (ISR) i samme applikation. Det er det mest udbredte JavaScript-framework til produktionssites og understøtter komplekse applikationer med mixed rendering-strategier.

App Router Metadata API

App Router (Next.js 13+) introducerede Metadata API som den kanoniske måde at håndtere meta tags. I stedet for at manipulere <head> direkte eksporterer du et metadata-objekt fra route-filen:

// app/ordbog/[slug]/page.tsx
import type { Metadata } from 'next';

export async function generateMetadata({ params }): Promise<Metadata> {
  const article = await getArticle(params.slug);
  return {
    title: article.meta_title,
    description: article.meta_description,
    alternates: {
      canonical: `https://example.dk/ordbog/${params.slug}`,
    },
    openGraph: {
      title: article.meta_title,
      description: article.meta_description,
    },
  };
}

generateMetadata er async og kan hente data — det giver dynamiske meta tags baseret på CMS-indhold uden separate API-kald på klienten.

Rendering-strategi og SEO

Static Generation (SSG): generateStaticParams genererer alle mulige slug-varianter ved build-tid. Sider caches som statiske HTML-filer. Optimal performance, fuld crawlbarhed.

Incremental Static Regeneration (ISR): export const revalidate = 3600 sætter revalideringsinterval i sekunder. Sider er statiske men opdateres periodisk — godt til semi-dynamisk indhold.

Server-Side Rendering (SSR): export const dynamic = 'force-dynamic' tvinger SSR. Genererer HTML på server ved hvert request — relevant for realtidsdata men højere TTFB.

Sitemap-generering

// app/sitemap.ts
import { MetadataRoute } from 'next';

export default async function sitemap(): MetadataRoute.Sitemap {
  const articles = await getAllArticles();
  return articles.map(article => ({
    url: `https://example.dk/ordbog/${article.slug}`,
    lastModified: article.updated_at,
    changeFrequency: 'monthly',
    priority: article.tier === 'pillar' ? 1.0 : 0.8,
  }));
}

Server Components og SEO

App Router’s React Server Components sender ikke JavaScript til klienten for komponenter der ikke behøver interaktivitet. Det reducerer JavaScript-payload markant sammenlignet med Pages Router og bringer Next.js tættere på Astros performance-karakteristika for content-tunge sider.

Image-optimering og Core Web Vitals

next/image håndterer automatisk WebP-konvertering, responsive srcset og lazy loading. For SEO er det kritisk at LCP-elementet (typisk hero-billedet) ikke lazy-loades — brug priority prop på det primære billede:

import Image from 'next/image';

<Image
  src={article.heroImage}
  alt={article.heroAlt}
  width={1200}
  height={630}
  priority  // Preload LCP-element
/>

Uden priority på LCP-billedet er dårlige Core Web Vitals et forudsigeligt resultat. next/image without priority lazy-loader alle billeder som standard.

Robots.txt og OpenGraph

Next.js App Router har native support for robots.ts i app-mappen:

// app/robots.ts
export default function robots() {
  return {
    rules: { userAgent: '*', allow: '/' },
    sitemap: 'https://example.dk/sitemap.xml',
  };
}

OpenGraph-billeder genereres dynamisk via opengraph-image.tsx i App Router — nyttigt til automatisk genererede preview-billeder per artikel.

Hvornår Next.js er det rigtige valg til SEO

Next.js er det foretrukne valg når sitet kombinerer statisk og dynamisk indhold i samme applikation, teamet arbejder i React, eller ISR er en relevant strategi for semi-dynamiske sider. For ren statisk content (blog, dokumentation) er Astro typisk mere performant med lavere JavaScript-overhead. Next.js’s styrke er fleksibiliteten: SSG, SSR og ISR kan kombineres per route i samme app — ingen andre frameworks matcher denne fleksibilitet.

Deployment

Next.js er optimeret til Vercel-deployment, men kører på enhver Node.js-runtime. Cloudflare Pages og Netlify understøtter Next.js med edge-functions. Static export (output: 'export' i next.config.js) genererer ren statisk HTML uden runtime-afhængighed — men mister ISR og SSR-kapaciteter.

Andre artikler i samme emne

Ofte stillede spørgsmål

Hvad er forskellen på App Router og Pages Router i Next.js til SEO?
Pages Router (Next.js <13) brugte `next/head` til meta tags og `getStaticProps`/`getServerSideProps` til data fetching. App Router (Next.js 13+) introducerede Metadata API: du eksporterer et `metadata`-objekt eller `generateMetadata`-funktion fra hver route-fil — ingen manual `<head>`-manipulation. App Router er anbefalingen for nye projekter. Metadata API er mere præcis og understøtter TypeScript-autocomplete for alle meta-felter.
Hvad er Incremental Static Regeneration (ISR) og hvornår er det relevant til SEO?
ISR genererer sider statisk men revaliderer dem efter et defineret interval (sekunder). Eksempel: `export const revalidate = 3600` revaliderer siden maksimalt én gang i timen. Det giver statisk performance (cachet HTML fra edge) med periodisk opdatering af indhold — relevant for sider med indhold der ændrer sig men ikke realtids: nyhedssider, produkt-lagerstatus, blog-feeds. Fra et SEO-perspektiv er ISR overlegen over ren SSR fordi caching giver lavere TTFB.
Hvordan genererer man sitemap i Next.js App Router?
Next.js App Router har built-in sitemap support via `app/sitemap.ts`. Eksportér en funktion der returnerer et array af `MetadataRoute.Sitemap`-objekter: `{ url, lastModified, changeFrequency, priority }`. Next.js genererer automatisk `/sitemap.xml`. For dynamisk indhold (blog, e-commerce) henter sitemap-funktionen URL'er fra din datakilde. Alternativt kan `next-sitemap`-pakken bruges som en enklere løsning.
Hvad er Next.js's performance sammenlignet med Astro til SEO-orienterede sites?
For ren content-sites (blog, dokumentation, ordbog) sender Next.js mere JavaScript end Astro — React-runtime er altid inkluderet. Det giver typisk lavere Lighthouse Performance-score end et tilsvarende Astro-site. Next.js er det bedre valg når: (1) teamet allerede arbejder i React, (2) sitet har interaktive komponenter der nyder godt af React-modellen, (3) ISR er en relevant rendering-strategi for dele af sitet. For statiske content-sites uden React-afhængighed er Astro mere performant.
Hvad er de hyppigste SEO-fejl i Next.js-projekter?
De hyppigste SEO-fejl i Next.js App Router: (1) Manglende generateMetadata — uden den arver siden root layout's metadata og alle sider får samme title og description. (2) Client-side rendering af kritisk indhold via use client-komponenter — indhold der renderes client-side er ikke synligt i den serverede HTML. (3) Konflikt mellem robots.txt og robots metadata-feltet — brug Next.js Metadata API konsekvent. (4) Manglende next/image på LCP-elementer — next/image er ikke automatisk og ukomprimerede images er en hyppig årsag til dårlige Core Web Vitals.

Placering i ordbogen