Metadata Object and generateMetadata Options
Bu sayfa, generateMetadata
ve statik meta veri nesnesi ile tüm Yapılandırma tabanlı Met a Veri seçeneklerini kapsar.
import { Metadata } from 'next'
// either Static metadata
export const metadata: Metadata = {
title: '...',
}
// or Dynamic metadata
export async function generateMetadata({ params }) {
return {
title: '...',
}
}
Bildiğim iyi oldu:
metadata
nesnesi vegenerateMetadata
işlev dışa aktarımları yalnızca Sunucu Bileşenlerinde desteklenir.- Aynı rota segmentinden hem
metadata
nesnesini hem degenerateMetadata
işlevini dışa aktaramazsınız.
The metadata
object
Statik meta verileri tanımlamak için, layout.js
veya page.js
dosyasından bir Metadata
nesnesini dışa aktarın.
import { Metadata } from 'next'
export const metadata: Metadata = {
title: '...',
description: '...',
}
export default function Page() {}
Desteklenen seçeneklerin tam listesi için Meta Veri Alanları bölümüne bakın.
generateMetadata
function
Dinamik meta veriler, geçerli rota parametreleri, harici veriler veya üst segmentlerdeki metadata
gibi dinamik bilgilere bağlıdır ve bir Metadata
nesnesi döndüren bir generateMetadata
işlevi dışa aktarılarak ayarlanabilir.
import { Metadata, ResolvingMetadata } from 'next'
type Props = {
params: { id: string }
searchParams: { [key: string]: string | string[] | undefined }
}
export async function generateMetadata(
{ params, searchParams }: Props,
parent: ResolvingMetadata
): Promise<Metadata> {
// read route params
const id = params.id
// fetch data
const product = await fetch(`https://.../${id}`).then((res) => res.json())
// optionally access and extend (rather than replace) parent metadata
const previousImages = (await parent).openGraph?.images || []
return {
title: product.title,
openGraph: {
images: ['/some-specific-page-image.jpg', ...previousImages],
},
}
}
export default function Page({ params, searchParams }: Props) {}
Parameters
generateMetadata
fonksiyonu aşağıdaki parametreleri kabul eder:
-
props
- Geçerli rotanın parametrelerini içeren bir nesne:-
params
- Kök segmenttengenerateMetadata
adresinden çağrılan segmente kadar dinamik rota parametreleri nesnesini içeren bir nesne. Örnekler:Rota URL params
app/shop/[slug]/page.js
/shop/1
{ slug: '1' }
app/shop/[tag]/[item]/page.js
/shop/1/2
{ tag: '1', item: '2' }
app/shop/[...slug]/page.js
/shop/1/2
{ slug: ['1', '2'] }
-
searchParams
- Geçerli URL'nin arama parametrelerini içeren bir nesne . Örnekler:URL searchParams
/shop?a=1
{ a: '1' }
/shop?a=1&b=2
{ a: '1', b: '2' }
/shop?a=1&a=2
{ a: ['1', '2'] }
-
-
parent
- Üst rota segmentlerinden çözümlenmiş meta verilerin bir sözü.
Returns
generateMetadata
bir veya daha fazla meta veri alanı içeren bir Metadata
nesnesi döndürmelidir.
Bildiğim iyi oldu:
- Meta veriler çalışma zamanı bilgilerine bağlı değilse,
generateMetadata
yerine statikmetadata
nesnesi kullanılarak tanımlanmalıdır.fetch
generateMetadata
,generateStaticParams
, Düzenler, Sayfalar ve Sunucu Bileşenleri arasında aynı veriler için istekler otomatik olarak not edilir.fetch
kullanılamıyorsa Reactcache
kullanılabilir.searchParams
yalnızcapage.js
segmentlerinde mevcuttur.- Bu
redirect()
venotFound()
Next.js yöntemlerigenerateMetadata
içinde de kullanılabilir.
Metadata Fields
title
title
niteliği, belgenin başlığını ayarlamak için kullanılır. Basit bir dize veya isteğe bağlı bir şablon nesnesi olarak tanımlanabilir.
String
export const metadata = {
title: 'Next.js',
}
<title>Next.js</title>
Template object
import { Metadata } from 'next'
export const metadata: Metadata = {
title: {
template: '...',
default: '...',
absolute: '...',
},
}
Default
title.default
bir title
tanımlamayan alt rota segmentlerine geri dönüş başlığı sağlamak için kullanılabilir.
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: {
default: 'Acme',
},
}
import type { Metadata } from 'next'
export const metadata: Metadata = {}
// Output: <title>Acme</title>
Template
title.template
alt rota segmentlerinde tanımlanan titles
adresine bir önek veya sonek eklemek için kullanılabilir.
import { Metadata } from 'next'
export const metadata: Metadata = {
title: {
template: '%s | Acme',
default: 'Acme', // a default is required when creating a template
},
}
import { Metadata } from 'next'
export const metadata: Metadata = {
title: 'About',
}
// Output: <title>About | Acme</title>
Bildiğim iyi oldu:
title.template
tanımlandığı segment için değil, alt rota segmentleri için geçerlidir. Bu şu anlama gelir:
title.default
birtitle.template
eklediğinizde gereklidir.title.template
layout.js
içinde tanımlanan, aynı rota segmentininpage.js
içinde tanımlanan birtitle
için geçerli olmayacaktır.title.template
page.js
adresinde tanımlanan bir sayfa her zaman sonlandırıcı segment olduğundan (herhangi bir alt rota segmenti yoktur) hiçbir etkisi yoktur.
title.template
bir rota birtitle
veyatitle.default
tanımlamamışsa hiçbir etkisi yoktur.
Absolute
title.absolute
üst segmentlerde ayarlanan title.template
adresini yok sayan bir başlık sağlamak için kullanılabilir.
import { Metadata } from 'next'
export const metadata: Metadata = {
title: {
template: '%s | Acme',
},
}
import { Metadata } from 'next'
export const metadata: Metadata = {
title: {
absolute: 'About',
},
}
// Output: <title>About</title>
Bildiğim iyi oldu:
layout.js
title
(string) vetitle.default
alt segmentler için varsayılan başlığı tanımlar (kendititle
'larını tanımlamayan). Varsa,title.template
adresini en yakın üst segmentten artıracaktır.title.absolute
alt segmentler için varsayılan başlık tanımlar. Ana segmentlerden gelentitle.template
adresini yok sayar.title.template
Alt segmentler için yeni bir başlık şablonu tanımlar.
page.js
- Bir sayfa kendi başlığını tanımlamazsa, en yakın ebeveyn tarafından çözümlenmiş başlık kullanılır.
title
(string) rotaların başlığını tanımlar. Varsa,title.template
adresini en yakın üst segmentten artıracaktır.title.absolute
rota başlığını tanımlar. Ana segmentlerdentitle.template
'u yok sayar.title.template
page.js
'da hiçbir etkisi yoktur çünkü bir sayfa her zaman bir rotanın sonlandırıcı segmentidir.
description
export const metadata = {
description: 'The React Framework for the Web',
}
<meta name="description" content="The React Framework for the Web" />
Basic Fields
export const metadata = {
generator: 'Next.js',
applicationName: 'Next.js',
referrer: 'origin-when-cross-origin',
keywords: ['Next.js', 'React', 'JavaScript'],
authors: [{ name: 'Seb' }, { name: 'Josh', url: 'https://nextjs.org' }],
creator: 'Jiachi Liu',
publisher: 'Sebastian Markbåge',
formatDetection: {
email: false,
address: false,
telephone: false,
},
}
<meta name="application-name" content="Next.js" />
<meta name="author" content="Seb" />
<link rel="author" href="https://nextjs.org" />
<meta name="author" content="Josh" />
<meta name="generator" content="Next.js" />
<meta name="keywords" content="Next.js,React,JavaScript" />
<meta name="referrer" content="origin-when-cross-origin" />
<meta name="color-scheme" content="dark" />
<meta name="creator" content="Jiachi Liu" />
<meta name="publisher" content="Sebastian Markbåge" />
<meta name="format-detection" content="telephone=no, address=no, email=no" />
metadataBase
metadataBase
tam nitelikli URL gerektiren metadata
alanları için bir temel URL öneki ayarlamaya yönelik bir kolaylık seçeneğidir.
metadataBase
geçerli rota segmentinde ve altında tanımlanan URL tabanlımetadata
alanlarının, aksi takdirde gerekli olan mutlak URL yerine göreli bir yol kullanmasına olanak tanır.- Alanın göreli yolu, tam nitelikli bir URL oluşturmak için
metadataBase
ile oluşturulacaktır. - Yapılandırılmamışsa,
metadataBase
otomatik olarak varsayılan bir değerle doldurulur.
export const metadata = {
metadataBase: new URL('https://acme.com'),
alternates: {
canonical: '/',
languages: {
'en-US': '/en-US',
'de-DE': '/de-DE',
},
},
openGraph: {
images: '/og-image.png',
},
}
<link rel="canonical" href="https://acme.com" />
<link rel="alternate" hreflang="en-US" href="https://acme.com/en-US" />
<link rel="alternate" hreflang="de-DE" href="https://acme.com/de-DE" />
<meta property="og:image" content="https://acme.com/og-image.png" />
Bildiğim iyi oldu:
metadataBase
genellikle tüm rotalarda URL tabanlımetadata
alanlarına uygulanmak üzere kökapp/layout.js
adresinde ayarlanır.- Mutlak URL'ler gerektiren tüm URL tabanlı
metadata
alanlarımetadataBase
seçeneği ile yapılandırılabilir.metadataBase
https://app.acme.com
gibi bir alt alan adı veya örneğin temel yol içerebilir.https://acme.com/start/from/here
- Bir
metadata
alanı mutlak bir URL sağlarsa,metadataBase
yok sayılır.- URL tabanlı bir
metadata
alanındametadataBase
yapılandırılmadan göreli bir yol kullanılması derleme hatasına neden olur.- Next.js,
metadataBase
(örn.https://acme.com/
) ve göreli bir alan (örn./path
) arasındaki yinelenen eğik çizgileri tek bir eğik çizgiye (örn.https://acme.com/path
) normalleştirecektir
Default value
Yapılandırılmamışsa, metadataBase
varsayılan bir değere sahiptir
- Ne zaman
VERCEL_URL
tespit edilirse:https://${process.env.VERCEL_URL}
aksi takdirdehttp://localhost:${process.env.PORT || 3000}
adresine geri döner. - Varsayılanı geçersiz kılarken, URL'yi hesaplamak için ortam değişkenlerini kullanmanızı öneririz. Bu, yerel geliştirme, hazırlama ve üretim ortamları için bir URL yapılandırılmasına olanak tanır.
URL Composition
URL bileşimi, varsayılan dizin geçişi semantiği yerine geliştirici amacını tercih eder.
metadataBase
vemetadata
alanları arasındaki eğik çizgiler normalleştirilir.metadata
alanındaki bir "mutlak" yol (tipik olarak tüm URL yolunun yerini alır) bir "göreli" yol olarak değerlendirilir (metadataBase
adresinin sonundan başlayarak).
Örneğin, aşağıda verilen metadataBase
:
import { Metadata } from 'next'
export const metadata: Metadata = {
metadataBase: new URL('https://acme.com'),
}
Yukarıdaki metadataBase
adresini devralan ve kendi değerini belirleyen metadata
alanları aşağıdaki gibi çözümlenecektir:
metadata field | Resolved URL |
---|---|
/ | https://acme.com |
./ | https://acme.com |
payments | https://acme.com/payments |
/payments | https://acme.com/payments |
./payments | https://acme.com/payments |
../payments | https://acme.com/payments |
https://beta.acme.com/payments | https://beta.acme.com/payments |
openGraph
export const metadata = {
openGraph: {
title: 'Next.js',
description: 'The React Framework for the Web',
url: 'https://nextjs.org',
siteName: 'Next.js',
images: [
{
url: 'https://nextjs.org/og.png', // Must be an absolute URL
width: 800,
height: 600,
},
{
url: 'https://nextjs.org/og-alt.png', // Must be an absolute URL
width: 1800,
height: 1600,
alt: 'My custom alt',
},
],
locale: 'en_US',
type: 'website',
},
}
<meta property="og:title" content="Next.js" />
<meta property="og:description" content="The React Framework for the Web" />
<meta property="og:url" content="https://nextjs.org/" />
<meta property="og:site_name" content="Next.js" />
<meta property="og:locale" content="en_US" />
<meta property="og:image:url" content="https://nextjs.org/og.png" />
<meta property="og:image:width" content="800" />
<meta property="og:image:height" content="600" />
<meta property="og:image:url" content="https://nextjs.org/og-alt.png" />
<meta property="og:image:width" content="1800" />
<meta property="og:image:height" content="1600" />
<meta property="og:image:alt" content="My custom alt" />
<meta property="og:type" content="website" />
export const metadata = {
openGraph: {
title: 'Next.js',
description: 'The React Framework for the Web',
type: 'article',
publishedTime: '2023-01-01T00:00:00.000Z',
authors: ['Seb', 'Josh'],
},
}
<meta property="og:title" content="Next.js" />
<meta property="og:description" content="The React Framework for the Web" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2023-01-01T00:00:00.000Z" />
<meta property="article:author" content="Seb" />
<meta property="article:author" content="Josh" />
Bildiğim iyi oldu:
- Open Graph görüntüleri için dosya tabanlı Meta Veri API 'sini kullanmak daha uygun olabilir. Yapılandırma dışa aktarımını gerçek dosyalarla senkronize etmek zorunda kalmak yerine, dosya tabanlı API sizin için doğru meta verileri otomatik olarak oluşturacaktır.
robots
import type { Metadata } from 'next'
export const metadata: Metadata = {
robots: {
index: false,
follow: true,
nocache: true,
googleBot: {
index: true,
follow: false,
noimageindex: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
}
<meta name="robots" content="noindex, follow, nocache" />
<meta
name="googlebot"
content="index, nofollow, noimageindex, max-video-preview:-1, max-image-preview:large, max-snippet:-1"
/>
icons
Bilmekte fayda var: Mümkün olan yerlerde simgeler için dosya tabanlı Meta Veri API 'sini kullanmanızı öneririz. Yapılandırma dışa aktarımını gerçek dosyalarla senkronize etmek zorunda kalmak yerine, dosya tabanlı API sizin için doğru meta verileri otomatik olarak oluşturacaktır.
export const metadata = {
icons: {
icon: '/icon.png',
shortcut: '/shortcut-icon.png',
apple: '/apple-icon.png',
other: {
rel: 'apple-touch-icon-precomposed',
url: '/apple-touch-icon-precomposed.png',
},
},
}
<link rel="shortcut icon" href="/shortcut-icon.png" />
<link rel="icon" href="/icon.png" />
<link rel="apple-touch-icon" href="/apple-icon.png" />
<link
rel="apple-touch-icon-precomposed"
href="/apple-touch-icon-precomposed.png"
/>
export const metadata = {
icons: {
icon: [
{ url: '/icon.png' },
new URL('/icon.png', 'https://example.com'),
{ url: '/icon-dark.png', media: '(prefers-color-scheme: dark)' },
],
shortcut: ['/shortcut-icon.png'],
apple: [
{ url: '/apple-icon.png' },
{ url: '/apple-icon-x3.png', sizes: '180x180', type: 'image/png' },
],
other: [
{
rel: 'apple-touch-icon-precomposed',
url: '/apple-touch-icon-precomposed.png',
},
],
},
}
<link rel="shortcut icon" href="/shortcut-icon.png" />
<link rel="icon" href="/icon.png" />
<link rel="icon" href="https://example.com/icon.png" />
<link rel="icon" href="/icon-dark.png" media="(prefers-color-scheme: dark)" />
<link rel="apple-touch-icon" href="/apple-icon.png" />
<link
rel="apple-touch-icon-precomposed"
href="/apple-touch-icon-precomposed.png"
/>
<link
rel="apple-touch-icon"
href="/apple-icon-x3.png"
sizes="180x180"
type="image/png"
/>
Bilmekte fayda var:
msapplication-*
meta etiketleri Microsoft Edge'in Chromium sürümlerinde artık desteklenmemektedir ve bu nedenle artık gerekli değildir.
themeColor
Kullanımdan kaldırılmıştır:
metadata
adresindekithemeColor
seçeneği Next.js 14'ten itibaren kullanımdan kaldırılmıştır. Lütfen bunun yerineviewport
yapılandırmasını kullanın.
manifest
Web Uygulaması Manifestosu spesifikasyonunda tanımlandığı gibi bir web uygulaması manifestosu .
export const metadata = {
manifest: 'https://nextjs.org/manifest.json',
}
<link rel="manifest" href="https://nextjs.org/manifest.json" />
twitter
Twitter spesifikasyonu (şaşırtıcı bir şekilde) X'ten (eski adıyla Twitter) daha fazlası için kullanılmaktadır.
Twitter Card işaretleme referansı hakkında daha fazla bilgi edinin .
export const metadata = {
twitter: {
card: 'summary_large_image',
title: 'Next.js',
description: 'The React Framework for the Web',
siteId: '1467726470533754880',
creator: '@nextjs',
creatorId: '1467726470533754880',
images: ['https://nextjs.org/og.png'], // Must be an absolute URL
},
}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site:id" content="1467726470533754880" />
<meta name="twitter:creator" content="@nextjs" />
<meta name="twitter:creator:id" content="1467726470533754880" />
<meta name="twitter:title" content="Next.js" />
<meta name="twitter:description" content="The React Framework for the Web" />
<meta name="twitter:image" content="https://nextjs.org/og.png" />
export const metadata = {
twitter: {
card: 'app',
title: 'Next.js',
description: 'The React Framework for the Web',
siteId: '1467726470533754880',
creator: '@nextjs',
creatorId: '1467726470533754880',
images: {
url: 'https://nextjs.org/og.png',
alt: 'Next.js Logo',
},
app: {
name: 'twitter_app',
id: {
iphone: 'twitter_app://iphone',
ipad: 'twitter_app://ipad',
googleplay: 'twitter_app://googleplay',
},
url: {
iphone: 'https://iphone_url',
ipad: 'https://ipad_url',
},
},
},
}
<meta name="twitter:site:id" content="1467726470533754880" />
<meta name="twitter:creator" content="@nextjs" />
<meta name="twitter:creator:id" content="1467726470533754880" />
<meta name="twitter:title" content="Next.js" />
<meta name="twitter:description" content="The React Framework for the Web" />
<meta name="twitter:card" content="app" />
<meta name="twitter:image" content="https://nextjs.org/og.png" />
<meta name="twitter:image:alt" content="Next.js Logo" />
<meta name="twitter:app:name:iphone" content="twitter_app" />
<meta name="twitter:app:id:iphone" content="twitter_app://iphone" />
<meta name="twitter:app:id:ipad" content="twitter_app://ipad" />
<meta name="twitter:app:id:googleplay" content="twitter_app://googleplay" />
<meta name="twitter:app:url:iphone" content="https://iphone_url" />
<meta name="twitter:app:url:ipad" content="https://ipad_url" />
<meta name="twitter:app:name:ipad" content="twitter_app" />
<meta name="twitter:app:name:googleplay" content="twitter_app" />
viewport
Kullanımdan kaldırılmıştır:
metadata
adresindekiviewport
seçeneği Next.js 14'ten itibaren kullanımdan kaldırılmıştır. Lütfen bunun yerineviewport
yapılandırmasını kullanın.
verification
export const metadata = {
verification: {
google: 'google',
yandex: 'yandex',
yahoo: 'yahoo',
other: {
me: ['my-email', 'my-link'],
},
},
}
<meta name="google-site-verification" content="google" />
<meta name="y_key" content="yahoo" />
<meta name="yandex-verification" content="yandex" />
<meta name="me" content="my-email" />
<meta name="me" content="my-link" />
appleWebApp
export const metadata = {
itunes: {
appId: 'myAppStoreID',
appArgument: 'myAppArgument',
},
appleWebApp: {
title: 'Apple Web App',
statusBarStyle: 'black-translucent',
startupImage: [
'/assets/startup/apple-touch-startup-image-768x1004.png',
{
url: '/assets/startup/apple-touch-startup-image-1536x2008.png',
media: '(device-width: 768px) and (device-height: 1024px)',
},
],
},
}
<meta
name="apple-itunes-app"
content="app-id=myAppStoreID, app-argument=myAppArgument"
/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Apple Web App" />
<link
href="/assets/startup/apple-touch-startup-image-768x1004.png"
rel="apple-touch-startup-image"
/>
<link
href="/assets/startup/apple-touch-startup-image-1536x2008.png"
media="(device-width: 768px) and (device-height: 1024px)"
rel="apple-touch-startup-image"
/>
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
alternates
export const metadata = {
alternates: {
canonical: 'https://nextjs.org',
languages: {
'en-US': 'https://nextjs.org/en-US',
'de-DE': 'https://nextjs.org/de-DE',
},
media: {
'only screen and (max-width: 600px)': 'https://nextjs.org/mobile',
},
types: {
'application/rss+xml': 'https://nextjs.org/rss',
},
},
}
<link rel="canonical" href="https://nextjs.org" />
<link rel="alternate" hreflang="en-US" href="https://nextjs.org/en-US" />
<link rel="alternate" hreflang="de-DE" href="https://nextjs.org/de-DE" />
<link
rel="alternate"
media="only screen and (max-width: 600px)"
href="https://nextjs.org/mobile"
/>
<link
rel="alternate"
type="application/rss+xml"
href="https://nextjs.org/rss"
/>
appLinks
export const metadata = {
appLinks: {
ios: {
url: 'https://nextjs.org/ios',
app_store_id: 'app_store_id',
},
android: {
package: 'com.example.android/package',
app_name: 'app_name_android',
},
web: {
url: 'https://nextjs.org/web',
should_fallback: true,
},
},
}
<meta property="al:ios:url" content="https://nextjs.org/ios" />
<meta property="al:ios:app_store_id" content="app_store_id" />
<meta property="al:android:package" content="com.example.android/package" />
<meta property="al:android:app_name" content="app_name_android" />
<meta property="al:web:url" content="https://nextjs.org/web" />
<meta property="al:web:should_fallback" content="true" />
archives
Kayıtların, belgelerin veya tarihi ilgi çekici diğer materyallerin bir koleksiyonunu tanımlar(kaynak).
export const metadata = {
archives: ['https://nextjs.org/13'],
}
<link rel="archives" href="https://nextjs.org/13" />
assets
export const metadata = {
assets: ['https://nextjs.org/assets'],
}
<link rel="assets" href="https://nextjs.org/assets" />
bookmarks
export const metadata = {
bookmarks: ['https://nextjs.org/13'],
}
<link rel="bookmarks" href="https://nextjs.org/13" />
category
export const metadata = {
category: 'technology',
}
<meta name="category" content="technology" />
other
Yerleşik destek kullanılarak tüm meta veri seçenekleri kapsanmalıdır. Ancak, sitenize özel meta veri etiketleri veya yeni yayınlanan yepyeni meta veri etiketleri olabilir. Herhangi bir özel meta veri etiketini işlemek için other
seçeneğini kullanabilirsiniz.
export const metadata = {
other: {
custom: 'meta',
},
}
<meta name="custom" content="meta" />
Birden fazla aynı anahtar meta etiketi oluşturmak istiyorsanız dizi değeri kullanabilirsiniz.
export const metadata = {
other: {
custom: ['meta1', 'meta2'],
},
}
<meta name="custom" content="meta1" /> <meta name="custom" content="meta2" />
Unsupported Metadata
Aşağıdaki meta veri türleri şu anda yerleşik desteğe sahip değildir. Ancak, yine de düzende veya sayfanın kendisinde oluşturulabilirler.
Metadata | Recommendation |
---|---|
<meta http-equiv="..."> | Use appropriate HTTP Headers via redirect() , Middleware, Security Headers |
<base> | Render the tag in the layout or page itself. |
<noscript> | Render the tag in the layout or page itself. |
<style> | Learn more about styling in Next.js. |
<script> | Learn more about using scripts. |
<link rel="stylesheet" /> | import stylesheets directly in the layout or page itself. |
<link rel="preload /> | Use ReactDOM preload method |
<link rel="preconnect" /> | Use ReactDOM preconnect method |
<link rel="dns-prefetch" /> | Use ReactDOM prefetchDNS method |
Resource hints
<link>
öğesi, tarayıcıya harici bir kaynağa ihtiyaç duyulabileceğini ima etmek için kullanılabilecek bir dizi rel
anahtar sözcüğüne sahiptir. Tarayıcı bu bilgiyi anahtar kelimeye bağlı olarak ön yükleme optimizasyonlarını uygulamak için kullanır.
Metadata API'si bu ipuçlarını doğrudan desteklemese de, bunları belgenin <head>
adresine güvenli bir şekilde eklemek için yeni ReactDOM
yöntemlerini kullanabilirsiniz.
'use client'
import ReactDOM from 'react-dom'
export function PreloadResources() {
ReactDOM.preload('...', { as: '...' })
ReactDOM.preconnect('...', { crossOrigin: '...' })
ReactDOM.prefetchDNS('...')
return null
}
<link rel="preload">
Sayfa oluşturma (tarayıcı) yaşam döngüsünün başlarında bir kaynağı yüklemeye başlayın. MDN Docs.
ReactDOM.preload(href: string, options: { as: string })
<link rel="preload" href="..." as="..." />
<link rel="preconnect">
Bir kaynakla bağlantıyı önceden başlatın. MDN Docs.
ReactDOM.preconnect(href: string, options?: { crossOrigin?: string })
<link rel="preconnect" href="..." crossorigin />
<link rel="dns-prefetch">
Kaynaklar istenmeden önce bir alan adını çözümlemeye çalışın. MDN Docs.
ReactDOM.prefetchDNS(href: string)
<link rel="dns-prefetch" href="..." />
Bildiğim iyi oldu:
- Bu yöntemler şu anda yalnızca ilk sayfa yüklemesinde hala Sunucu Tarafı Oluşturulan İstemci Bileşenlerinde desteklenmektedir.
- Next.js'nin
next/font
,next/image
venext/script
gibi yerleşik özellikleri ilgili kaynak ipuçlarını otomatik olarak işler.- React 18.3 henüz
ReactDOM.preload
,ReactDOM.preconnect
veReactDOM.preconnectDNS
için tip tanımları içermemektedir. Tip hatalarını önlemek için geçici bir çözüm olarak// @ts-ignore
adresini kullanabilirsiniz.
Types
Metadata
türünü kullanarak meta verilerinize tür güvenliği ekleyebilirsiniz. IDE'nizde yerleşik TypeScript eklentisini kullanıyorsanız, türü manuel olarak eklemenize gerek yoktur, ancak isterseniz yine de açıkça ekleyebilirsiniz.
metadata
object
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'Next.js',
}
generateMetadata
function
Regular function
import type { Metadata } from 'next'
export function generateMetadata(): Metadata {
return {
title: 'Next.js',
}
}
Async function
import type { Metadata } from 'next'
export async function generateMetadata(): Promise<Metadata> {
return {
title: 'Next.js',
}
}
With segment props
import type { Metadata } from 'next'
type Props = {
params: { id: string }
searchParams: { [key: string]: string | string[] | undefined }
}
export function generateMetadata({ params, searchParams }: Props): Metadata {
return {
title: 'Next.js',
}
}
export default function Page({ params, searchParams }: Props) {}
With parent metadata
import type { Metadata, ResolvingMetadata } from 'next'
export async function generateMetadata(
{ params, searchParams }: Props,
parent: ResolvingMetadata
): Promise<Metadata> {
return {
title: 'Next.js',
}
}
JavaScript Projects
JavaScript projelerinde, tip güvenliği eklemek için JSDoc kullanabilirsiniz.
/** @type {import("next").Metadata} */
export const metadata = {
title: 'Next.js',
}
Version History
Version | Changes |
---|---|
v13.2.0 | viewport , themeColor , and colorScheme deprecated in favor of the viewport configuration. |
v13.2.0 | metadata and generateMetadata introduced. |