Next.js-integrationen
Installera Dynamic SEO-paketet i en Next.js-sajt med App Router, koppla den via next.config eller, med Cache Components, per sida, och läs verifieringssteget rätt.
Next.js är den andra plattformen du kan installera i dag. Paketet är en
nedladdning, kopplingen är en wrapper i next.config, och en fråga spelar roll:
om sajten kör Cache Components. Det avgör vilken av två vägar du tar.
Innan du börjar
Paketet finns inte på npm. Next.js-guiden på Integrera-sidan har nedladdningen, och dess steg är utskrivna med din egen domän och början av din site key. Allt här är samma guide, med resonemanget bifogat.
1. Ladda ner och installera
Lägg tarballen i ditt repo, till exempel under vendor/, och installera från
den sökvägen. En incheckad fil är det som överlever ett rent bygge hos din värd;
en länk till en fil som byts ut gör det inte.
npm install ./vendor/dynamic-seo-nextjs.tgz
2. Site key och de tre variablerna
Kopiera nyckeln från steg 2 i guiden. Den ska in i .env lokalt och i värdens
miljövariabler för produktion, tillsammans med edge-workerns adress och din
domän som den är registrerad i Dynamic SEO:
DYNAMIC_SEO_WORKER_URL=https://seo.dynamicseo.com
DYNAMIC_SEO_DOMAIN=example.com
DYNAMIC_SEO_SITE_KEY=sk_...
Workern är samma kant som WordPress-pluginet pratar med. En Next.js-sajt dyker därför upp i Leverans-kortet på samma sätt.
Gör en ny deploy när du har ändrat en variabel, den gäller först när sajten byggs om. Vercel sparar variabler för produktion som känsliga, så de ser tomma ut om du läser tillbaka dem. Om nyckeln stämmer ser du i stället i appens verifieringssteg, som visar början på nyckeln som skickas bredvid sajtens egen.
3. Välj väg
Utan Cache Components (de flesta sajter, även next-intl och statiska
eller ISR-sajter): omslut next.config. Det är hela kopplingen: ingen proxy,
ingen ändring i layouten, inget mer att installera.
// next.config.ts
import { withDynamicSEO } from '@dynamic-seo/middleware/nextjs/config'
const nextConfig = { /* din konfiguration */ }
export default withDynamicSEO({
apiUrlEnv: 'DYNAMIC_SEO_WORKER_URL',
domainEnv: 'DYNAMIC_SEO_DOMAIN',
siteKeyEnv: 'DYNAMIC_SEO_SITE_KEY',
})(nextConfig)
Omsluter du redan next.config med next-intl eller MDX: lägg den här ytterst,
withDynamicSEO({...})(withNextIntl(nextConfig)).
Har sajten inloggade sidor under app/, till exempel en dashboard, avgränsa
wrappern med include så att bara de publika sidorna omsluts. För en route
group som heter (marketing): include: [/\(marketing\)[\\/]/].
Vid bygget omsluter wrappern varje sidas generateMetadata, i vilken form
sidan än exporterar den, och lägger det du publicerar över din egen metadata.
Det du inte har publicerat behåller ditt värde. Sidans sökväg är dess egen
canonical på din domän, så ett standardspråk utan prefix och översatta
sökvägar matchar båda den publika adress crawlern har sparat. Layouter lämnas
orörda. Sidorna förblir statiska och byggs om var femte minut, så en
publicering syns inom ungefär fem minuter. Svarar inte kanten under ett
bygge visas din egen metadata, och sidan försöker igen vid nästa ombyggnad.
Samma sak gäller strukturerad data. Wrappern hittar din JSON-LD-komponent,
det vill säga en fil som renderar <script type="application/ld+json"> och
exporterar en komponent vars namn slutar på JsonLd. Den lägger det du
publicerar över dina entiteter, typ för typ. Ett @graph förblir en
sammanhängande graf med dina egna @id, och typer du inte har läggs till i den.
Med Cache Components (cacheComponents: true i next.config): wrappern
lämnar din konfiguration orörd och säger det i bygg-loggen, eftersom en
ocachad hämtning i generateMetadata fäller ett sådant bygge. Lägg i stället
den publicerade SEO:n över varje sidas egen metadata. Sökvägen
kommer ur sidans params, hämtningen ligger bakom use cache, och det statiska
skelettet förrenderas med taggarna i:
// lib/dynamicseo.ts
import type { Metadata } from 'next'
import { cacheLife } from 'next/cache'
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 withDynamicSeo(path: string, fallback: Metadata): Promise<Metadata> {
'use cache'
cacheLife('minutes')
return dseo.metadata(path, fallback)
}
// app/[slug]/page.tsx, och samma sak i varje sida som har metadata
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params
return withDynamicSeo(`/${slug}`, { title: 'Din egen titel' })
}
När inget är publicerat för en sökväg är det reserven som renderas.
4. Verifiera, och vad svaret betyder
Verifieringssteget frågar kanten efter din startsida med din site key, från vår sida. Tre svar är möjliga:
- Verifierad: kanten levererade publicerat innehåll för startsidan. Kedjan är igång.
- Nyckeln fungerar, inget publicerat än: kanten svarade, men inget är publicerat för startsidan. Det är det normala läget direkt efter installationen. Publicera en sida och kör provet igen.
- Nyckeln avvisad: nyckeln din installation skickar är inte sajtens aktuella. Kopiera den aktuella från guiden, eller regenerera och uppdatera varje installation.
Ovanför knappen säger steget också vad din egen sajt har gjort: om den har anropat kanten, hur många anrop det senaste dygnet som fick innehåll, och när den senast sågs. Det är serve-loggen, samma siffror som Leverans-kortet på dashboarden, så en fungerande installation läses som fungerande innan något är publicerat.
Var du letar när en sida inte ändras
Gå baklänges. Publicerades det för mindre än fem minuter sedan? Då har sidan
inte byggts om än. Är något publicerat för den sökvägen? Fick din deploy med sig
miljövariablerna? Innehåller sidans head
<meta name="dynamic-seo" content="active">? Den taggen skrivs på varje
levererat svar, så saknas den fick anropet aldrig innehåll, och Leverans-kortet
säger varför.
Läs vidare
URL:er och mappning