Nytt: Plug-and-Play Next.js-integration för Dynamic SEO
Dynamic SEOs Next.js App Router-integration är en trestegsintegration som fungerar direkt från din layout. Inga sidspecifika ändringar, ingen build-time-datahämtning – bara serverrenderad SEO-metadata som håller sig synkad med din dashboard.
Att hantera SEO-metadata i Next.js har alltid inneburit kompromisser. Antingen konfigurerar du varje sida individuellt med generateMetadata, eller så installerar du ett paket som ändå kräver setup per route. Båda tillvägagångssätten binder SEO-konfigurationen till din kodbas, vilket innebär att varje metadata-ändring kräver en kodändring, en granskning och en deployment.
Dynamic SEO erbjuder nu en annan väg. Vår nya Next.js App Router-integration låter dig hantera all SEO-metadata från Dynamic SEO-dashboarden och få den serverrenderad på dina sidor – utan att modifiera enskilda routes. Setupen tar tre steg, alla i befintliga filer, och resultatet är produktionsklar SEO som ditt marknadsteam kan uppdatera utan att skapa en pull request.
Det här inlägget förklarar hur integrationen fungerar, vad den gör under huven och hur du sätter upp den.
Tidig tillgång: Dynamic SEO är för närvarande i early access. Next.js-integrationen som beskrivs här är tillgänglig för early-access-team – gå med i väntelistan för att få tillgång.
Utmaningen: SEO i Next.js App Router
Next.js App Router introducerade en fundamentalt annorlunda renderingsmodell. Server Components körs på servern och streamar HTML till klienten. Layouts omsluter sidor men renderas inte om vid navigering. Middleware körs på edge innan rendering börjar men kan inte modifiera response-kroppen.
Den här arkitekturen är utmärkt för prestanda. Den är mindre tillmötesgående för SEO-verktyg som behöver fånga upp och modifiera HTML-svar.
Varför traditionella tillvägagångssätt inte räcker till
Det vanligaste mönstret för dynamisk SEO i Next.js är funktionen generateMetadata, som exporteras från varje sid- eller layout-fil. Den fungerar bra för en handfull sidor med förutsägbar metadata. Den skalar inte när du har hundratals URL:er som hanteras av ett icke-tekniskt team.
// Standardmetoden: en funktion per route
export async function generateMetadata({ params }) {
// Du behöver detta i varje sidfil
// Ändringar kräver kodändringar och omdeployment
const seo = await fetchSEOData(params.slug)
return {
title: seo.title,
description: seo.description,
}
}
Paket som next-seo minskar boilerplate men kräver fortfarande konfigurationsobjekt per sida. Den grundläggande begränsningen kvarstår: metadata definieras i kod, deployas med kod och styrs av ditt utvecklingsarbetsflöde.
För team där SEO hanteras av marknadsstrateger eller innehållsansvariga skapar detta en flaskhals. Varje justering av en title-tagg blir en Jira-biljett.
Varför middleware ensamt inte räcker
I Express eller Fastify kan du skriva middleware som modifierar response-kroppen innan den når klienten. Next.js middleware stödjer medvetet inte detta. Det kan skriva om URL:er, sätta headers och omdirigera requests, men det kan inte ändra den HTML som streamas till webbläsaren.
Detta är ett medvetet designbeslut från Next.js-teamet – streaming-svar kan inte buffras och modifieras utan att offra prestandafördelarna med streaming i sig. Alla SEO-integrationer för Next.js måste arbeta inom denna begränsning, inte mot den.
Vår lösning: DynamicSEOHead
Dynamic SEOs Next.js-integration använder en Server Component kallad DynamicSEOHead som renderar meta-taggar direkt i din layout. Next.js hissar automatiskt alla <title>-, <meta>- och <link>-element som renderas av Server Components till dokumentets <head>, oavsett var de dyker upp i komponentträdet.
Det innebär att en enda komponent i din root-layout kan styra all SEO-metadata för varje sida den omsluter – utan att röra enskilda sidfiler.
Komponenten hämtar SEO-konfigurationen från Dynamic SEOs API vid renderingstillfället, löser korrekt metadata för den aktuella URL:en och returnerar lämpliga taggar. Eftersom den körs som en Server Component inkluderas metadatan i det initiala HTML-svaret. Sökmotorer ser fullt renderade meta-taggar vid första requesten, helt utan klientsidans JavaScript.
Trestegssetup
Hela integrationen kräver ändringar i tre filer, varav två är enradsändringar.
Steg 1: Installera paketet
Paketet finns inte på npm. Ladda ner det från Next.js-guiden på Integrera-sidan i din dashboard, lägg det i ditt repo och installera från den sökvägen:
npm install ./vendor/dynamic-seo-nextjs.tgz
Det levereras som TypeScript-källa, så be Next kompilera det. Det är den enda rad varje konsument behöver i next.config.ts:
const nextConfig = { transpilePackages: ['@dynamic-seo/middleware'] }
export default nextConfig
Steg 2: Lägg till proxyn
Next 16 döpte om filkonventionen middleware till proxy. Skapa proxy.ts i projektroten (i Next 15 och tidigare middleware.ts, exporterad as middleware):
// proxy.ts
export { dynamicSEOMiddleware as proxy } from '@dynamic-seo/middleware/nextjs'
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico|api/).*)'],
}
Proxyn sätter ett enda request-huvud, den aktuella sökvägen, så att layout-komponenten vet vilken sida den renderar. Har du redan en proxy: omslut den med withDynamicSEO i stället för att exportera vår.
Den lägger till försumbar latens. Det är en lättviktig genomströmning som inte gör några externa anrop.
Steg 3: Lägg till DynamicSEOHead i din layout
// app/layout.tsx (eller en marknadsföringsspecifik layout)
import { DynamicSEOHead } from '@dynamic-seo/middleware/nextjs'
export default function RootLayout({ children }) {
return (
<html lang="sv">
<body>
{children}
<DynamicSEOHead
apiUrl={process.env.DYNAMIC_SEO_WORKER_URL!}
domain={process.env.DYNAMIC_SEO_DOMAIN!}
siteKey={process.env.DYNAMIC_SEO_SITE_KEY}
/>
</body>
</html>
)
}
De tre miljövariablerna är edge-workerns adress, din domän som den är registrerad i Dynamic SEO och site key från Integrera-sidan. Guiden skriver ut dem ifyllda för din sajt.
Det är hela setupen. Varje sida som renderas inom denna layout får sin SEO-metadata hämtad från Dynamic SEO och renderad som serverside HTML.
Så fungerar det
Integrationen arbetar i bakgrunden under serverside-rendering. När en sida begärs frågar layout-komponenten edge-workern efter den publicerade SEO:n för sökvägen och renderar den som en del av HTML-svaret. Next.js inkluderar automatiskt taggarna i dokumentets head. När inget är publicerat för sökvägen renderar komponenten ingenting, och dina egna taggar står kvar.
Hämtningen lägger till försumbar latens till renderingen. Workern svarar ur sin edge-cache, och Next cachar hämtningen under det revalidate-fönster du konfigurerar, så efterföljande requests för samma URL gör inget anrop alls.
Komponentens props och konfiguration
DynamicSEOHead accepterar flera props för att styra sitt beteende:
<DynamicSEOHead
apiUrl="https://seo.dynamicseo.com" // Obligatorisk. Edge-workern.
domain="example.com" // Obligatorisk. Domänen som den är registrerad i Dynamic SEO.
siteKey="sk_..." // Din site key, skickas som X-Site-Key. Sätt den i produktion.
revalidate={300} // Valfri. Revalidering av hämtningen i sekunder. Standard: 300.
timeout={2000} // Valfri. Tidsgräns för hämtningen i millisekunder. Standard: 2000.
skipPaths={['/admin', '/api']} // Valfri. Sökvägar att exkludera från SEO-injicering.
/>
Cachning
Propen revalidate styr hur länge Next cachar hämtningen. Standardvärdet 300 innebär att SEO:n för en given URL hämtas om högst en gång var femte minut. Workern framför den har sin egen edge-cache, som publicering tömmer, så en ändring du publicerar når nästa ocachade rendering.
Sökvägsexkludering
Propen skipPaths accepterar en array av sökvägsprefix. Alla URL:er som börjar med ett listat prefix hoppas över helt – inget API-anrop görs och ingen metadata injiceras. Detta är användbart för adminpaneler, API-routes, autentiseringssidor och alla routes där du vill ha full kontroll över metadatan i kod.
Automatisk säkerhet
Alla metadatavärden saneras automatiskt innan rendering. Detta är inte valbart eller konfigurerbart – det körs på varje svar.
Avancerad användning
Medan layout-nivå-setupen täcker majoriteten av användningsfallen exporterar paketet också utilities för team som behöver kontroll per sida.
Sidspecifik override med generateMetadata
Om en specifik sida behöver sammanfoga Dynamic SEO-data med lokal metadata, använd createDynamicSEO. Dess metod metadata hämtar den publicerade SEO:n för en sökväg och lägger den över den reserv du skickar in, som är det sidan behåller när inget är publicerat:
// app/products/[slug]/page.tsx
import { createDynamicSEO } from '@dynamic-seo/middleware/nextjs'
const dseo = createDynamicSEO({
apiUrl: process.env.DYNAMIC_SEO_WORKER_URL!,
domain: process.env.DYNAMIC_SEO_DOMAIN!,
siteKey: process.env.DYNAMIC_SEO_SITE_KEY,
})
export async function generateMetadata({ params }) {
const { slug } = await params
return dseo.metadata(`/products/${slug}`, {
title: 'Produkter',
openGraph: { images: [{ url: `/og/products/${slug}.png` }] },
})
}
När du använder createDynamicSEO på sidnivå, se till att ta bort DynamicSEOHead från layouten som omsluter den sidan, eller använd skipPaths för att exkludera den. Duplicerade metadata-taggar försämrar SEO snarare än förbättrar det.
Sammanfoga metadata från flera källor
Hjälpfunktionen mergeMetadata kombinerar metadata-objekt med förutsägbar prioritet:
import { mergeMetadata } from '@dynamic-seo/middleware/nextjs'
export async function generateMetadata({ params }) {
const { slug } = await params
const seo = await dseo.fetchSEO(`/products/${slug}`)
const localMeta = {
title: `${slug} | Produkter`,
robots: { index: true, follow: true },
}
// den publicerade SEO:n har prioritet; localMeta fyller luckor, och är allt som finns tills något är publicerat
return seo ? mergeMetadata(seo, localMeta) : localMeta
}
Dynamic SEO-metadata integreras sömlöst med all befintlig Next.js-metadata du har definierat. Dynamic SEO-dashboarden är sanningens källa, och lokala värden fungerar som fallbacks.
Varför inga sidspecifika ändringar behövs
Detta är det centrala designbeslutet och värdigt att förklara i detalj.
Traditionella Next.js SEO-arbetsflöden kräver att man rör varje sidfil eftersom metadata-generering är samlokaliserad med sidkomponenten. App Router förstärkte detta mönster med generateMetadata – ett rent API, men ett som distribuerar SEO-konfigurationen över hela din route-struktur.
Dynamic SEO tar positionen att SEO-konfiguration bör vara centraliserad. Ditt utvecklingsteam behöver inte veta vad title-taggen för /products/vandringsskor säger. De behöver veta att SEO-metadata kommer från dashboarden, och att integrationen hanterar leveransen.
Genom att placera DynamicSEOHead i layouten etablerar du en enda integrationspunkt. Att lägga till nya sidor i din applikation ärver automatiskt SEO-hantering – ingen ytterligare koppling krävs. Att ta bort sidor tar bort dem från hanteringen automatiskt vid nästa crawl-cykel. SEO-lagret följer webbplatsen, inte koden.
Detta eliminerar också en klass av buggar där en utvecklare glömmer att lägga till generateMetadata på en ny sida, eller kopierar metadata från en annan sida och glömmer uppdatera den. Om sidan existerar och layouten omsluter den så hanteras SEO.
Jämförelse med andra tillvägagångssätt
next-seo
Paketet next-seo tillhandahåller React-komponenter för att sätta meta-taggar. Det kräver att du lägger till <NextSeo> på varje sida med ett konfigurationsobjekt. Metadata lever i dina komponentfiler, ändringar kräver deployments, och det finns inget externt hanteringsgränssnitt. Det är ett bra bibliotek för utvecklarstyrd SEO på mindre webbplatser. Det adresserar inte arbetsflödesproblemet för icke-tekniska team som hanterar metadata i stor skala.
Manuell generateMetadata med ett CMS
Vissa team hämtar SEO-metadata från sitt CMS i generateMetadata. Detta fungerar men skapar en tät koppling mellan ditt CMS innehållsmodell och Next.js metadata-format. Du behöver transformeringslogik i varje sidfil, felhantering för saknade CMS-poster och en innehållsmodell som mappar till hela spännvidden av meta-taggar, Open Graph-egenskaper och strukturerad data-typer som SEO kräver. Dynamic SEO hanterar denna mappning internt, med ett ändamålsbyggt gränssnitt för SEO snarare än ett generellt CMS.
Head-hanteringsbibliotek
Bibliotek som react-helmet (för Pages Router) eller manuell <head>-manipulation är inte kompatibla med App Routers streaming-arkitektur. De förlitar sig på klientsidans DOM-manipulation, vilket innebär att sökmotorernas crawlers kanske inte ser metadatan vid den initiala renderingen. Server Components löser detta på ramverksnivå, och DynamicSEOHead bygger på den grunden.
Deployment-kompatibilitet
Middlewaret och DynamicSEOHead-komponenten är runtime-agnostiska. De körs på vilken Node.js- eller edge-runtime som helst som stödjer Next.js App Router – managed hosting-plattformar, edge-nätverk eller en självhostad Node-server. ISR stöds via Next.js standard-revalideringsAPI; edge-runtime-mål kan byta cache-adapter med adaptern som ingår i paketet.
Komponenten är en standard React Server Component som gör ett fetch-anrop. Alla plattformar som stödjer Next.js App Router stödjer integrationen.
Vad integrationen inte gör
Transparens om omfattning förebygger felaktiga förväntningar.
Integrationen hanterar metadata – title-taggar, meta-beskrivningar, kanoniska URL:er, Open Graph-taggar, Twitter-kort, strukturerad data (JSON-LD) och anpassade meta-taggar. Den modifierar inte sidinnehåll, injicerar inte synliga element, ändrar inte din CSS eller lägger till klientsidans JavaScript.
Den ersätter inte din sitemap. Dynamic SEO har separat verktyg för sitemap-generering, men Next.js-integrationen fokuserar uteslutande på metadata-leverans.
Den hanterar inte omdirigeringar. Next.js har sitt eget omdirigeringssystem i next.config.js och middleware. Att blanda omdirigeringslogik med SEO-metadata-injicering skulle skapa felsökningskomplexitet utan meningsfull nytta.
Vad som kommer härnäst
React Server Components gör detta integrationsmönster möjligt. Förmågan att köra serverside datahämtning inuti en komponent som renderar till den initiala HTML-streamen – utan klientsidans hydration – är det som tillåter en enda layout-komponent att hantera SEO för en hel webbplats.
Vi förväntar oss att detta mönster blir vanligare i React-ekosystemet. Remix har redan liknande primitiver genom sitt loader-system. SvelteKit och Nuxt har sina egna motsvarigheter. När ramverk konvergerar mot server-first-rendering blir argumenten för centraliserad, extern SEO-hantering starkare.
På vår sida inkluderar roadmapen A/B-testning för metadata (servera olika titlar till olika segment och mät klickfrekvenser), realtidsförhandsvisning i dashboarden som visar exakt hur dina sidor kommer att visas i sökresultat efter en metadata-ändring, och tätare integration med Dynamic SEOs crawl-motor för att automatiskt upptäcka nya sidor och föreslå metadataregler.
Next.js-integrationen är tillgänglig nu. Ladda ner paketet från Integrera-sidan, lägg till tre rader konfiguration och flytta SEO-hanteringen ut ur din kodbas och in i händerna på de som hanterar den.