07 / 12
Navigasyon ve prefetch
Partial Prefetching, anında navigasyon, korunan state ve useLinkStatus.
Hızlı Navigasyonun Üç Parçası
Sayfalar sunucuda render edilir. Yani bir linke tıklayınca istemci sunucuyu beklemek zorunda kalabilir. Next.js bu beklemeyi üç şeyle gizler:1
Prefetch:
<Link>ekrana girince hedefi arka planda yükler.Streaming: Hazır olan kısım hemen gelir, gerisi
<Suspense>fallback'inin yerine akar.İstemci tarafı geçiş: Ortak layout'lar yerinde kalır, yalnızca değişen kısım yenilenir.
Partial Prefetching
Next.js 16.3 ile gelen Partial Prefetching, her rota için tek bir yeniden kullanılabilir App Shell üretir: URL'ye bağlı olmayan statik ve cache'li içerik, artı fallback'ler. Aynı rotaya giden yirmi link yirmi ayrı istek değil, tek bir App Shell paylaşır.23 create-next-app ile açılan projelerde açık gelir (partialPrefetching: true).
App Shell bütün linklerde ortak olduğu için tek bir URL'ye ait veri taşıyamaz. params ve searchParams bu yüzden URL verisi sayılır. Onları <Suspense> dışında okursanız geliştirmede "URL data outside of Suspense" uyarısı çıkar. Uyarı build'i kırmaz ama o rotaya geçişin anında olmasını engelleyebilir. Çözüm, params Promise'ini await etmeden bir child'a vermektir:4
// app/products/[slug]/page.tsx
export default function ProductPage({ params }: PageProps<"/products/[slug]">) {
return (
<Suspense fallback={<p>Ürün yükleniyor...</p>}>
<ProductDetails params={params} />
</Suspense>
);
}
async function ProductDetails({ params }: Pick<PageProps<"/products/[slug]">, "params">) {
const { slug } = await params;
const product = await getProduct(slug);
if (!product) notFound();
return <h1>{product.name}</h1>;
}cookies() ve headers() URL verisi değildir. Linke göre değil oturuma göre değişirler, App Shell'de kalabilirler.4
Ürün adı artık fallback'in arkasında. Tıklar tıklamaz görünsün istiyorsanız linke prefetch={true} verin. Bu, linkin params ve searchParams'ına bağlı cache'li içeriği de tıklamadan önce getirir. Bedeli her link için bir sunucu çağrısıdır; bu yüzden yalnızca en olası hedeflerde kullanın.24
<Link href={`/products/${product.slug}`} prefetch>
{product.name}
</Link>Bu rehberin proje uygulamasında prefetch olmadan ürün sayfasına geçişte yalnızca "Ürün yükleniyor..." göründü. prefetch ve "use cache"'li getProduct ile ürün adı tıklama anında geldi. Bunu koruyan instant() testi Ürün kataloğu projesinde.
Anında Navigasyon
Next.js'in tanımıyla bir navigasyon anında (instant) ise kullanıcı tıkladığı an statik, cache'li ve fallback içerik görünür; gerisi akarak gelir.5
İnce bir nokta var: sayfayı doğrudan açmak ile bir linkle gelmek farklıdır. Linkle gelirken yalnızca iki sayfanın ortak layout'unun altı yeniden render edilir. Kök layout'taki bir <Suspense> doğrudan açılışı kapsar ama /products/a'dan /products/b'ye geçişi kapsamaz.5 Bunu elle takip etmek zor olduğu için Cache Components geliştirmede her sayfayı iki durum için de doğrular ve geçişi kilitleyen component'i hata ekranında gösterir.56
Bir segmentin bilerek beklemesine izin vermek için:
// app/checkout/layout.tsx
export const instant = false;İki araç daha var:5
Navigation Inspector: Next.js DevTools'ta sayfayı ilk yükleme ya da prefetch edilmiş hâlinde dondurur. Kabukta ne kadar anlamlı içerik olduğunu görürsünüz.
instant()testi:@next/playwrightpaketindeki yardımcı, dinamik içeriği geri tutup yalnızca anında görünen arayüzü test etmenizi sağlar. Biri ileride kabuğu bozarsa CI'da yakalanır.
İpucu
16.4 ile gelen ensureStatic bunun bir adım ötesidir: bir sayfanın kabuğunun ya da tamamının statik kalmasını zorunlu kılar; biri istek anında çalışan kod eklerse build kırılır.7
Activity: Geri Dönünce State Yerinde
Cache Components açıkken Next.js, ayrıldığınız sayfayı silmez; React'in <Activity> component'iyle gizler. Geri döndüğünüzde form taslağı, scroll konumu ve açık bir <details> olduğu gibi durur. Effect'ler gizlenince temizlenir, görünür olunca yeniden kurulur. En fazla son üç rota saklanır.89
Bu her zaman istenen davranış değildir. Bir açılır menü geri dönünce hâlâ açık durmamalı. Doküman bunu useLayoutEffect'in cleanup'ında state'i sıfırlayarak çözer:8
"use client";
import { useLayoutEffect, useState } from "react";
export function SortMenu() {
const [isOpen, setIsOpen] = useState(false);
useLayoutEffect(() => {
return () => setIsOpen(false);
}, []);
return (
<div>
<button onClick={() => setIsOpen(!isOpen)}>Sırala</button>
{isOpen && <ul>{/* seçenekler */}</ul>}
</div>
);
}Uyarı
Gizlenen sayfa display: none ile DOM'da kalır. Uçtan uca testte page.locator("h1") iki başlık bulabilir. Bu rehberin proje uygulamasında tam olarak bu oldu. Görünürlüğe bakan getByRole ve getByLabel sorgularını kullanın.8 Playwright'ın kendisi Playwright rehberinde.
Yavaş Ağda Geri Bildirim
Ağ yavaşsa prefetch tıklamadan önce bitmeyebilir. useLinkStatus, tıklanan linkin beklemede olduğunu söyler; linkin içine küçük bir gösterge koyabilirsiniz:110
"use client";
import { useLinkStatus } from "next/link";
export function PendingDot() {
const { pending } = useLinkStatus();
return pending ? <span aria-hidden>•</span> : null;
}<Link href="/cart">
Sepet <PendingDot />
</Link>Göstergeyi kısa bir gecikmeyle (ör. 100 ms) görünür yapmak, hızlı geçişlerde yanıp sönmesini önler.1 Binlerce linkli listelerde prefetch={false} vererek gereksiz isteği kesebilirsiniz; karşılığında o sayfalar tıklanınca yüklenir.1
Geçişleri canlandırmak için React 19.3'te kararlı hâle gelen <ViewTransition>'ı kullanabilirsiniz. Next.js'in rehberi küçük resmin büyük görsele dönüşmesinden yön bildiren geçişlere kadar örnekler veriyor.11 React tarafı View Transition ve Activity dersinde.
Kendin Dene
Ürün listesinde
next build && next startile production'da çalışın. Network sekmesinde linkler ekrana girince gelen prefetch isteklerini izleyin. (Geliştirmede prefetch yapılmaz.)Bir ürün linkine
prefetchverin ve gelen isteği diğerleriyle karşılaştırın.Ürün sayfasına bir
<input>koyun, bir şey yazın, başka sayfaya gidip geri dönün. Yazdığınız duruyor mu?Navigation Inspector'da Pause on navigations'ı açıp bir linke tıklayın. Kabukta ne görünüyor?
Detaylı Öğrenmek İçin
Resmi doküman: "Building App-like Experiences with Next.js 16.3"; Aurora Scharff'ın da yazarları arasında olduğu, anında navigasyonu bir uygulama üzerinden anlatan yazı.12
Resmi doküman: "Instant Navigation" rehberi; kilitlenen bir navigasyonu adım adım anında hâle getirmek ve
instant()testleri.5Resmi doküman: "Preserving UI state" rehberi; Activity'nin neyi koruduğu ve neyi sıfırlamanız gerektiği.8
Video: Next.js Conf 2025 açılış konuşmasının anında navigasyon ve Cache Components bölümü.13
Kaynaklar
Prefetch, streaming, istemci tarafı geçiş, yavaş ağ, `useLinkStatus` ve prefetch'i kapatmak.
Rota başına App Shell, `prefetch={true}` ile link bazlı prefetch ve sürüm geçmişi.
Partial Prefetching, Instant Insights, Navigation Inspector ve `instant()` yardımcısı.
URL verisinin App Shell'e girmemesi, `params`'ı `<Suspense>` içine taşımak ve `prefetch={true}` ile URL verisini önceden getirmek.
"Anında"nın tanımı, doğrudan açılış ile istemci geçişi farkı, doğrulama, inceleme ve e2e testleri.
`instant` export'u, doğrulama seviyeleri ve Navigation Inspector.
16.4. App Shell, prefetch ya da tüm rotanın statik kalmasını zorunlu kılmak.
Activity ile korunan state, sıfırlama kalıpları ve görünürlüğe duyarlı test seçicileri.
Navigasyonda Activity kullanımı ve Effect'lerin temizlenmesi.
Bekleyen navigasyonu göstermek ve hızlı geçişte göstergeyi geciktirmek.
Görsel morph, Suspense açılışları ve yönlü geçişler.
Cache Components ve Partial Prefetching ile uygulama gibi hissettiren navigasyon.
22 Ekim 2025. 14:16'dan itibaren anında navigasyon ve Cache Components.
Son güncelleme tarihi: 21 Ekim 2026
