React ve Next.js ile Güçlü Bir Başlangıç: Modern Web Uygulamaları Geliştirme Rehberi
Modern web geliştirme dünyası, kullanıcı deneyimi, performans ve geliştirici verimliliği gibi konularda sürekli yeni standartlar belirlemektedir. Bu dinamik ortamda, geliştiricilerin güçlü ve esnek araçlara ihtiyacı vardır. İşte tam bu noktada, React ve Next.js ikilisi sahneye çıkarak, web uygulamaları geliştirme sürecini baştan aşağı dönüştürmektedir. Bu makale, React’in temel prensiplerinden başlayarak, Next.js’in sunduğu gelişmiş özelliklere kadar geniş bir yelpazeyi kapsayacak ve bu güçlü kombinasyonla nasıl “güçlü bir başlangıç” yapabileceğinizi detaylı bir şekilde açıklayacaktır. İster deneyimli bir geliştirici olun ister web dünyasına yeni adım atıyor olun, bu rehber size modern web uygulamaları oluşturmak için sağlam bir temel sunacaktır.
React’e Hızlı Bir Bakış
Web arayüzleri geliştirmek için en popüler JavaScript kütüphanelerinden biri olan React, Facebook tarafından geliştirilmiş ve açık kaynak olarak kullanıma sunulmuştur. Bileşen tabanlı mimarisi, deklaratif yaklaşımı ve sanal DOM kullanımı ile React, karmaşık kullanıcı arayüzlerini yönetmeyi ve geliştirmeyi önemli ölçüde kolaylaştırır.
React Nedir?
React, kullanıcı arayüzleri (UI) oluşturmak için kullanılan bir JavaScript kütüphanesidir. Bir framework değil, yalnızca “view” katmanına odaklanan bir kütüphane olması, onu diğer araçlarla kolayca entegre edilebilir kılar. React’in temel felsefesi, uygulamanızın UI’ını küçük, bağımsız ve yeniden kullanılabilir parçalara, yani “bileşenlere” ayırmaktır. Bu bileşenler, kendi içlerinde durum (state) barındırabilir ve verileri (props) alarak dinamik arayüzler oluşturabilirler. React, verinin değişimine göre arayüzün nasıl görünmesi gerektiğini deklaratif bir şekilde tanımlamanıza olanak tanır. Sanal DOM (Virtual DOM) kullanarak performansı artırır; gerçek DOM üzerinde doğrudan manipülasyon yapmak yerine, önce sanal bir kopyasını günceller ve ardından sadece değişen kısımları gerçek DOM’a yansıtır. Bu yaklaşım, özellikle büyük ve veri yoğun uygulamalarda performans avantajı sağlar.
Neden React?
React’in bu denli popüler olmasının ve tercih edilmesinin birçok nedeni vardır:
* Bileşen Tabanlı Mimari: Uygulamaları küçük, izole ve yeniden kullanılabilir bileşenlere bölmek, kodun daha düzenli, okunabilir ve bakımı kolay olmasını sağlar. Bu, özellikle büyük ekiplerle çalışırken veya karmaşık uygulamalar geliştirirken büyük bir avantajdır.
* Declarative Yaklaşım: React, uygulamanın UI’ının belirli bir durumda nasıl görünmesi gerektiğini tanımlamanızı sağlar. Veri değiştiğinde, React otomatik olarak UI’ı günceller. Bu, geliştiricilerin “nasıl” sorusundan çok “ne” sorusuna odaklanmasını sağlar ve hata ayıklamayı kolaylaştırır.
* Performans: Sanal DOM, gerçek DOM manipülasyonlarının maliyetini azaltarak uygulamaların daha hızlı ve akıcı çalışmasını sağlar. React, sadece değişen kısımları optimize edilmiş bir şekilde günceller.
* Büyük Ekosistem ve Topluluk: React, dünya genelinde devasa bir geliştirici topluluğuna sahiptir. Bu, bol miktarda kaynak, kütüphane, araç ve destek anlamına gelir. Karşılaştığınız çoğu soruna hızlıca çözüm bulabilirsiniz.
* Esneklik: React, yalnızca UI katmanına odaklandığı için, routing, state yönetimi veya veri çekme gibi konularda size özgürlük tanır. İhtiyaçlarınıza en uygun kütüphaneleri ve araçları seçebilirsiniz (örneğin, React Router, Redux, Context API).
* Geliştirici Araçları: Tarayıcılar için sunulan React Developer Tools eklentisi, bileşen hiyerarşisini inceleme, state ve props değerlerini takip etme gibi özelliklerle geliştirme ve hata ayıklama sürecini büyük ölçüde kolaylaştırır.
React Temelleri
React ile çalışmaya başlamak için bilmeniz gereken bazı temel kavramlar şunlardır:
* JSX (JavaScript XML): React ile UI oluştururken HTML’e benzeyen bir sözdizimi kullanırsınız. JSX, JavaScript içinde XML benzeri etiketler yazmanıza olanak tanır. Bu, UI’ı tanımlamayı daha sezgisel hale getirir ve bileşenlerin render çıktısını görsel olarak tasarlamanıza yardımcı olur. Örneğin, ` doğrudan JavaScript kodu içinde kullanılabilir.React.Component
* Bileşenler (Components): React uygulamalarının yapı taşlarıdır. İki ana türü vardır:
* Fonksiyonel Bileşenler: Genellikle bir JavaScript fonksiyonu olarak tanımlanır ve props adı verilen argümanları alır, ardından JSX döndürür. React Hooks'un tanıtılmasıyla birlikte, fonksiyonel bileşenler artık state ve yaşam döngüsü özelliklerini de kullanabilmektedir.
* Sınıf Bileşenleri: Bir JavaScript sınıfı olarak tanımlanır ve sınıfından türetilir. render() metodu içinde JSX döndürürler. this.state ile durumu yönetir ve yaşam döngüsü metotlarını kullanırlar. Günümüzde Hooks sayesinde fonksiyonel bileşenler daha yaygın hale gelmiştir.
* Props (Properties): Bileşenler arasında veri aktarımını sağlayan mekanizmadır. Üst bileşenden alt bileşene veri göndermek için kullanılırlar ve immutable (değiştirilemez) olmaları beklenir. Bir fonksiyonun argümanlarına benzetilebilirler. Örneğin, burada isim bir prop'tur.useState
* State ve Hook'u: State, bir bileşenin kendi içinde yönettiği ve zamanla değişebilen verilerdir. Bir bileşenin state'i değiştiğinde, React bileşeni yeniden render eder. Fonksiyonel bileşenlerde state yönetimi için useState Hook'u kullanılır. Örneğin, const [sayac, setSayac] = useState(0); sayac adında bir state değişkeni ve onu güncelleyen bir fonksiyon tanımlar.useEffect
* Lifecycle Hooks ve Hook'u: Sınıf bileşenlerinde componentDidMount, componentDidUpdate, componentWillUnmount gibi yaşam döngüsü metotları bulunurken, fonksiyonel bileşenlerde bu işlevler useEffect Hook'u ile sağlanır. useEffect, bileşen render edildikten sonra yan etkileri (veri çekme, DOM manipülasyonu, olay dinleyicileri kurma/kaldırma) gerçekleştirmenizi sağlar.if/else
* Koşullu Renderlama ve Listeleri Renderlama: React, belirli koşullara göre farklı UI elemanlarını göstermenize olanak tanır (örneğin, veya üçlü operatörler ile). Listeleri renderlarken ise, bir dizi veri üzerinde map() metodu kullanarak her bir öğe için bir bileşen oluşturulur ve her öğeye benzersiz bir key prop'u verilmesi önemlidir.
Next.js ile Tanışma: React Uygulamalarını Bir Üst Seviyeye Taşıma
React, kullanıcı arayüzleri geliştirmek için harika bir kütüphane olsa da, tek başına tam teşekküllü, üretimde kullanıma hazır bir web uygulaması oluşturmak için routing, veri çekme, performans optimizasyonları ve SEO gibi birçok ek araç ve yapılandırma gerektirir. İşte Next.js, bu boşluğu dolduran ve React uygulamalarını bir sonraki seviyeye taşıyan güçlü bir React framework'üdür. Vercel tarafından geliştirilen Next.js, geliştiricilerin hızlı, ölçeklenebilir ve SEO dostu React uygulamaları oluşturmasını sağlar.
Next.js Nedir?
Next.js, React tabanlı sunucu tarafı render (SSR), statik site oluşturma (SSG) ve artımlı statik yenileme (ISR) gibi özellikler sunan açık kaynaklı bir JavaScript framework'üdür. Geliştiricilere "production-ready" uygulamalar için ihtiyacınız olan her şeyi sunar: otomatik kod bölme, dosya sistemi tabanlı yönlendirme, API rotaları, resim optimizasyonu ve daha fazlası. Next.js, modern web uygulamalarının performans, SEO ve geliştirici deneyimi (DX) beklentilerini karşılamak üzere tasarlanmıştır.
Neden Next.js?
Next.js'i tercih etmek için birçok güçlü neden bulunmaktadır:
* Performans ve SEO: Next.js, sunucu tarafı render (SSR) ve statik site oluşturma (SSG) gibi tekniklerle ilk yükleme sürelerini kısaltır ve arama motorları için daha iyi indekslenebilirlik sağlar. Bu, özellikle e-ticaret siteleri, bloglar ve haber portalları gibi SEO'nun kritik olduğu uygulamalar için hayati öneme sahiptir.
* Geliştirici Deneyimi (DX): Next.js, otomatik kod bölme, hızlı yenileme (Fast Refresh), dosya sistemi tabanlı yönlendirme gibi özelliklerle geliştirme sürecini son derece verimli hale getirir. Geliştiricilerin altyapı yapılandırması yerine uygulama mantığına odaklanmasını sağlar.
* Full-Stack Yetenekleri (API Rotaları): Next.js, pages/api dizini altında sunucu tarafı kod yazmanıza olanak tanıyan API rotaları sunar. Bu sayede, aynı Next.js projesi içinde hem ön yüzü hem de basit bir arka yüzü barındırabilir, veritabanı etkileşimleri veya harici API entegrasyonları gibi işlemleri kolayca yapabilirsiniz.next/image
* Otomatik Kod Bölme (Automatic Code Splitting): Next.js, her sayfa için gerekli JavaScript kodunu otomatik olarak böler. Bu, kullanıcıların yalnızca ziyaret ettikleri sayfa için gerekli kodu indirmesini sağlayarak ilk yükleme süresini ve uygulamanın genel performansını iyileştirir.
* Gömülü Optimizasyonlar: Resim optimizasyonu (), font optimizasyonu (next/font), script optimizasyonu (next/script) gibi hazır optimizasyon araçları sunar. Bu, geliştiricilerin manuel olarak karmaşık optimizasyonlar yapmak zorunda kalmadan yüksek performanslı uygulamalar oluşturmasını sağlar.
* Büyük Ölçekli Uygulamalar İçin Uygunluk: Next.js, modüler yapısı ve güçlü veri çekme stratejileri sayesinde küçük projelerden büyük ölçekli kurumsal uygulamalara kadar her türlü projeye uyum sağlayabilir.
React ve Next.js ile Proje Oluşturma ve Geliştirme
Şimdi, React ve Next.js'in temel kavramlarını anladığımıza göre, gerçek bir projeye nasıl başlayacağımızı ve temel yapı taşlarını nasıl oluşturacağımızı inceleyelim.
Geliştirme Ortamının Hazırlanması
Bir Next.js projesi geliştirmeye başlamadan önce, bilgisayarınızda bazı temel araçların kurulu olması gerekir:
* Node.js ve npm/yarn: Next.js, Node.js üzerinde çalışır. Node.js'in resmi web sitesinden LTS (Uzun Süreli Destek) sürümünü indirip kurmanız önerilir. Node.js ile birlikte npm (Node Package Manager) de otomatik olarak kurulur. İsterseniz yarn paket yöneticisini de tercih edebilirsiniz (npm install -g yarn).
* Kod Düzenleyici: Visual Studio Code (VS Code), React ve Next.js geliştirme için en popüler ve güçlü kod düzenleyicilerinden biridir. Geniş eklenti desteği sayesinde geliştirme deneyiminizi büyük ölçüde iyileştirebilirsiniz.
İlk Next.js Projenizi Başlatma
Yeni bir Next.js projesi oluşturmak oldukça basittir. Terminalinizi açın ve aşağıdaki komutu çalıştırın:
npx create-next-app@latest benim-nextjs-uygulamam
Bu komut, benim-nextjs-uygulamam adında yeni bir dizin oluşturacak ve içine temel Next.js proje yapısını kuracaktır. Kurulum sırasında size TypeScript, ESLint, Tailwind CSS gibi seçenekler sunulabilir. Seçimlerinizi yaparak ilerleyebilirsiniz. Proje oluştuktan sonra, dizine girin ve geliştirme sunucusunu başlatın:
cd benim-nextjs-uygulamam
npm run dev
veya yarn dev
Tarayıcınızda http://localhost:3000 adresine giderek Next.js başlangıç sayfasını görmelisiniz.
Proje Yapısı:
Bir Next.js projesinin temel dizin yapısı şöyledir:
* pages/: Bu dizin, uygulamanızın sayfalarını tanımladığınız yerdir. Her .js, .jsx, .ts veya .tsx dosyası, otomatik olarak bir rota haline gelir. Örneğin, pages/index.js ana sayfayı, pages/hakkimizda.js ise /hakkimizda rotasını temsil eder.public/
* : Statik dosyalarınız (resimler, fontlar vb.) bu dizine yerleştirilir. Bu dosyalara kök dizinden doğrudan erişilebilir (örneğin, public/logo.png dosyasına /logo.png adresinden erişilir).components/
* : Uygulamanızdaki yeniden kullanılabilir React bileşenlerini bu dizine yerleştirmek iyi bir pratiktir.styles/
* : Global stilleriniz veya CSS modülleriniz için bir dizin.
Temel Bileşenler ve Sayfalar Oluşturma
Next.js'te her sayfa bir React bileşenidir. pages/index.js dosyasını açtığınızda, bir fonksiyonel React bileşeni göreceksiniz.
// pages/index.js
import Head from 'next/head';
export default function Home() {
return (
Ana Sayfa
Burası ana sayfamızın içeriği.
);
}
* next/head: Bu bileşen, sayfanın
etiketini yönetmenizi sağlar. SEO ve tarayıcı sekmesi başlığı için önemlidir.
* _app.js: Bu dosya, tüm sayfaların ortak düzenini ve global stillerini tanımladığınız yerdir. Her sayfa render edildiğinde bu bileşenin içinde render edilir. Örneğin, bir navigasyon çubuğu veya footer tüm sayfalarda görünmesini istiyorsanız buraya ekleyebilirsiniz.
* _document.js: Bu dosya, HTML belgesinin (, gibi) yapısını özelleştirmenize olanak tanır. Genellikle özel fontlar veya sunucu tarafı CSS enjeksiyonu gibi ileri düzey senaryolar için kullanılır.
### Navigasyon ve Yönlendirme
Next.js, dosya sistemi tabanlı yönlendirme sayesinde navigasyonu son derece kolaylaştırır. Sayfalar arasında geçiş yapmak için
next/link modülünden bileşenini kullanırız.
// components/Navbar.js (örneğin)
import Link from 'next/link';
export default function Navbar() {
return (
);
}
* Dinamik Rotalar:
pages/blog/[slug].js gibi bir dosya oluşturarak dinamik rotalar tanımlayabilirsiniz. [slug] kısmı, URL'deki dinamik parametreyi temsil eder.
* useRouter Hook'u: next/router modülünden useRouter Hook'u, sayfa rotası, sorgu parametreleri gibi bilgilere erişmenizi ve programatik olarak yönlendirme yapmanızı sağlar. Örneğin, router.push(‘/yeni-sayfa’).
Veri Getirme Stratejileri (Data Fetching Strategies)
Modern web uygulamalarında veri getirme, uygulamanın performansını, kullanıcı deneyimini ve SEO'sunu doğrudan etkileyen kritik bir konudur. Next.js, bu alanda geliştiricilere güçlü ve esnek seçenekler sunar.
Client-Side Rendering (CSR)
React'in varsayılan çalışma şekli olan Client-Side Rendering (CSR), verilerin tarayıcıda, yani istemci tarafında çekilip render edildiği yöntemdir.
* Çalışma Şekli: Tarayıcı, sunucudan boş bir HTML iskeleti ve JavaScript dosyalarını alır. JavaScript yüklendikten sonra, istemci tarafında bir API'ye istek gönderilir, veriler çekilir ve UI oluşturulur.
* Ne Zaman Kullanılır? Kullanıcı etkileşimine dayalı, sık güncellenen veya kişiselleştirilmiş verilerle çalışan kontrol panelleri, admin panelleri veya sosyal medya akışları gibi uygulamalar için uygundur.
* Avantajları: Geliştirme kolaylığı (React'e alışkınsanız), sunucu yükünü azaltır (veritabanı sorguları istemcide yapılır).
* Dezavantajları:
* İlk Yükleme Süresi (FCP - First Contentful Paint): Tarayıcının JavaScript'i indirip çalıştırması ve veri çekmesini beklemesi gerektiğinden, kullanıcı boş bir ekran görebilir.
* SEO: Arama motoru botları, JavaScript'i tam olarak çalıştırmadan içeriği göremeyebilir veya indekslemekte zorlanabilir. Bu da SEO performansını olumsuz etkiler.
* Örnek Kullanım: Bir React bileşeninde
useEffect Hook'u ile veri çekme.
// pages/urunler.js (CSR örneği)
import { useState, useEffect } from 'react';
export default function Urunler() {
const [urunler, setUrunler] = useState([]);
const [yukleniyor, setYukleniyor] = useState(true);
useEffect(() => {
async function fetchData() {
const res = await fetch('/api/urunler');
const data = await res.json();
setUrunler(data);
setYukleniyor(false);
}
fetchData();
}, []);
if (yukleniyor) return Ürünler yükleniyor...
;
return (
{urunler.map(urun => (
- {urun.ad}
))}
);
}
Server-Side Rendering (SSR) -
getServerSideProps
Next.js'in sunduğu güçlü bir veri getirme stratejisi olan Server-Side Rendering (SSR), her istekte sunucu tarafında sayfanın HTML'ini oluşturur.
* Çalışma Şekli: Bir kullanıcı bir sayfayı talep ettiğinde, sunucu bu isteği alır, gerekli verileri çeker ve sayfanın tam HTML'ini oluşturarak tarayıcıya gönderir. Tarayıcı, bu hazır HTML'i hemen görüntüler. Daha sonra, React istemci tarafında "hydration" adı verilen bir işlemle etkileşimli hale gelir.
* Ne Zaman Kullanılır? Verilerin sık güncellendiği ve her istekte en güncel verinin gösterilmesi gereken sayfalar (örneğin, haber siteleri, e-ticaret ürün sayfaları, kullanıcı profilleri) için idealdir. SEO'nun kritik olduğu durumlar için de uygundur.
* Avantajları:
* Mükemmel SEO: Arama motoru botları, sayfanın tüm içeriğini HTML olarak alır ve kolayca indeksleyebilir.
* Hızlı İlk Yükleme (FCP): Kullanıcı, sayfanın içeriğini hemen görür, boş bir ekran beklemez.
* Güncel Veri: Her istekte veriler yeniden çekildiği için her zaman en güncel bilgiyi sunar.
* Dezavantajları:
* Sunucu Yükü: Her istekte sunucunun sayfa oluşturma ve veri çekme işlemini yapması gerekir. Yüksek trafikli sitelerde sunucu maliyetleri artabilir.
* Daha Uzun İlk Bayt Süresi (TTFB - Time To First Byte): Sunucunun HTML'i oluşturması biraz zaman alabilir, bu da ilk baytın gelme süresini uzatabilir.
* Örnek Kullanım:
getServerSideProps adında, yalnızca sunucu tarafında çalışan ve bir sayfa bileşeni tarafından kullanılacak props'ları döndüren bir asenkron fonksiyon tanımlanır.
// pages/haberler/[id].js (SSR örneği)
import Head from 'next/head';
export default function HaberDetay({ haber }) {
return (
{haber.baslik}
{haber.icerik}
);
}
export async function getServerSideProps(context) {
const { id } = context.params;
const res = await fetch(https://api.example.com/haberler/${id});
const haber = await res.json();
if (!haber) {
return {
notFound: true,
};
}
return {
props: { haber }, // Haber verisini prop olarak sayfaya gönder
};
}
Static Site Generation (SSG) -
getStaticProps
Static Site Generation (SSG), Next.js'in en performanslı veri getirme stratejilerinden biridir. Sayfalar, build (derleme) zamanında tek seferlik oluşturulur.
* Çalışma Şekli: Uygulama build edilirken (örneğin,
npm run build komutuyla), Next.js getStaticProps fonksiyonlarını çalıştırır, gerekli verileri çeker ve her sayfa için önceden render edilmiş HTML dosyaları oluşturur. Bu HTML dosyaları daha sonra bir CDN (İçerik Dağıtım Ağı) üzerinden sunulabilir.
* Ne Zaman Kullanılır? Verilerin sık güncellenmediği (veya güncellenmesinin anlık olması gerekmeyen) blog gönderileri, ürün katalogları, dokümantasyon sayfaları, hakkımızda sayfaları gibi içerikler için mükemmeldir.
* Avantajları:
* Üstün Performans: Sayfalar önceden oluşturulduğu ve CDN'den servis edildiği için inanılmaz hızlı yüklenir.
* Düşük Sunucu Maliyeti: Sunucunun her istekte sayfa oluşturmasına gerek kalmaz, bu da sunucu kaynaklarından tasarruf sağlar.
* Mükemmel SEO: SSR gibi, arama motorları için tam HTML içeriği mevcuttur.
* Güvenilirlik: Statik dosyalar, sunucu sorunlarından daha az etkilenir.
* Dezavantajları:
* Anlık Güncelleme Yok: Verilerde bir değişiklik olduğunda, yeni içeriğin görünmesi için uygulamanın yeniden build edilmesi ve dağıtılması gerekir.
* Büyük Uygulamalarda Build Süresi: Çok sayıda sayfa varsa, build süresi uzayabilir.
* Örnek Kullanım: getStaticProps adında, yalnızca build zamanında çalışan ve sayfa bileşeni tarafından kullanılacak props'ları döndüren bir asenkron fonksiyon tanımlanır. Dinamik rotalar için getStaticPaths ile birlikte kullanılır.
// pages/blog/[slug].js (SSG örneği)
import Head from 'next/head';
export default function BlogPost({ post }) {
return (
{post.title}
{post.content}
);
}
export async function getStaticPaths() {
// Tüm blog gönderisi slug'larını al
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
const paths = posts.map((post) => ({
params: { slug: post.slug },
}));
return { paths, fallback: false }; // fallback: false, var olmayan sayfalarda 404 gösterir
}
export async function getStaticProps({ params }) {
const res = await fetch(https://api.example.com/posts/${params.slug});
const post = await res.json();
return {
props: { post },
};
}
Incremental Static Regeneration (ISR) -
revalidate
ISR, SSG'nin dezavantajı olan anlık güncelleme eksikliğini gideren bir Next.js özelliğidir. Statik sayfaları yeniden build etmeye gerek kalmadan belirli aralıklarla güncelleyebilir.
* Çalışma Şekli:
getStaticProps fonksiyonuna revalidate anahtarını ekleyerek, bir sayfanın belirli saniyeler içinde arka planda yeniden oluşturulmasını sağlayabilirsiniz. Kullanıcı sayfayı talep ettiğinde, önceden oluşturulmuş (eski) sürüm hemen servis edilirken, Next.js arka planda sayfanın yeni bir sürümünü oluşturur. Bir sonraki istekte yeni sürüm servis edilir.
* Ne Zaman Kullanılır? SSG'nin performans avantajlarından yararlanmak, ancak içerikteki güncellemelerin de belirli bir gecikmeyle yansıtılması gereken durumlar için idealdir (örneğin, e-ticaret ürün listeleri, bloglar).
* Avantajları: SSG'nin performansını ve SEO avantajlarını korurken, içeriğin belirli aralıklarla güncel kalmasını sağlar. Her istekte sunucu yükü oluşturmaz.
* Dezavantajları: Güncellemeler anında yansımaz, revalidate süresi kadar gecikme yaşanabilir.
* Örnek Kullanım:
// pages/urunler/[id].js (ISR örneği)
import Head from 'next/head';
export default function UrunDetay({ urun }) {
return (
{urun.ad}
{urun.fiyat}
);
}
export async function getStaticPaths() {
// ... (getStaticPaths burada da kullanılır)
return { paths: [], fallback: 'blocking' }; // 'blocking' veya true
}
export async function getStaticProps({ params }) {
const res = await fetch(https://api.example.com/urunler/${params.id});
const urun = await res.json();
return {
props: { urun },
revalidate: 60, // Sayfa her 60 saniyede bir yeniden oluşturulur (arka planda)
};
}
fallback: ‘blocking’ veya fallback: true kullanımı, henüz statik olarak oluşturulmamış bir sayfa istendiğinde Next.js'in nasıl davranacağını belirler. ‘blocking’ durumunda, Next.js sunucuda sayfayı oluşturup tarayıcıya gönderene kadar bekler; true durumunda ise hemen boş bir sayfa gönderip arka planda oluşturmaya başlar.
Ne Zaman Hangisi Kullanılmalı?
Karar verirken aşağıdaki tablo size yardımcı olabilir:
| Strateji | Veri Güncelliği | İlk Yükleme (FCP) | SEO | Sunucu Yükü | Kullanım Alanı |
| :------- | :-------------- | :---------------- | :-- | :---------- | :-------------- |
| CSR | Her zaman en güncel | Orta/Yavaş | Zayıf | Düşük | Admin paneli, kişiselleştirilmiş içerik |
| SSR | Her zaman en güncel | Hızlı | Mükemmel | Yüksek | Haber siteleri, e-ticaret ürün detayları |
| SSG | Build zamanındaki | En Hızlı | Mükemmel | Çok Düşük | Blog, dokümantasyon, statik içerikler |
| ISR | Belirli aralıklarla güncel | En Hızlı | Mükemmel | Çok Düşük | E-ticaret ürün listeleri, sık güncellenen bloglar |
Doğru stratejiyi seçmek, uygulamanızın gereksinimlerine, veri güncelliği ihtiyaçlarına ve performans hedeflerine bağlıdır. Next.js, aynı uygulama içinde farklı sayfalar için farklı veri çekme stratejilerini kullanmanıza olanak tanıyarak bu konuda büyük esneklik sağlar.
Next.js ile Gelişmiş Özellikler
Next.js, temel özelliklerinin ötesinde, modern web geliştirme süreçlerini daha da kolaylaştıran ve uygulamaların kalitesini artıran bir dizi gelişmiş özellik sunar.
API Rotaları (API Routes)
Next.js'in en dikkat çekici özelliklerinden biri, aynı proje içinde hem ön yüzü hem de basit bir arka yüzü barındırmanıza olanak tanıyan API Rotalarıdır.
/pages/api dizini altında oluşturduğunuz her JavaScript dosyası, bir API endpoint'i haline gelir.
* Çalışma Şekli: Bu dosyalar, sunucu tarafında Node.js ortamında çalışır ve istemci tarafına JSON verisi döndürebilir, veritabanı işlemleri yapabilir veya diğer harici API'lerle etkileşime geçebilir.
* Avantajları:
* Full-stack Yetenekleri: Frontend ve backend'i tek bir monorepo içinde yönetme kolaylığı.
* Kolay Entegrasyon: Veritabanı bağlantıları veya kimlik doğrulama gibi işlemleri kolayca entegre edebilirsiniz.
* Sunucu Taraflı Mantık: Hassas bilgileri (API anahtarları gibi) istemci tarafında göstermeden sunucu tarafında işleyebilirsiniz.
* Basit Bir API Endpoint'i Oluşturma:
// pages/api/merhaba.js
export default function handler(req, res) {
res.status(200).json({ ad: 'Next.js API', mesaj: 'Merhaba Dünya!' });
}
Bu endpoint'e
http://localhost:3000/api/merhaba adresinden erişilebilir. req objesi gelen isteği, res objesi ise yanıtı yönetmenizi sağlar.
Resim Optimizasyonu (
next/image)
Web sitelerinin performansını en çok etkileyen faktörlerden biri resimlerdir. Next.js,
next/image bileşeni ile resim optimizasyonunu otomatik hale getirir.
* Özellikleri:
* Otomatik Boyutlandırma: Cihazın ekran boyutuna göre en uygun boyutta resim sunar.
* Modern Formatlara Dönüştürme: WebP gibi daha verimli resim formatlarına otomatik dönüştürme (tarayıcı desteğine göre).
* Lazy Loading: Resimler yalnızca görünür alana (viewport) girdiğinde yüklenir, bu da başlangıç yükleme süresini hızlandırır.
* Yer Tutucu (Placeholder): Resim yüklenene kadar düşük kaliteli bir sürümünü veya bulanık bir efekti göstererek kullanıcı deneyimini iyileştirir.
* Kullanım:
import Image from 'next/image';
import profilResmi from '../public/profil.jpg'; // Yerel bir resim
export default function Profil() {
return (
{/ Harici bir resim için /}
);
}
Harici resimler için
next.config.js dosyasında domain'leri belirtmeniz gerekebilir.
Stil Yönetimi (Styling)
Next.js, React uygulamalarınızda stil yönetimi için çeşitli seçenekler sunar:
* CSS Modules: Varsayılan olarak desteklenen ve önerilen bir yöntemdir. Her bileşenin kendi CSS dosyasını oluşturarak stil çakışmalarını engeller.
[ad].module.css formatında isimlendirilir.
* Global CSS: pages/_app.js dosyasında global CSS dosyalarını içe aktararak tüm uygulamaya etki eden stiller tanımlayabilirsiniz.
* Sass Desteği: sass paketini kurarak Sass/SCSS dosyalarını kullanabilirsiniz.
* CSS-in-JS Kütüphaneleri: Styled Components veya Emotion gibi kütüphanelerle entegrasyonu kolaydır.
* Tailwind CSS: Son yılların en popüler CSS framework'lerinden biri olan Tailwind CSS, Next.js ile mükemmel bir uyum içindedir ve hızlıca modern UI'lar oluşturmanızı sağlar. Next.js CLI, proje oluştururken Tailwind CSS entegrasyonu seçeneği sunar.
Ortam Değişkenleri (Environment Variables)
API anahtarları, veritabanı bağlantı dizeleri gibi hassas bilgileri veya geliştirme/üretim ortamlarına özel yapılandırmaları yönetmek için ortam değişkenleri kullanılır.
* Next.js,
.env.local, .env.development, .env.production gibi dosyaları destekler.
* NEXT_PUBLIC_ önekiyle başlayan değişkenler istemci tarafında da erişilebilirken, diğerleri yalnızca sunucu tarafında kullanılabilir.
* Kullanım:
// .env.local
NEXT_PUBLIC_API_URL=https://api.example.com/dev
DB_CONNECTION_STRING=mongodb://localhost:27017/mydb
// Bir React bileşeni içinde
function MyComponent() {
const apiUrl = process.env.NEXT_PUBLIC_API_URL; // İstemcide erişilebilir
// ...
}
// Bir API Rotası içinde (sunucuda)
export default function handler(req, res) {
const dbConnectionString = process.env.DB_CONNECTION_STRING; // Sadece sunucuda erişilebilir
// ...
}
Bu özellikler, Next.js'in sadece bir React framework'ü olmanın ötesinde, modern web uygulamaları için kapsamlı bir çözüm sunduğunu göstermektedir.
React ve Next.js'in Geleceği ve En İyi Uygulamalar
React ve Next.js, sürekli gelişen ve yenilikler sunan teknolojilerdir. Bu teknolojilerle güçlü ve sürdürülebilir uygulamalar geliştirmek için bazı en iyi uygulamaları ve ipuçlarını göz önünde bulundurmak önemlidir.
Performans İpuçları
* Kod Bölme (Code Splitting) ve Lazy Loading: Next.js bunu otomatik olarak yapsa da, büyük bileşenleri veya rotaları dinamik olarak içe aktarmak (
import() kullanımı) performansı daha da artırabilir. Örneğin, React.lazy ve Suspense ile veya Next.js'in kendi next/dynamic özelliğini kullanarak.
* Gereksiz Render'lardan Kaçınma:
* React.memo: Fonksiyonel bileşenler için props'ları değişmediği sürece yeniden render edilmelerini engeller.
* useCallback ve useMemo: Gereksiz fonksiyon ve değer yeniden oluşturmalarını önleyerek performansı artırır.
* Resim Optimizasyonu: Daima next/image bileşenini kullanın ve doğru boyutlarda resimler sunmaya özen gösterin.
* Veri Getirme Optimizasyonları: Doğru veri getirme stratejisini (SSG, ISR, SSR) seçmek, uygulamanızın performansını temelden etkiler.
* Büyük Kütüphanelerin Analizi: next bundle analyzer gibi araçlarla uygulamanızın boyutunu analiz edin ve gereksiz bağımlılıkları kaldırın.
SEO İpuçları
* Meta Etiketleri (
next/head): Her sayfa için uygun title, description, og:image gibi meta etiketlerini next/head kullanarak tanımlayın. Bu, arama motorlarının ve sosyal medya platformlarının içeriğinizi doğru anlamasına yardımcı olur.
* Anlamlı URL'ler: Dinamik rotalarınızda açıklayıcı ve anahtar kelime içeren URL'ler kullanın (örneğin, /blog/nextjs-ile-gelistirme yerine /blog/123).
* Yapılandırılmış Veri (Structured Data): Schema.org gibi standartlara uygun yapılandırılmış veri (JSON-LD) kullanarak içeriğiniz hakkında arama motorlarına ek bilgi sağlayın. Bu, zengin sonuçlar (rich snippets) elde etmenize yardımcı olabilir.
* Site Haritası ve Robots.txt: Arama motorlarının sitenizi doğru bir şekilde taramasını sağlamak için bir sitemap.xml dosyası oluşturun ve robots.txt` ile tarama kurallarını belirleyin.
Test
Sağlam bir uygulama geliştirmek için testler vazgeçilmezdir.
* Birim Testleri (Unit Tests): Bileşenlerinizi veya yardımcı fonksiyonlarınızı izole bir şekilde test etmek için Jest ve React Testing Library gibi araçları kullanın.
* Entegrasyon Testleri (Integration Tests): Birden fazla bileşenin veya modülün birlikte nasıl çalıştığını test edin.
* Uçtan Uca Testler (End-to-End Tests): Cypress veya Playwright gibi araçlarla uygulamanızın tüm akışını, bir kullanıcının deneyimleyeceği şekilde test edin.
Dağıtım (Deployment)
Next.js uygulamalarını dağıtmak oldukça kolaydır.
* Vercel: Next.js’in geliştiricisi olan Vercel, Next.js uygulamaları için optimize edilmiş bir dağıtım platformu sunar. Git entegrasyonu, otomatik dağıtım, önizleme URL’leri ve CDN gibi özelliklerle sorunsuz bir deneyim sağlar.
* Netlify: Vercel gibi, Netlify de statik siteler ve sunucusuz fonksiyonlar için popüler bir platformdur ve Next.js uygulamalarıyla iyi çalışır.
* Kendi Sunucunuz: Next.js uygulamalarını kendi Node.js sunucunuzda veya Docker konteynerlerinde de dağıtabilirsiniz.
Next.js’in sürekli güncellenen doğası göz önüne alındığında, resmi belgelendirmeyi (Next.js Docs) takip etmek ve topluluk kaynaklarından yararlanmak, en güncel ve etkili yöntemleri öğrenmek için kritik öneme sahiptir.
Sonuç
Modern web geliştirme yolculuğunda React ve Next.js ikilisi, geliştiricilere sadece güçlü araçlar sunmakla kalmıyor, aynı zamanda performans, SEO ve geliştirici deneyimi açısından da en üst düzeyde çözümler sağlıyor. React’in bileşen tabanlı esnekliği ile Next.js’in sunucu tarafı render, statik site oluşturma ve API rotaları gibi üretim odaklı yetenekleri birleştiğinde, her ölçekten ve karmaşıklıktan web uygulamalarını hızlı, verimli ve sürdürülebilir bir şekilde geliştirmek mümkün hale geliyor.
Bu makale boyunca, React’in temel yapı taşlarından başlayarak, Next.js’in sunduğu veri çekme stratejileri ve gelişmiş özelliklere kadar geniş bir yelpazeyi ele aldık. Proje oluşturma adımlarından, performans ve SEO optimizasyon ipuçlarına kadar birçok konuda bilgi sahibi oldunuz. Unutmayın ki, yazılım dünyası sürekli evrim geçiren bir alandır ve en güçlü başlangıç, sürekli öğrenmeye ve yeni teknolojileri keşfetmeye olan bağlılıkla mümkündür. React ve Next.js ile çıktığınız bu yolculukta, yaratıcılığınızı serbest bırakın ve modern web’in sınırsız potansiyelini keşfedin. Güçlü bir başlangıç yaptınız; şimdi sıra bu temeller üzerine harika şeyler inşa etmekte!