From Pages to App
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
pageshem deappdizinlerinde çalışan yükseltme özellikleri - Mevcut uygulamanızı kademeli olarak
pagesadresindenapp
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@latestESLint Version
ESLint kullanıyorsanız, ESLint sürümünüzü yükseltmeniz gerekir:
npm install -D eslint-config-next@latestBilmekte 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 Serveradresini 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.
-
pagesdizinindenappdizinine geçiş yapın:pagesdizinindenappdizinine 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-imagecodemod:next/imageiçe aktarmalarını güvenli ve otomatik olaraknext/legacy/imageolarak yeniden adlandırır. Mevcut bileşenler aynı davranışı koruyacaktır.next-image-experimentalcodemod: 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-imagecodemod'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.jsadresine eklediğiniz tümbeforeInteractivekomut dosyalarını kök düzen dosyasına (app/layout.tsx) taşıyın. - Deneysel
workerstratejisi henüzappadresinde ç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, veonErroriş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.
appdizini 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.jsdosyası 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.jsvelayout.js'dir.- Bir rotaya özgü kullanıcı arayüzü tanımlamak için
page.jsadresini kullanın. - Birden fazla rotada paylaşılan kullanıcı arayüzünü tanımlamak için
layout.jsadresini kullanın. .jsÖzel dosyalar için.jsxveya.tsxdosya 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ı
appdizini içine yerleştirebilirsiniz. Daha fazla bilgi edinin. getServerSidePropsvegetStaticPropsgibi veri getirme işlevleriappiçinde yeni bir API ile değiştirildi.getStaticPathsile değiştirildigenerateStaticParams.pages/_app.jsvepages/_document.jsadresleri tek birapp/layout.jskök düzeni ile değiştirilmiştir. Daha fazla bilgi edinin.pages/_error.jsdaha ayrıntılıerror.jsözel dosyaları ile değiştirilmiştir. Daha fazla bilgi edinin.pages/404.jsile değiştirilmiştir.not-found.jsDosya.pages/api/*şu andapagesdizini 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@latestArdı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>
)
}appdizini 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.tsxvepages/_document.tsxdosyalarının yerini alır. .js,.jsxveya.tsxuzantı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.jsadresinden kaldırın ve sayfalarıappdizinine taşıma adımlarını izleyin.app/dashboard/page.jsexport default function Page() { return <p>My Page</p> } -
pagesdizin davranışını korumak içinDashboardLayoutiç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> ) } -
DashboardLayoutadresiniappdizini içinde yeni birlayout.jsdosyası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
appdizinindeki sayfalar varsayılan olarak Sunucu Bileş enleridir. Bu, sayfaların İstemci Bileşenleri olduğupagesdizininden farklıdır.- Veri getirme
appadresinde değişmiştir.getServerSideProps,getStaticPropsvegetInitialPropsdaha basit bir API ile değiştirilmiştir. appdizini, rotaları tanımlamak için iç içe klasörler ve bir rota segmentini genel erişime açmak için özel birpage.jsdosyası kullanır.-
pagesRehberappRehberRota index.jspage.js/about.jsabout/page.js/aboutblog/[slug].jsblog/[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
appdizini içindeki yeni birpage.jsdosyasına aktarın.
Bilmekte fayda var: Bu en kolay geçiş yoludur çünkü
pagesdizini ile en benzer davranışa sahiptir.
Adım 1: Yeni bir İstemci Bileşeni Oluşturun
appdizini içinde (yaniapp/home-page.tsxveya 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.jsadresindenapp/home-page.tsxadresine 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
-
appdizini içinde yeni birapp/page.tsxdosyası oluşturun. Bu varsayılan olarak bir Sunucu Bileşenidir. -
home-page.tsxİstemci Bileşenini sayfaya aktarın. -
pages/index.jsadresinden 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
useRouteradresini 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
useRouterkancasınext/navigationadresinden içe aktarılmıştır vepagesadresindekiuseRouterkancasından farklı bir davranışa sahiptir venext/routeradresinden içe aktarılmıştır.-
next/routeradresinden içe aktarılanuseRouterkancasıappdizininde desteklenmez ancakpagesdizininde kullanılmaya devam edilebilir.
-
- Yeni
useRouter,pathnamedizesini döndürmez. Bunun yerine ayrıusePathnamekancasını kullanın. - Yeni
useRouter,querynesnesini döndürmez. Bunun yerine ayrıuseSearchParamskancasını kullanın. - Sayfa değişikliklerini dinlemek için
useSearchParamsveusePathnameadreslerini 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:
isFallbackkaldırılmıştır çünküfallbackdeğiştirilmiştir.locale,locales,defaultLocales,domainLocalesdeğerleri kaldırılmıştır çünkü yerleşik i18n Next.js özellikleriappdizininde artık gerekli değildir. i18n hakkında daha fazla bilgi edinin.basePathkaldırılmıştır. Alternatif,useRouteradresinin bir parçası olmayacaktır. Henüz uygulamaya konulmamıştır.asPathkaldırılmıştır çünküaskavramı yeni yönlendiriciden kaldırılmıştır.isReadyartı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.
generateStaticParamsgetStaticPaths 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)generateStaticParamsadresinde yer almayan dinamik segmentler talep üzerine oluşturulur.false:generateStaticParamsadresinde 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 dynamicParamstrue (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.