Sayfalar
Bu belge, Next.js'nin 9.3 ve üstü versiyonları için hazırlanmıştır. Eğer daha eski versiyonları kullanıyorsanız önceki dokümantasyonumuza bakmalısınız.
Next.js'de sayfalar pages
klasöründeki js, jsx, ts veya tsx dosyalarından export edilen React component'leridir. Her sayfa, dosya adına göre bir rota ile ilişkilendirilir.
Örnek: Eğer aşağıdaki gibi bir React component'i export eden pages/about.js
dosyası oluşturursanız buna /about
üzerinden erişebileceksiniz.
Dinamik Rotalı Sayfalar
Next.js dinamik rotalı sayfaları destekler. Mesela eğer pages/posts/[id].js
şeklinde bir dosya oluşturursanız buna posts/1
, posts/2
vb şekilde erişebilirsiniz.
Dinamik routing ile ilgili daha fazla bilgi için Dynamic Routing dokümantasyonuna bakın.
Pre-rendering (Ön işleme)
Varsayılan olarak Next.js her sayfayı önceden işler. Yani sayfa HTML'ninin istemci tarafında JavaScript ile oluşturulması yerine, istemci tarafında HTML oluşturulup istemciye öyle gönderilir. Bu pre-rendering bize daha iyi bir performans ve SEO sağlar.
Oluşturulan her HTML, o sayfa için gerekli olan minimum JavaScript koduyla ilişkilendirilir. Bir sayfa tarayıcı tarafından yüklendiğinde JavaScript kodu çalışır ve sayfayı tamamen etkileşimli hale getirir. (Bu işleme hydration/hidrasyon denir)
Pre-rendering'in iki biçimi
Next.js'nin iki ön işleme (pre-rendering) biçimi vardır: Statik Oluşturma ve Sunucu Taraflı İşleme. Fark, HTML'nin ne zaman oluşturulduğundadır.
****Static Generation (Önerilen): HTML, derleme (build) sırasında oluşturulur ve her request'te aynı HTML yeniden kullanılır.
****Server-side Rendering: HTML, her request'te oluşturulur.
Next.js, her sayfa için kullanmak istediğiniz pre-rendering biçimini seçmenize izin verir. Çoğu sayfa için Statik Oluşturma'yı ve bazı sayfalar için de Sunucu Taraflı İşleme'yi kullanarak hibrit bir Next.js uygulaması oluşturabilirsiniz.
Performans için Server-side Rendering yerine Static Generation kullanmanızı öneririz. Statik oluşturulmuş sayfalar, performansı artırmak için ekstra yapılandırma olmadan CDN tarafından önbelleğe alınabilirler. Ama bazı durumlarda Server-side Rendering kullanmaya mecbur kalabilirsiniz.
Static Generation veya Server-side Rendering kullanırken Client-side Rendering de kullanabilirsiniz. Yani sayfanın bazı bölümlerini tamamen client side JavaScript ile oluşturabilirsiniz. Daha fazla bilgi için Veri Getirme sayfasını inceleyin.
Static Generation (Önerilen)
Eğer bir sayfa Static Generation kullanıyorsa, sayfa HTML'si derleme sırasında, yani next build
komutu verilince oluşturulur. Bu HTML daha sonra her istekte yeniden kullanılır ve CDN tarafından önbelleğe alınabilir.
Next.js'de oluşturduğunuz statik sayfalar data içerebilir veya içermeyebilir. Bunu biraz inceleyelim...ç
Verisiz Static Generation
Varsayılan olarak Next.js veriler olmadan Static Generation kullanarak sayfaları pre-render eder. Mesela:
Bu sayfa pre-render edilecek harici bir veriye ihtiyaç duymuyor. Bu gibi durumlarda Next.js derleme yaparken sayfa başına tek bir HTML dosyası oluşturur.
Verili Static Generation
Bazı sayfalar pre-render edilmek için harici verilere ihtiyaç duyarlar. Bununla ilgili iki senaryo var. Biri veya her ikisi birden geçerli olabilir. Her durumda, Next.js'nin sağladığı özel bir işlevi kullanabilirsiniz:
Senaryo 1: Sayfa içeriğiniz harici verilere bağlıdır.
Örnek: Blog sayfanızın bir CMS'den (içerik yönetim sisteminden) içerik alması gerekebilir.
Bu verileri pre-render'de getirmek için Next.js, aynı dosyadan getStaticProps
adlı async
bir fonksiyonu export
etmenize olanak verir. Bu fonksiyon build sırasında çağırılır ve alınan verileri pre-rendering sırasında sayfanın props
'larına iletmenize olanak tanır.
getStaticProps
'un nasıl çalıştığı hakkında daha fazla bilgili edinmek için Veri Getirme Sayfasına bakın.
Senaryo 2: Sayfanıza dinamik bir rotasyon ile ulaşılıyordur.
Next.js ile dinamik rotalı sayfalar oluşturabilirsiniz. Örneğin id
değerine bakarak tek bir blog post'unu göstermesi için pages/posts/[id].js
yoluna sahip bir dosya oluşturabilirsiniz. Bu şekilde, posts/1
ile sayfaya eriştiğinizde id: 1
prop'u ile post'u gösterebilirsiniz.
Dinamik routing ile ilgili daha fazla bilgi almak için Dynamic Routing dokümantasyonunu inceleyin.
Ancak, id
değeri, harici bir kaynaktan veri almak için kullanılacak olabilir.
Örnek: Veritabanına yalnızca bir tane id:1
olan blog post'u eklediğinizi varsayalım. Bu durumda posts/1
ile gösterilecek sayfayı derleme anında buna göre düzenleyerek pre-render etmek isteyeceksiniz.
Daha sonra id:2
değerine sahip ikinci post'u da ekleyebilirsiniz. Bu durumda da posts/2
için de pre-render oluşturmak istersiniz.
Bu örnekte, pre-render edilmiş sayfanızın yolları harici verilere bağlıdır. Bunu halletmek için Next.js, dinamik bir sayfadan getStaticPaths
adlı bir async
fonksiyonu export
etmenize izin verir (Bu örnekte pages/posts/[id].js
). Bu fonksiyon, derleme sırasında çağırılır ve hangi yolları pre-render etmek istediğinizi belirtmenize olanak tanır.
Ayrıca page/posts/[id].js
'de bu id
'ye sahip post hakkındaki verileri alabilmeniz ve sayfayı pre-render sırasında oluşturmanız için getStaticProps
'u dışa aktarmanız gerekir.
getStaticPaths
'ın nasıl çalıştığı hakkında daha fazla bilgi edinmek için Veri Getirme başlığına bakın.
Ne zaman Static Generation Kullanmalıyım?
Sayfanız bir kez build edilir ve CDN tarafından önbelleğe alınabilir. Yani her request'te sayfayı yeniden oluşturmak için sunucuyu yormazsınız ve sayfalara erişim çok daha hızlı olur.
Aşağıdakiler dahil birçok sayfa türü için Static Generation'u kullanabilirsiniz:
Pazarlama sayfaları
Blog gönderileri
E-ticaret ürün listelemeleri
Yardım ve dokümantasyon sayfaları
Şunu kendinize sormalısınız: "Ben bu sayfayı daha kullanıcı istemeden önce oluşturabilir miyim?" Cevabınız "evet" ise Static Generation (Statik OLuşturma) doğru seçimdir.
Öte yandan, kullanıcının isteğinden önce sayfanın oluşturulması mümkün değilse Static Generation iyi bir fikir değildir. Belki sayfanız sık güncellenen veriler gösteriyor ve sayfa içeriği her istekte değişiyor olabilir.
Bu gibi durumlarda aşağıdakilerden birini yapabilirsiniz:
Static Generation'u Client-side Rendering ile kullanın: Bir sayfanın bazı bölümlerini pre-render etmeyi atlayabilir ve ardından bunları doldurmak için client-side JavaScript'i kullanabilirsiniz. Bu yaklaşım hakkında daha fazla bilgi edinmek için yine Veri Getirme başlığını inceleyin.
Server-side Rendering kullanın: Next.js sayfayı her istekte yeniden pre-render eder. Bu yavaş olacaktır çünkü sayfa CDN tarafından önbelleğe alınmamıştır. Ama pre-render edilen sayfanız her zaman güncel kalacaktır. Aşağıdaki başlıkta bu yaklaşım hakkında konuşacağız.
Server-side Rendering
"SSR" veya "Dinamic Rendering" olarak da anılır.
Eğer bir sayfa sunucu taraflı render yapıyorsa sayfa HTML'si her requestte yeniden oluşturulur.
Bir sayfayı sunucu taraflı render etmek için getServerSideProps
adlı bir async
fonksiyonu export
etmeniz gerekir. Bu fonksiyon her istekte sunucu tarafından çağırılır.
Mesela varsayalım ki sayfanız sık sık harici bir API tarafından güncellenerek pre-render edilmeye ihtiyaç duyuyor. Bu güncellenen verileri sayfanıza aktarmak için aşağıdaki gibi getServerSideProps
yazabilirsiniz:
Gördüğünüz gibi getServerSideProps
, getStaticProps
'a benzer. Aralarındaki fark: getServerSideProps
derleme anında sayfanın oluşturulması yerine her istekte sayfanın oluşturulmasını sağlar.
getServerSideProps
'un nasıl çalıştığını öğrenmek için Veri Getirme başlığına bakın.
Özet
Next.js'nin iki pre-render biçimini gördük.
Static Generation (Önerilen): HTML, build sırasında oluşturulur ve her istekte yeniden kulanılır. Bir sayfanın Static Generation kullanmasını sağlamak için ya sayfa component'ini
export
edin ya dagetStaticProps
(veya gerekliysegetStaticPaths
) export edin. Bu yöntem, kullanıcının isteğinden önce hazır edilebilecek sayfalar için harikadır. Bu sayfaya ek veriler getirmek isterseniz Client-side Rendering de kullanabilirsiniz.Server-side Rendering: HTML, her request'te yeniden oluşturulur. Sayfayı Server-side Rendering ile oluşturacaksanız
getServerSideProps
'uexport
edersiniz. Server-side Rendering, Static Generation'a göre daha yavaş kalacağı için bunu yalnızca gerekliyse kullanmalısınız.
Daha Fazlasını Öğrenin
Buradan sonra aşağıdakilerden biriyle devam etmenizi öneririz:
Last updated