App Router Artırımlı Benimseme Kılavuzu
Yükseltme
Node.js Sürümü
Minimum Node.js sürümü artık v18.17'dir. Daha fazla bilgi için Node.js belgelerine bakın.
Next.js Sürümü
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:
ESLint Sürümü
ESLint kullanıyorsanız, ESLint sürümünüzü yükseltmeniz gerekir:
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'ta ctrl+shift+p
) ve ESLint'i arayın: ESLint: Restart ESLint Server
.
Sonraki Adımlar
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.
Sayfalardan uygulama dizinine geçiş: Sayfalardan uygulama dizinine aşamalı olarak geçiş yapmanıza adım adım yardımcı olacak kılavuz.
Yeni Özelliklere Yükseltilmesi
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 Görüntü bileşeni, Bağlantı bileşeni, Komut Dosyası bileşeni ve Yazı Tipi optimizasyonu gibi her iki dizinde de çalışan yeni özelliklere sahip sayfaları kullanmaya devam edebilirsiniz.
<Image/>
Bileşeni
<Image/>
BileşeniNext.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ıda lazy loading 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: Tehlikeli bir şekilde satır içi stiller ekler ve kullanılmayan propları 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>
Bileşeni
<Link>
Bileşeni<Link>
Bileşeni artık alt öğe olarak manuel olarak bir <a>
etiketi eklemeyi 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>
bileşeni her zaman <a>
olarak görünür ve altta yatan etikete prop'ları yönlendirmenize olanak tanır.
Örneğin:
Bağlantılarınızı Next.js 13'e yükseltmek için new-link codemod
'u kullanabilirsiniz.
<Script>
Bileşeni
<Script>
Bileşeninext/script
'in davranışı hem pages
hem de app
yönlendiricisini destekleyecek şekilde güncellendi, ancak sorunsuz bir geçiş sağlamak için bazı değişikliklerin yapılması gerekiyor:
Daha önce
_document.js
dosyasına eklediğinizbeforeInteractive
komut dosyalarını kök düzen dosyasına (app/layout.tsx
) taşıyın.Deneysel
worker
stratejisi henüzapp
yönlendiricisinde çalışmamaktadır ve bu stratejiyle gösterilen komut dosyalarının kaldırılması ya da farklı bir strateji (örn.lazyOnload
) kullanacak şekilde değiştirilmesi gerekecektir.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.
Yazı Tipi Optimizasyonu
Daha önce Next.js, inlining font CSS yaparak fontları optimize etmenize yardımcı oluyordu. Sürüm 13, mükemmel performans ve gizlilik sağlarken yazı tipi yükleme deneyiminizi özelleştirmenize olanak tanıyan yeni next/font
modülünü sunar. next/font
hem pages
hem de app
yönlendiricisinde desteklenir.
CSS inlining hala pages
yönlendiricisinde çalışsa da, app
yönlendiricisinde çalışmaz. Bunun yerine next/font
kullanmalısınız.
next/font
öğesinin nasıl kullanılacağını öğrenmek için Yazı Tipi Optimizasyonu sayfasına bakın.
Sayfalardan uygulamaya geçiş
🎥 İzleyin: App Router'ı kademeli olarak nasıl benimseyeceğinizi öğrenin → YouTube (16 dakika).
App Yönlendiricisine geçiş ile birlikte, 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ışacak şekilde tasarlanmıştır.
Next.js'in uygulama dizini, iç içe geçmiş rotaları ve düzenleri destekler. Daha fazla bilgi için buraya tıklayın.
İç içe klasörler kullanarak rotaları tanımlayabilir ve özel bir
page.js
dosyası kullanarak bir rota segmentini genel olarak erişilebilir hale getirebilirsiniz. Daha fazla bilgi için buraya tıklayın.Her rota segmenti için UI oluşturmak için özel dosya kuralları kullanılır. En yaygın özel dosyalar
page.js
velayout.js
'dir.page.js
dosyasını, bir rotaya özgü UI tanımlamak için kullanın.layout.js
dosyasını, birden fazla rotada paylaşılan UI tanımlamak için kullanın.
Özel dosyalar için
.js
,.jsx
veya.tsx
dosya uzantıları kullanılabilir.Uygulama dizini içinde bileşenler, stiller, testler ve daha fazlası gibi diğer dosyaları bir arada bulundurabilirsiniz. Daha fazla bilgi için buraya tıklayın.
getServerSideProps
vegetStaticProps
gibi veri çekme fonksiyonları, uygulama içinde yeni bir API ile değiştirilmiştir.getStaticPaths
,generateStaticParams
ile değiştirilmiştir.pages/_app.js
vepages/_document.js
, tek bir kök düzen olanapp/layout.js
ile değiştirilmiştir. Daha fazla bilgi için buraya tıklayın.pages/_error.js
, daha ayrıntılıerror.js
özel dosyaları ile değiştirilmiştir. Daha fazla bilgi için buraya tıklayın.pages/404.js
,not-found.js
dosyası ile değiştirilmiştir.pages/api/*
şu andapages
dizini içinde kalmaktadır.
Adım 1: Uygulama dizinini oluşturma
En son Next.js sürümüne güncelleyin (13.4 veya üstü gerekir):
Ardından, projenizin kök dizininde (veya src/ dizininde) yeni bir uygulama dizini oluşturun.
Adım 2: Root Layout Oluşturma
Uygulama 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.
Uygulama dizini bir root layout içermelidir.
Next.js bunları otomatik olarak oluşturmadığı için root layout
<html>
ve<body>
etiketlerini tanımlamalıdırRoot layout
pages/_app.tsx
vepages/_document.tsx
dosyalarının yerini alır.Düzen dosyaları için
.js
,.jsx
veya.tsx
uzantıları kullanılabilir.
<head>
HTML öğelerini yönetmek için yerleşik SEO desteğini kullanabilirsiniz:
_document.js
ve _app.js
'den taşıma
_document.js
ve _app.js
'den taşımaMevcut 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
dosyasındaki stiller pages/*
için geçerli olmayacaktır. pages/*
rotalarınızın bozulmasını önlemek için taşıma sırasında _app
_document
dosyasını 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.
getLayout()
şablonunu Layouts'a taşıma (İsteğe bağlı)
getLayout()
şablonunu Layouts'a taşıma (İsteğe bağlı)Next.js, sayfalar dizininde sayfa başına düzenler elde etmek için Sayfa bileşenlerine bir özellik eklemeyi önerdi. Bu model, uygulama dizininde iç içe düzenler için yerel destek ile değiştirilebilir.
Adım 3: next/head
kısmından taşınma
next/head
kısmından taşınmaPages
dizininde, next/head
React bileşeni başlık ve meta gibi <head>
HTML öğelerini yönetmek için kullanılır. Uygulama dizininde, next/head
yeni yerleşik SEO desteği ile değiştirilir.
Öncesi:
Sonrası:
Adım 4: Sayfalardan Taşıma
Uygulama dizinindeki sayfalar varsayılan olarak Sunucu Bileşenleridir. Bu, sayfaların İstemci Bileşenleri olduğu pages dizininden farklıdır.
Uygulamada veri fetch etme 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 bir
page.js
dosyası kullanır.pages
Directoryapp
DirectoryRoute
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 uygulama dizini içindeki yeni bir
page.js
dosyasına aktarın.
Bilmekte fayda var: Bu en kolay geçiş yoludur çünkü pages dizinine en benzer davranışa sahiptir.
Adım 1: Yeni bir İstemci Bileşeni Oluşturun
Uygulama dizini içinde (örn. app/home-page.tsx
veya benzeri) bir İstemci Bileşeni dışa aktaran yeni bir ayrı dosya oluşturun. İstemci Bileşenlerini tanımlamak için dosyanın en üstüne (tüm içe aktarmalardan önce) 'use client' yönergesini ekleyin.
Varsayılan dışa aktarılan sayfa bileşenini pages/index.js
dosyasından app/home-page.tsx
dosyasına taşıyın.
Adım 2: Yeni bir sayfa oluşturun
Uygulama dizini içinde yeni bir
app/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
içinden veri getiriyorsanız, yeni veri getirme API'lerini kullanarak veri getirme mantığını doğrudan Sunucu Bileşenine taşıyın.
Önceki sayfanız
useRouter
kullandıysa, yeni yönlendirme kancalarına güncellemeniz gerekir.Geliştirme sunucunuzu başlatın ve
http://localhost:3000
adresini ziyaret edin. Artık uygulama dizini üzerinden sunulan mevcut dizin rotanızı görmelisiniz.
Adım 5: Yönlendirme hooklarının Taşınması
Uygulama dizinindeki yeni davranışları desteklemek için yeni bir yönlendirici eklendi.
Uygulama dizininde,
next/navigation
'dan içe aktarılan üç yeni hook kullanılmalıdır:useRouter()
,usePathname()
, veuseSearchParams()
.Yeni
useRouter
hooknext/navigation
'dan içe aktarılmıştır vepages
dizinindenext/router
'dan içe aktarılanuseRouter
hook ile farklı davranış gösterir.next/router
'dan içe aktarılanuseRouter
hook uygulama dizininde desteklenmez ancakpages
dizininde kullanılmaya devam edilebilir.Yeni
useRouter
,pathname
dizgisini döndürmez. Bunun yerine ayrıusePathname
hook'unu kullanın.Yeni
useRouter
,query
nesnesini döndürmez. Bunun yerine ayrıuseSearchParams
hook'unu kullanın.Sayfa değişikliklerini dinlemek için
useSearchParams
veusePathname
'ı birlikte kullanabilirsiniz.Bu yeni hooklar yalnızca İstemci Bileşenlerinde desteklenir. Sunucu Bileşenlerinde kullanılamazlar.
Ek olarak, yeni useRouter
hook'u aşağıdaki değişikliklere uğramıştır:
isFallback
kaldırılmıştır çünküfallback
yerine konulmuştur.locale
,locales
,defaultLocales
,domainLocales
değerleri kaldırılmıştır çünkü uygulama dizininde yerleşik i18n Next.js özellikleri artık gerekli değildir. i18n hakkında daha fazla bilgi edinin.basePath
kaldırılmıştır. Alternatif,useRouter
'ın bir parçası olmayacak. Henüz uygulanmamıştır.asPath
kaldırılmıştır çünküas
kavramı yeni yönlendiriciden kaldırılmıştır.isReady
kaldırılmıştır çünkü artık gerekli değildir. Statik renderlama sırasında,useSearchParams()
kanca kullanan herhangi bir bileşen, ön işleme adımını atlayacak ve bunun yerine çalışma zamanında istemcide render edilecektir.
Adım 6: Veri Getirme Yöntemlerini Taşıma
//Translation of this page is not completed and not merged yet.
Last updated