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:
npm install next@latest react@latest react-dom@latestESLint Sürümü
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'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-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: 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-imagecodemod'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:
import Link from 'next/link'
// Next.js 12: `<a>` iç içe geçmelidir, aksi takdirde hariç tutulur
<Link href="/about">
<a>About</a>
</Link>
// Next.js 13: `<Link>` her zaman arka planda `<a>` oluşturur
<Link href="/about">
About
</Link>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.jsdosyasına eklediğinizbeforeInteractivekomut dosyalarını kök düzen dosyasına (app/layout.tsx) taşıyın.Deneysel
workerstratejisi henüzappyö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,onReadyveonErroriş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.jsdosyası 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.jsvelayout.js'dir.page.jsdosyasını, bir rotaya özgü UI tanımlamak için kullanın.layout.jsdosyasını, birden fazla rotada paylaşılan UI tanımlamak için kullanın.
Özel dosyalar için
.js,.jsxveya.tsxdosya 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.
getServerSidePropsvegetStaticPropsgibi veri çekme fonksiyonları, uygulama içinde yeni bir API ile değiştirilmiştir.getStaticPaths,generateStaticParamsile değiştirilmiştir.pages/_app.jsvepages/_document.js, tek bir kök düzen olanapp/layout.jsile 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.jsdosyası ile değiştirilmiştir.pages/api/*şu andapagesdizini 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):
npm install next@latestArdı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.
// app/layout.tsx
export default function RootLayout({
// Layouts children prop'u kabul etmek zorundadır.
// Bu, iç içe düzenler veya sayfalarla doldurulacaktır
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}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.tsxvepages/_document.tsxdosyalarının yerini alır.Düzen dosyaları için
.js,.jsxveya.tsxuzantıları kullanılabilir.
<head> HTML öğelerini yönetmek için yerleşik SEO desteğini kullanabilirsiniz:
// app/layout.tsx
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Home",
description: "Welcome to Next.js",
};_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:
// pages/index.tsx
import Head from "next/head";
export default function Page() {
return (
<>
<Head>
<title>My page title</title>
</Head>
</>
);
}Sonrası:
// app/page.tsx
import { Metadata } from "next";
export const metadata: Metadata = {
title: "My Page Title",
};
export default function Page() {
return "...";
}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,getStaticPropsvegetInitialPropsdaha 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.jsdosyası kullanır.pagesDirectoryappDirectoryRoute
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 uygulama dizini içindeki yeni bir
page.jsdosyası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.
// app/home-page.tsx
"use client";
// Bu bir İstemci Bileşenidir. Verileri prop olarak alır ve
// tıpkı Sayfa bileşenleri gibi durum ve efektlere erişimi vardır
// `pages` dizininde.
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
Uygulama dizini içinde yeni bir
app/page.tsxdosyası oluşturun. Bu varsayılan olarak bir Sunucu Bileşenidir.Home-page.tsxİstemci Bileşenini sayfaya aktarın.pages/index.jsiçinden veri getiriyorsanız, yeni veri getirme API'lerini kullanarak veri getirme mantığını doğrudan Sunucu Bileşenine taşıyın.
// app/page.tsx
// İstemci Bileşeninizi İçe Aktarın
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() {
// Verileri doğrudan bir Sunucu Bileşeninde getirme
const recentPosts = await getPosts();
// Getirilen verileri İstemci Bileşeninize iletme
return <HomePage recentPosts={recentPosts} />;
}Önceki sayfanız
useRouterkullandıysa, yeni yönlendirme kancalarına güncellemeniz gerekir.Geliştirme sunucunuzu başlatın ve
http://localhost:3000adresini 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
useRouterhooknext/navigation'dan içe aktarılmıştır vepagesdizinindenext/router'dan içe aktarılanuseRouterhook ile farklı davranış gösterir.next/router'dan içe aktarılanuseRouterhook uygulama dizininde desteklenmez ancakpagesdizininde kullanılmaya devam edilebilir.Yeni
useRouter,pathnamedizgisini döndürmez. Bunun yerine ayrıusePathnamehook'unu kullanın.Yeni
useRouter,querynesnesini döndürmez. Bunun yerine ayrıuseSearchParamshook'unu kullanın.Sayfa değişikliklerini dinlemek için
useSearchParamsveusePathname'ı birlikte kullanabilirsiniz.Bu yeni hooklar yalnızca İstemci Bileşenlerinde desteklenir. 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();
// ...
}Ek olarak, yeni useRouter hook'u aşağıdaki değişikliklere uğramıştır:
isFallbackkaldırılmıştır çünküfallbackyerine konulmuştur.locale,locales,defaultLocales,domainLocalesdeğ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.basePathkaldırılmıştır. Alternatif,useRouter'ın bir parçası olmayacak. Henüz uygulanmamıştır.asPathkaldırılmıştır çünküaskavramı yeni yönlendiriciden kaldırılmıştır.isReadykaldı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
Was this helpful?