App Router Incremental Adoption Guide
Bu kılavuz size yardımcı olacaktır:
- Next.js uygulamanızı sürüm 12'den sürüm 13'e güncelleyin
- Hem
pages
hem deapp
dizinlerinde çalışan yükseltme özellikleri - Mevcut uygulamanızı kademeli olarak
pages
adresindenapp
Upgrading
Node.js Version
Minimum Node.js sürümü artık v18.17'dir. Daha fazla bilgi için adresindeki Node.js belgelerine bakın.
Next.js Version
Next.js sürüm 13'e güncellemek için tercih ettiğiniz paket yöneticisini kullanarak aşağıdaki komutu çalıştırın:
npm install next@latest react@latest react-dom@latest
ESLint Version
ESLint kullanıyorsanız, ESLint sürümünüzü yükseltmeniz gerekir:
npm install -D eslint-config-next@latest
Bilmekte fayda var: ESLint değişikliklerinin etkili olması için VS Code'da ESLint sunucusunu yeniden başlatmanız gerekebilir. Komut Paletini açın (Mac'te
cmd+shift+p
; Windows'tactrl+shift+p
) veESLint: Restart ESLint Server
adresini arayın.
Next Steps
Güncellemeyi yaptıktan sonra, sonraki adımlar için aşağıdaki bölümlere bakın:
- Yeni özellikleri yükseltin: Geliştirilmiş Görüntü ve Bağlantı Bileşenleri gibi yeni özelliklere yükseltme yapmanıza yardımcı olacak bir kılavuz.
-
pages
dizinindenapp
dizinine geçiş yapın:pages
dizinindenapp
dizinine aşamalı olarak geçiş yapmanıza yardımcı olacak adım adım kılavuz.
Upgrading New Features
Next.js 13, yeni özellikler ve kurallar içeren yeni Uygulama Yönlendiricisini tanıttı. Yeni Yönlendirici app
dizininde bulunur ve pages
dizini ile birlikte var olur.
Next.js 13'e yükseltmek için yeni Uygulama Yönlendiricisini kullanmanız gerekmez. Güncellenen Image bileşeni, Link bileşeni, Script bileşeni ve Font optimizasyonu gibi her iki dizinde de çalışan yeni özelliklerle pages
adresini kullanmaya devam edebilirsiniz.
<Image/>
Component
Next.js 12, geçici bir içe aktarma ile Görüntü Bileşeninde yeni iyileştirmeler sundu: next/future/image
. Bu iyileştirmeler arasında daha az istemci tarafı JavaScript, görüntüleri genişletmek ve şekillendirmek için daha kolay yollar, daha iyi erişilebilirlik ve yerel tarayıcı tembel yüklemesi yer alıyordu.
Sürüm 13'te bu yeni davranış artık next/image
için varsayılandır.
Yeni Görüntü Bileşenine geçiş yapmanıza yardımcı olacak iki kodmod vardır:
next-image-to-legacy-image
codemod:next/image
içe aktarmalarını güvenli ve otomatik olaraknext/legacy/image
olarak yeniden adlandırır. Mevcut bileşenler aynı davranışı koruyacaktır.next-image-experimental
codemod: Dangerously satır içi stilleri ekler ve kullanılmayan sahne öğelerini kaldırır. Bu, mevcut bileşenlerin davranışını yeni varsayılanlarla eşleşecek şekilde değiştirecektir. Bu codemod'u kullanmak için öncenext-image-to-legacy-image
codemod'unu çalıştırmanız gerekir.
<Link>
Component
<Link>
Bileşeni artık bir <a>
etiketinin alt öğe olarak manuel olarak eklenmesini gerektirmiyor. Bu davranış 12.2 sürümünde deneysel bir seçenek olarak eklenmişti ve artık varsayılandır. Next.js 13'te, <Link>
her zaman <a>
adresini oluşturur ve destekleri altta yatan etikete yönlendirmenize olanak tanır.
Örneğin:
import Link from 'next/link'
// Next.js 12: `<a>` has to be nested otherwise it's excluded
<Link href="/about">
<a>About</a>
</Link>
// Next.js 13: `<Link>` always renders `<a>` under the hood
<Link href="/about">
About
</Link>
Bağlantılarınızı Next.js 13'e yükseltmek için new-link
codemod'u kullanabilirsiniz.
<Script>
Component
Davranışları next/script
hem pages
hem de app
adreslerini destekleyecek şekilde güncellenmiştir, ancak sorunsuz bir geçiş sağlamak için bazı değişikliklerin yapılması gerekmektedir:
- Daha önce
_document.js
adresine eklediğiniz tümbeforeInteractive
komut dosyalarını kök düzen dosyasına (app/layout.tsx
) taşıyın. - Deneysel
worker
stratejisi henüzapp
adresinde çalışmamaktadır ve bu strateji ile gösterilen komut dosyalarının kaldırılması veya farklı bir strateji kullanmak üzere değiştirilmesi gerekecektir (örn.lazyOnload
). onLoad
,onReady
, veonError
işleyicileri Sunucu Bileşenlerinde çalışmayacaktır, bu nedenle bunları bir İstemci Bileşenine taşıdığınızdan veya tamamen kaldırdığınızdan emin olun.
Font Optimization
Daha önce Next.js, yazı tipi CSS'sini inlining yaparak yazı tiplerini optimize etmenize yardımcı oluyordu. Sürüm 13 yeni next/font
modülü size yazı tipi yükleme deneyiminizi kişiselleştirme olanağı verirken aynı zamanda mükemmel performans ve gizlilik sağlar. next/font
hem pages
hem de app
dizinlerinde desteklenir.
CSS inlining pages
'da hala çalışırken, app
'da çalışmaz. next/font
onun yerine.
next/font
adresini nasıl kullanacağınızı öğrenmek için Yazı Tipi Optimizasyonu sayfasına bakın.
Migrating from pages
to app
🎥 İzleyin: Uygulama Yönlendiricisini aşamalı olarak nasıl benimseyeceğinizi öğrenin → YouTube (16 dakika).
App Router'a geçiş, Next.js'nin üzerine inşa edildiği Sunucu Bileşenleri, Suspense ve daha fazlası gibi React özelliklerini ilk kez kullanıyor olabilirsiniz. Özel dosyalar ve düzenler gibi yeni Next.js özellikleriyle birleştirildiğinde, geçiş, öğrenilmesi gereken yeni kavramlar, zihinsel modeller ve davranış değişiklikleri anlamına gelir.
Geçişinizi daha küçük adımlara bölerek bu güncellemelerin birleşik karmaşıklığını azaltmanızı öneririz. app
dizini, sayfa sayfa geçişe izin vermek için pages
dizini ile eşzamanlı olarak çalışmak üzere kasıtlı olarak tasarlanmıştır.
app
dizini iç içe rotaları ve düzenleri destekler. Daha fazla bilgi edinin.- Rotaları tanımlamak için iç içe klasörler ve bir rota segmentini genel erişime açmak için özel bir
page.js
dosyası kullanın. Daha fazla bilgi edinin. - Her bir rota segmenti için UI oluşturmak üzere özel dosya kuralları kullanılır. En yaygın özel dosyalar
page.js
velayout.js
'dir.- Bir rotaya özgü kullanıcı arayüzü tanımlamak için
page.js
adresini kullanın. - Birden fazla rotada paylaşılan kullanıcı arayüzünü tanımlamak için
layout.js
adresini kullanın. .js
Özel dosyalar için.jsx
veya.tsx
dosya uzantıları kullanılabilir.
- Bir rotaya özgü kullanıcı arayüzü tanımlamak için
- Bileşenler, stiller, testler ve daha fazlası gibi diğer dosyaları
app
dizini içine yerleştirebilirsiniz. Daha fazla bilgi edinin. getServerSideProps
vegetStaticProps
gibi veri getirme işlevleriapp
içinde yeni bir API ile değiştirildi.getStaticPaths
ile değiştirildigenerateStaticParams
.pages/_app.js
vepages/_document.js
adresleri tek birapp/layout.js
kök düzeni ile değiştirilmiştir. Daha fazla bilgi edinin.pages/_error.js
daha ayrıntılıerror.js
özel dosyaları ile değiştirilmiştir. Daha fazla bilgi edinin.pages/404.js
ile değiştirilmiştir.not-found.js
Dosya.pages/api/*
şu andapages
dizini içinde kalmaktadır.
Step 1: Creating the app
directory
En son Next.js sürümüne güncelleyin (13.4 veya üstü gerekir):
npm install next@latest
Ardından, projenizin kök dizininde (veya src/
dizininde) yeni bir app
dizini oluşturun.
Step 2: Creating a Root Layout
app
dizini içinde yeni bir app/layout.tsx
dosyası oluşturun. Bu, app
içindeki tüm rotalar için geçerli olacak bir kök düzenidir.
export default function RootLayout({
// Layouts must accept a children prop.
// This will be populated with nested layouts or pages
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
app
dizini bir kök düzeni içermelidir.- Next.js bunları otomatik olarak oluşturmadığı için kök düzen
<html>
, ve<body>
etiketlerini tanımlamalıdır - Kök düzeni
pages/_app.tsx
vepages/_document.tsx
dosyalarının yerini alır. .js
,.jsx
veya.tsx
uzantıları düzen dosyaları için kullanılabilir.
<head>
HTML öğelerini yönetmek için yerleşik SEO desteğini kullanabilirsiniz:
import { Metadata } from 'next'
export const metadata: Metadata = {
title: 'Home',
description: 'Welcome to Next.js',
}
Migrating _document.js
and _app.js
Mevcut bir _app
veya _document
dosyanız varsa, içeriği (örneğin global stiller) kök düzene (app/layout.tsx
) kopyalayabilirsiniz. app/layout.tsx
'daki stiller pages/*
için geçerli olmayacaktır. pages/*
rotalarınızın bozulmasını önlemek için geçiş sırasında _app
/_document
'u tutmalısınız. Tamamen taşındıktan sonra bunları güvenle silebilirsiniz.
Herhangi bir React Context sağlayıcısı kullanıyorsanız, bunların bir İstemci Bileşenine taşınması gerekecektir.
Migrating the getLayout()
pattern to Layouts (Optional)
Next.js, pages
dizininde sayfa başına düzenler elde etmek için Sayfa bileşenlerine bir özellik eklemeyi önerdi. Bu model, app
dizinindeki iç içe düzenler için yerel destek ile değiştirilebilir.
See before and after example
Önce
export default function DashboardLayout({ children }) {
return (
<div>
<h2>My Dashboard</h2>
{children}
</div>
)
}
import DashboardLayout from '../components/DashboardLayout'
export default function Page() {
return <p>My Page</p>
}
Page.getLayout = function getLayout(page) {
return <DashboardLayout>{page}</DashboardLayout>
}
Sonra
-
Page.getLayout
özelliğinipages/dashboard/index.js
adresinden kaldırın ve sayfalarıapp
dizinine taşıma adımlarını izleyin.app/dashboard/page.jsexport default function Page() { return <p>My Page</p> }
-
pages
dizin davranışını korumak içinDashboardLayout
içeriğini yeni bir İstemci Bileşenine taşıyın.app/dashboard/DashboardLayout.js'use client' // this directive should be at top of the file, before any imports. // This is a Client Component export default function DashboardLayout({ children }) { return ( <div> <h2>My Dashboard</h2> {children} </div> ) }
-
DashboardLayout
adresiniapp
dizini içinde yeni birlayout.js
dosyasına aktarın.app/dashboard/layout.jsimport DashboardLayout from './DashboardLayout' // This is a Server Component export default function Layout({ children }) { return <DashboardLayout>{children}</DashboardLayout> }
-
İstemciye gönderdiğiniz JavaScript bileşeni miktarını azaltmak için
DashboardLayout.js
(İstemci Bileşeni) adresinin etkileşimli olmayan kısımlarını aşamalı olaraklayout.js
(Sunucu Bileşeni) adresine taşıyabilirsiniz.
Step 3: Migrating next/head
pages
dizininde, next/head
React bileşeni title
ve meta
gibi <head>
HTML öğelerini yönetmek için kullanılır. app
dizininde, next/head
yeni yerleşik SEO desteği ile değiştirilmiştir.
Daha önce:
import Head from 'next/head'
export default function Page() {
return (
<>
<Head>
<title>My page title</title>
</Head>
</>
)
}
Sonra:
import { Metadata } from 'next'
export const metadata: Metadata = {
title: 'My Page Title',
}
export default function Page() {
return '...'
}
Tüm meta veri seçeneklerine bakın.
Step 4: Migrating Pages
app
dizinindeki sayfalar varsayılan olarak Sunucu Bileş enleridir. Bu, sayfaların İstemci Bileşenleri olduğupages
dizininden farklıdır.- Veri getirme
app
adresinde değişmiştir.getServerSideProps
,getStaticProps
vegetInitialProps
daha basit bir API ile değiştirilmiştir. app
dizini, rotaları tanımlamak için iç içe klasörler ve bir rota segmentini genel erişime açmak için özel birpage.js
dosyası kullanır.-
pages
Rehberapp
RehberRota index.js
page.js
/
about.js
about/page.js
/about
blog/[slug].js
blog/[slug]/page.js
/blog/post-1
Bir sayfanın taşınmasını iki ana adıma ayırmanızı öneririz:
- Adım 1: Varsayılan dışa aktarılmış Sayfa Bileşenini yeni bir İstemci Bileşenine taşıyın.
- Adım 2: Yeni İstemci Bileşenini
app
dizini içindeki yeni birpage.js
dosyasına aktarın.
Bilmekte fayda var: Bu en kolay geçiş yoludur çünkü
pages
dizini ile en benzer davranışa sahiptir.
Adım 1: Yeni bir İstemci Bileşeni Oluşturun
app
dizini içinde (yaniapp/home-page.tsx
veya benzeri) bir İstemci Bileşenini dışa aktaran yeni bir ayrı dosya oluşturun. İstemci Bileşenlerini tanımlamak için,'use client'
yönergesini dosyanın en üstüne ekleyin (tüm içe aktarmalardan önce).- Varsayılan dışa aktarılan sayfa bileşenini
pages/index.js
adresindenapp/home-page.tsx
adresine taşıyın.
'use client'
// This is a Client Component. It receives data as props and
// has access to state and effects just like Page components
// in the `pages` directory.
export default function HomePage({ recentPosts }) {
return (
<div>
{recentPosts.map((post) => (
<div key={post.id}>{post.title}</div>
))}
</div>
)
}
Adım 2: Yeni bir sayfa oluşturun
-
app
dizini içinde yeni birapp/page.tsx
dosyası oluşturun. Bu varsayılan olarak bir Sunucu Bileşenidir. -
home-page.tsx
İstemci Bileşenini sayfaya aktarın. -
pages/index.js
adresinden veri getiriyorsanız, yeni veri getirme API'lerini kullanarak veri getirme mantığını doğrudan Sunucu Bileşenine taşıyın. Daha fazla ayrıntı için veri getirme yükseltme kılavuzuna bakın.app/page.tsx// Import your Client Component import HomePage from './home-page' async function getPosts() { const res = await fetch('https://...') const posts = await res.json() return posts } export default async function Page() { // Fetch data directly in a Server Component const recentPosts = await getPosts() // Forward fetched data to your Client Component return <HomePage recentPosts={recentPosts} /> }
-
Önceki sayfanız
useRouter
adresini kullandıysa, yeni yönlendirme kancalarına güncellemeniz gerekir. Daha fazla bilgi edinin. -
Geliştirme sunucunuzu başlatın ve
http://localhost:3000
. Artık uygulama dizini üzerinden sunulan mevcut dizin rotanızı görmelisiniz.
Step 5: Migrating Routing Hooks
app
dizinindeki yeni davranışı desteklemek için yeni bir yönlendirici eklendi.
app
adresinde, next/navigation
adresinden içe aktarılan üç yeni kancayı kullanmalısınız: useRouter()
, usePathname()
ve useSearchParams()
.
- Yeni
useRouter
kancasınext/navigation
adresinden içe aktarılmıştır vepages
adresindekiuseRouter
kancasından farklı bir davranışa sahiptir venext/router
adresinden içe aktarılmıştır.-
next/router
adresinden içe aktarılanuseRouter
kancasıapp
dizininde desteklenmez ancakpages
dizininde kullanılmaya devam edilebilir.
-
- Yeni
useRouter
,pathname
dizesini döndürmez. Bunun yerine ayrıusePathname
kancasını kullanın. - Yeni
useRouter
,query
nesnesini döndürmez. Bunun yerine ayrıuseSearchParams
kancasını kullanın. - Sayfa değişikliklerini dinlemek için
useSearchParams
veusePathname
adreslerini birlikte kullanabilirsiniz. Daha fazla ayrıntı için Yönlendirici Olayları bölümüne bakın. - Bu yeni kancalar yalnızca İstemci Bileşenlerinde desteklenmektedir. Sunucu Bileşenlerinde kullanılamazlar.
'use client'
import { useRouter, usePathname, useSearchParams } from 'next/navigation'
export default function ExampleClientComponent() {
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
// ...
}
Buna ek olarak, yeni useRouter
kancası aşağıdaki değişikliklere sahiptir:
isFallback
kaldırılmıştır çünküfallback
değiştirilmiştir.locale
,locales
,defaultLocales
,domainLocales
değerleri kaldırılmıştır çünkü yerleşik i18n Next.js özellikleriapp
dizininde artık gerekli değildir. i18n hakkında daha fazla bilgi edinin.basePath
kaldırılmıştır. Alternatif,useRouter
adresinin bir parçası olmayacaktır. Henüz uygulamaya konulmamıştır.asPath
kaldırılmıştır çünküas
kavramı yeni yönlendiriciden kaldırılmıştır.isReady
artık gerekli olmadığı için kaldırılmıştır. Statik render sırasında, herhangi bir bileşenuseSearchParams()
kancası ön oluşturma adımını atlayacak ve bunun yerine çalışma zamanında istemcide oluşturulacaktır.
useRouter()
API referansını görüntüleyin.
Step 6: Migrating Data Fetching Methods
pages
dizini, sayfalar için veri almak üzere getServerSideProps
ve getStaticProps
adreslerini kullanır. app
dizini içinde, bu önceki veri getirme işlevleri, fetch()
ve async
React Sunucu Bileşenleri üzerine inşa edilmiş daha basit bir API ile değiştirilir.
export default async function Page() {
// This request should be cached until manually invalidated.
// Similar to `getStaticProps`.
// `force-cache` is the default and can be omitted.
const staticData = await fetch(`https://...`, { cache: 'force-cache' })
// This request should be refetched on every request.
// Similar to `getServerSideProps`.
const dynamicData = await fetch(`https://...`, { cache: 'no-store' })
// This request should be cached with a lifetime of 10 seconds.
// Similar to `getStaticProps` with the `revalidate` option.
const revalidatedData = await fetch(`https://...`, {
next: { revalidate: 10 },
})
return <div>...</div>
}
Server-side Rendering (getServerSideProps
)
pages
dizininde, getServerSideProps
sunucudan veri almak ve propları dosyadaki varsayılan dışa aktarılan React bileşenine iletmek için kullanılır. Sayfa için ilk HTML sunucudan önceden oluşturulur, ardından sayfa tarayıcıda "hidratlanır" (etkileşimli hale getirilir).
// `pages` directory
export async function getServerSideProps() {
const res = await fetch(`https://...`)
const projects = await res.json()
return { props: { projects } }
}
export default function Dashboard({ projects }) {
return (
<ul>
{projects.map((project) => (
<li key={project.id}>{project.name}</li>
))}
</ul>
)
}
app
dizininde, Sunucu Bileşenlerini kullanarak veri getirme işlemimizi React bileşenlerimizin içine yerleştirebiliriz. Bu, sunucudan işlenen HTML'yi korurken istemciye daha az JavaScript göndermemizi sağlar.
cache
seçeneğini no-store
olarak ayarlayarak, getirilen verilerin asla önbelleğe alınmaması gerektiğini belirtebiliriz. Bu, pages
dizinindeki getServerSideProps
seçeneğine benzer.
// `app` directory
// This function can be named anything
async function getProjects() {
const res = await fetch(`https://...`, { cache: 'no-store' })
const projects = await res.json()
return projects
}
export default async function Dashboard() {
const projects = await getProjects()
return (
<ul>
{projects.map((project) => (
<li key={project.id}>{project.name}</li>
))}
</ul>
)
}
Accessing Request Object
pages
dizininde, Node.js HTTP API'sine dayalı olarak istek tabanlı verileri alabilirsiniz.
Örneğin, req
nesnesini getServerSideProps
adresinden alabilir ve isteğin çerezlerini ve başlıklarını almak için kullanabilirsiniz.
// `pages` directory
export async function getServerSideProps({ req, query }) {
const authHeader = req.getHeaders()['authorization'];
const theme = req.cookies['theme'];
return { props: { ... }}
}
export default function Page(props) {
return ...
}
app
dizini, istek verilerini almak için yeni salt okunur işlevler sunar:
headers()
: Web Headers API'sini temel alır ve istek başlıklarını almak için Sunucu Bileşenleri içinde kullanılabilir.cookies()
: Web Çerezleri API'sini temel alır ve çerezleri almak için Sunucu Bileşenleri içinde kullanılabilir.
// `app` directory
import { cookies, headers } from 'next/headers'
async function getData() {
const authHeader = headers().get('authorization')
return '...'
}
export default async function Page() {
// You can use `cookies()` or `headers()` inside Server Components
// directly or in your data fetching function
const theme = cookies().get('theme')
const data = await getData()
return '...'
}
Static Site Generation (getStaticProps
)
pages
dizininde, getStaticProps
işlevi derleme zamanında bir sayfayı önceden işlemek için kullanılır. Bu fonksiyon, harici bir API'den veya doğrudan bir veritabanından veri almak ve bu verileri derleme sırasında oluşturulurken tüm sayfaya aktarmak için kullanılabilir.
// `pages` directory
export async function getStaticProps() {
const res = await fetch(`https://...`)
const projects = await res.json()
return { props: { projects } }
}
export default function Index({ projects }) {
return projects.map((project) => <div>{project.name}</div>)
}
app
dizininde, veri getirme ile fetch()
varsayılan olarak cache: 'force-cache'
adresini kullanacaktır ve bu adres elle geçersiz kılınana kadar istek verilerini önbelleğe alacaktır. Bu, pages
dizinindeki getStaticProps
adresine benzer.
// `app` directory
// This function can be named anything
async function getProjects() {
const res = await fetch(`https://...`)
const projects = await res.json()
return projects
}
export default async function Index() {
const projects = await getProjects()
return projects.map((project) => <div>{project.name}</div>)
}
Dynamic paths (getStaticPaths
)
pages
dizininde, getStaticPaths
işlevi derleme zamanında önceden oluşturulması gereken dinamik yolları tanımlamak için kullanılır.
// `pages` directory
import PostLayout from '@/components/post-layout'
export async function getStaticPaths() {
return {
paths: [{ params: { id: '1' } }, { params: { id: '2' } }],
}
}
export async function getStaticProps({ params }) {
const res = await fetch(`https://.../posts/${params.id}`)
const post = await res.json()
return { props: { post } }
}
export default function Post({ post }) {
return <PostLayout post={post} />
}
app
dizininde, getStaticPaths
ile değiştirilir generateStaticParams
.
generateStaticParams
getStaticPaths
ile benzer şekilde davranır, ancak rota parametrelerini döndürmek için basitleştirilmiş bir API'ye sahiptir ve düzenlerin içinde kullanılabilir. generateStaticParams
'un dönüş şekli, iç içe geçmiş param
nesneleri dizisi veya çözümlenmiş yollar dizisi yerine bir segmentler dizisidir.
// `app` directory
import PostLayout from '@/components/post-layout'
export async function generateStaticParams() {
return [{ id: '1' }, { id: '2' }]
}
async function getPost(params) {
const res = await fetch(`https://.../posts/${params.id}`)
const post = await res.json()
return post
}
export default async function Post({ params }) {
const post = await getPost(params)
return <PostLayout post={post} />
}
app
dizinindeki yeni model için getStaticPaths
yerine generateStaticParams
adının kullanılması daha uygundur. get
öneki, getStaticProps
ve getServerSideProps
artık gerekli olmadığı için tek başına daha iyi oturan daha açıklayıcı bir generate
ile değiştirilmiştir. Paths
son eki, birden fazla dinamik segmente sahip iç içe yönlendirme için daha uygun olan Params
ile değiştirilmiştir.
Replacing fallback
pages
dizininde, getStaticPaths
adresinden döndürülen fallback
özelliği, derleme zamanında önceden oluşturulmamış bir sayfanın davranışını tanımlamak için kullanılır. Bu özellik, sayfa oluşturulurken bir geri dönüş sayfası göstermek için true
, 404 sayfası göstermek için false
veya sayfayı istek zamanında oluşturmak için blocking
olarak ayarlanabilir.
// `pages` directory
export async function getStaticPaths() {
return {
paths: [],
fallback: 'blocking'
};
}
export async function getStaticProps({ params }) {
...
}
export default function Post({ post }) {
return ...
}
app
dizinindeconfig.dynamicParams
özelliği, dışındaki paramların nasıl generateStaticParams
ele alınır:
true
: (varsayılan)generateStaticParams
adresinde yer almayan dinamik segmentler talep üzerine oluşturulur.false
:generateStaticParams
adresinde yer almayan dinamik segmentler 404 döndürür.
Bu, pages
dizinindeki getStaticPaths
adresinin fallback: true | false | 'blocking'
seçeneğinin yerini alır. fallback: 'blocking'
seçeneği dynamicParams
'a dahil edilmemiştir çünkü 'blocking'
ve true
arasındaki fark akış ile ihmal edilebilir düzeydedir.
// `app` directory
export const dynamicParams = true;
export async function generateStaticParams() {
return [...]
}
async function getPost(params) {
...
}
export default async function Post({ params }) {
const post = await getPost(params);
return ...
}
ile dynamicParams
true
(varsayılan) olarak ayarlandığında, oluşturulmamış bir rota segmenti istendiğinde, sunucu tarafından oluşturulacak ve önbelleğe alınacaktır.
Incremental Static Regeneration (getStaticProps
with revalidate
)
pages
dizininde, getStaticProps
işlevi, bir sayfayı belirli bir süre sonra otomatik olarak yeniden oluşturmak için bir revalidate
alanı eklemenize olanak tanır.
// `pages` directory
export async function getStaticProps() {
const res = await fetch(`https://.../posts`)
const posts = await res.json()
return {
props: { posts },
revalidate: 60,
}
}
export default function Index({ posts }) {
return (
<Layout>
<PostList posts={posts} />
</Layout>
)
}
app
dizininde, veri getirme ile fetch()
isteği belirtilen süre boyunca önbelleğe alacak olan revalidate
adresini kullanabilir.
// `app` directory
async function getPosts() {
const res = await fetch(`https://.../posts`, { next: { revalidate: 60 } })
const data = await res.json()
return data.posts
}
export default async function PostList() {
const posts = await getPosts()
return posts.map((post) => <div>{post.name}</div>)
}
API Routes
API Rotaları pages/api
dizininde herhangi bir değişiklik olmadan çalışmaya devam eder. Ancak, bunların yerini app
dizinindeki Rota İşleyicileri almıştır.
Rota İşleyicileri, Web İsteği ve Yanıt API'lerini kullanarak belirli bir rota için özel istek işleyicileri oluşturmanıza olanak tanır.
export async function GET(request: Request) {}
Bilmekte fayda var: Daha önce istemciden harici bir API çağırmak için API rotalarını kullandıysanız, artık verileri güvenli bir şekilde almak için bunun yerine Sunucu Bileşenlerini kullanabilirsiniz. Veri getirme hakkında daha fazla bilgi edinin.
Step 7: Styling
pages
dizininde, global stil sayfaları yalnızca pages/_app.js
ile sınırlandırılmıştır. app
dizini ile bu sınırlama kaldırılmıştır. Global stiller herhangi bir düzene, sayfaya veya bileşene eklenebilir.
Tailwind CSS
Tailwind CSS kullanıyorsanız, app
dizinini tailwind.config.js
dosyanıza eklemeniz gerekir:
module.exports = {
content: [
'./app/**/*.{js,ts,jsx,tsx,mdx}', // <-- Add this line
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
],
}
Ayrıca app/layout.js
dosyanızdaki global stillerinizi de içe aktarmanız gerekir:
import '../styles/globals.css'
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
Tailwind CSS ile stil oluşturma hakkında daha fazla bilgi edinin
Codemods
Next.js, bir özellik kullanımdan kaldırıldığında kod tabanınızı yükseltmenize yardımcı olmak için Codemod dönüşümleri sağlar. Daha fazla bilgi için Codemods bölümüne bakın.