Next.js Best Practices: 10 Detaylı Adım [2026 Rehberi]
Yazar: Burak Balkı | Kategori: Mobile Development | Okuma Süresi: 54 dk
Bu kapsamlı rehber, 2026'nın en güncel Next.js en iyi uygulamalarını, pratik örneklerle ve derinlemesine teknik analizlerle ele alıyor. Performans, güvenlik ...
# Next.js Best Practices: 10 Detaylı Adım [2026 Rehberi]
## Giriş Paragrafı (Hook + Context)
Web uygulaması geliştirmenin karmaşıklığı 2026'da zirveye ulaşırken, modern framework'ler arasındaki rekabet de kızışıyor. Next.js, React ekosisteminin liderlerinden biri olarak, sunucu taraflı render (SSR), statik site üretimi (SSG) ve artımlı statik yeniden oluşturma (ISR) gibi özellikleriyle geliştiricilere benzersiz avantajlar sunuyor. Ancak bu gücü tam olarak kullanmak ve üretim ortamında ölçeklenebilir, performanslı ve güvenli uygulamalar geliştirmek, doğru "best practices" (en iyi uygulamalar) bilgisi gerektirir. Bu kapsamlı rehberde, 2026'nın en güncel Next.js en iyi uygulamalarını, pratik örneklerle ve derinlemesine teknik analizlerle ele alacağız. Bu yazı, bir Bilgisayar Mühendisi ve Full Stack Developer olarak production ortamında edindiğim 10 yılı aşkın tecrübeyle hazırlandı. Amacımız, Next.js projelerinizin hem geliştirme sürecini hızlandırmak hem de son kullanıcı deneyimini zirveye taşımak için size yol göstermektir.
## Next.js Nedir?
Next.js, 2026 itibarıyla Vercel tarafından geliştirilen, React tabanlı, açık kaynaklı bir web framework'üdür. Geliştiricilere sunucu taraflı render (SSR), statik site üretimi (SSG) ve artımlı statik yeniden oluşturma (ISR) gibi özellikler sunarak, performanslı ve SEO dostu React uygulamaları oluşturma imkanı tanır. Bu sayede, hem geliştirici deneyimini iyileştirir hem de son kullanıcıya hızlı ve güvenilir bir deneyim sunar.
Next.js, React'ın esnekliğini ve component tabanlı yapısını korurken, routing, veri çekme (data fetching), kod bölme (code splitting) ve görüntü optimizasyonu gibi birçok temel özelliği kutudan çıktığı gibi sunar. Bu entegre çözümler, geliştiricilerin altyapı yerine doğrudan iş mantığına odaklanmasını sağlar. Özellikle 2026'da App Router'ın yaygınlaşmasıyla birlikte, Server Components ve Server Actions gibi özellikler, Next.js'i modern web geliştirme için vazgeçilmez bir araç haline getirmiştir.
## Neden Next.js Kullanmalısınız?
Next.js, modern web geliştirme dünyasında sadece bir trend değil, aynı zamanda kanıtlanmış bir değer önerisidir. Özellikle 2026'da, web performansının ve SEO'nun kritik öneme sahip olduğu bir dönemde, Next.js'in sunduğu avantajlar onu rakipsiz kılmaktadır.
* **Üstün Performans:** Next.js, varsayılan olarak sunucu taraflı render (SSR) ve statik site üretimi (SSG) gibi tekniklerle ilk yükleme süresini (FCP - First Contentful Paint) ve etkileşim süresini (TTI - Time to Interactive) önemli ölçüde azaltır. Ekibimizle yürüttüğümüz bir e-ticaret projesinde, Next.js'e geçişle birlikte Core Web Vitals skorlarında %30'a varan iyileşmeler gözlemledik. Görüntü ve font optimizasyonu gibi dahili özellikler, kullanıcı deneyimini daha da zenginleştirir.
* **Mükemmel SEO:** Arama motorları, sunucu taraflı render edilmiş içeriği daha kolay indeksler. Bu, Next.js uygulamalarının Google ve diğer arama motorlarında daha iyi sıralama almasını sağlar. Dinamik meta etiket yönetimi ve otomatik sitemap oluşturma gibi yetenekler, SEO stratejilerinizi güçlendirir.
* **Geliştirici Deneyimi (DX):** Hot Module Replacement (HMR), dosya tabanlı routing ve TypeScript desteği gibi özellikler, geliştirme sürecini hızlandırır ve hataları azaltır. 2026'da Next.js'in aktif topluluğu ve zengin dökümantasyonu, yeni başlayanlardan deneyimli profesyonellere kadar herkes için öğrenmeyi ve geliştirmeyi kolaylaştırır.
* **Ölçeklenebilirlik ve Güvenilirlik:** Next.js uygulamaları, Vercel gibi platformlarda kolayca dağıtılabilir ve yüksek trafik altında bile stabil çalışacak şekilde tasarlanmıştır. Edge Functions ve Middleware gibi özellikler, uygulamanızın global olarak hızlı yanıt vermesini sağlar.
* **Modern Veri Çekme Stratejileri:** App Router ile gelen Server Components ve Server Actions, veri çekme işlemlerini sunucu tarafına taşıyarak hem performansı artırır hem de istemci tarafındaki JavaScript yükünü azaltır. Bu, özellikle mobil cihazlar için kritik bir avantajdır.
Next.js, özellikle yüksek performans, SEO ve ölçeklenebilirlik gerektiren kurumsal düzeydeki web uygulamaları, e-ticaret siteleri, bloglar ve pazarlama sayfaları için idealdir. Ancak, çok basit ve statik bir web sitesi için başlangıçta biraz fazla karmaşık gelebilir. Deneyimlerime göre, orta ve büyük ölçekli projelerde sağladığı verimlilik, başlangıçtaki öğrenme eğrisini fazlasıyla telafi eder.
## Next.js vs Alternatifler (Karşılaştırma Tablosu)
Modern web geliştirme dünyasında Next.js'e benzer birçok güçlü alternatif bulunmaktadır. Bu bölümde, Next.js'i öne çıkan iki popüler framework olan Astro ve Remix ile karşılaştırarak, her birinin güçlü ve zayıf yönlerini inceleyeceğiz. Bu karşılaştırma, 2026'nın güncel özelliklerini temel almaktadır.
| Özellik | Next.js (v15.x - 2026) | Astro (v5.x - 2026) | Remix (v2.x - 2026) |
| :------------------ | :------------------------------------------------------ | :------------------------------------------------------ | :----------------------------------------------------- |
| **Render Metodları**| SSR, SSG, ISR, Client-side, Server Components | SSG (varsayılan), SSR, Island Architecture | SSR (varsayılan), Client-side |
| **Öğrenme Eğrisi** | Orta (React bilgisi gerektirir, App Router yeni kavramlar) | Düşük-Orta (HTML/CSS/JS bilgisi yeterli, component agnostik) | Orta (React Router'a benzer, web standartlarına yakın) |
| **Ekosistem** | React'ın geniş ekosistemi, Vercel tarafından destekli | Kendi entegrasyonları, hafif ve modüler | React'ın ekosistemi, Cloudflare tarafından destekli |
| **Topluluk** | Çok Büyük ve Aktif | Hızla Büyüyen ve Aktif | Büyük ve Aktif |
| **Kurumsal Destek** | Vercel (birincil), çeşitli SaaS entegrasyonları | Bağımsız, topluluk odaklı | Cloudflare (birincil) |
| **Kullanım Alanı** | Kurumsal uygulamalar, e-ticaret, bloglar, pazarlama siteleri | İçerik odaklı siteler, statik bloglar, mikro siteler | Dinamik web uygulamaları, form odaklı uygulamalar |
| **Ana Odak** | Tam yığın (full-stack) React deneyimi, performans, SEO | Performans (sıfır JS varsayımı), içerik odaklı | Web standartları, performans, kullanıcı deneyimi |
Bu tabloya baktığımızda, Next.js'in özellikle tam yığın React deneyimi ve kapsamlı render stratejileri sunarak kurumsal düzeydeki projeler için çok yönlü bir çözüm olduğu görülüyor. Astro, sıfır JavaScript felsefesiyle içerik odaklı ve ultra hızlı siteler için öne çıkarken, Remix web standartlarına olan bağlılığı ve form işlemlerindeki gücüyle dikkat çekiyor. Projenizin gereksinimlerine göre bu framework'lerden birini seçmek, uzun vadeli başarınız için kritik öneme sahiptir. Benim deneyimlerime göre, eğer React ekosisteminde kalmak ve geniş bir özellik yelpazesinden faydalanmak istiyorsanız, Next.js 2026'da hala en güvenilir seçimlerden biridir.
## Kurulum ve İlk Adımlar
Next.js ile bir projeye başlamak oldukça basittir. 2026 itibarıyla en güncel kurulum yöntemlerini ve App Router'ı temel alan bir başlangıç projesini adım adım ele alacağız. Bu adımları takip ederek dakikalar içinde bir Next.js uygulamasını çalışır hale getirebilirsiniz.
### Ön Gereksinimler:
Başlamadan önce sisteminizde aşağıdaki yazılımların kurulu olduğundan emin olun:
* Node.js (LTS sürümü, 2026 itibarıyla v20.x veya üzeri önerilir)
* npm veya Yarn (Node.js ile birlikte gelir)
### Adım Adım Kurulum:
1. **Yeni Bir Next.js Projesi Oluşturma:**
Terminalinizi açın ve aşağıdaki komutu çalıştırın. `--typescript` ve `--eslint` bayrakları, projenizi modern geliştirme standartlarına uygun hale getirir.
```bash
npx create-next-app@latest my-next-app --typescript --eslint --app
```
> `create-next-app@latest` komutu, 2026'nın en güncel Next.js sürümünü (muhtemelen v15.x) ve varsayılan olarak App Router'ı kullanacaktır. `--app` bayrağı App Router'ı açıkça etkinleştirir.
2. **Proje Klasörüne Gitme:**
Oluşturulan proje klasörüne geçiş yapın:
```bash
cd my-next-app
```
3. **Geliştirme Sunucusunu Başlatma:**
Uygulamanızı yerel geliştirme ortamında başlatmak için aşağıdaki komutu kullanın:
```bash
npm run dev
```
Bu komut, uygulamanızı `http://localhost:3000` adresinde başlatır. Tarayıcınızda bu adresi ziyaret ederek Next.js'in varsayılan başlangıç sayfasını görebilirsiniz.
4. **Üretim Ortamı İçin Derleme ve Başlatma:**
Uygulamanızı üretim ortamına dağıtmadan önce derlemeniz gerekir. Bu komut, uygulamanızın optimize edilmiş bir üretim sürümünü oluşturur:
```bash
npm run build
```
Ardından, derlenmiş uygulamayı başlatmak için:
```bash
npm run start
```
Bu komut da uygulamayı varsayılan olarak `http://localhost:3000` adresinde başlatır, ancak bu sefer üretim modunda çalışır.
Bu basit adımlarla Next.js geliştirme ortamınızı kurmuş oldunuz. Artık App Router'ın sunduğu yenilikleri keşfetmeye hazırsınız.
## Temel Kullanım ve Örnekler
Next.js'in temelini oluşturan App Router, component tabanlı mimari ve veri çekme mekanizmaları, modern web uygulamaları geliştirmek için kritik öneme sahiptir. İşte 2026'da sıkça kullanacağınız temel özelliklere dair pratik örnekler.
### 1. App Router ile Routing
**Problem:** Geleneksel React uygulamalarında routing genellikle `react-router-dom` gibi kütüphanelerle yönetilir. Next.js App Router, dosya sistemi tabanlı routing ile daha sezgisel ve performanslı bir yaklaşım sunar.
**Çözüm:** `app` dizini altında klasörler oluşturarak yeni rotalar tanımlarsınız. Her klasörün içinde yer alan `page.tsx` veya `page.js` dosyası, o rotanın UI'ını temsil eder.
**Kod Örneği:**
`app/dashboard/page.tsx`
```typescript react
// app/dashboard/page.tsx
export default function DashboardPage() {
return (
);
}
```
`app/blog/[slug]/page.tsx` (Dinamik Rota)
```typescript react
// app/blog/[slug]/page.tsx
interface BlogPageProps {
params: { slug: string };
}
export default function BlogPostPage({ params }: BlogPageProps) {
return (
);
}
```
### 2. Server Components ile Veri Çekme
**Problem:** İstemci tarafında veri çekmek (client-side data fetching), uygulamanın ilk yükleme süresini uzatabilir ve SEO performansını düşürebilir.
**Çözüm:** Next.js 2026'nın en önemli yeniliklerinden biri olan Server Components, veri çekme işlemlerini sunucuda gerçekleştirerek, yalnızca render edilmiş HTML'i istemciye gönderir. Bu, daha hızlı yükleme ve daha iyi SEO sağlar.
**Kod Örneği:**
`app/products/page.tsx`
```typescript react
// app/products/page.tsx - Bu bir Server Component'tir
interface Product {
id: number;
name: string;
price: number;
}
async function getProducts(): Promise {
// Sunucu tarafında veri çekme işlemi
const res = await fetch('https://api.example.com/products', { next: { revalidate: 3600 } }); // Her saatte bir önbelleği yeniden doğrula
if (!res.ok) {
throw new Error('Ürünler çekilemedi');
}
return res.json();
}
export default async function ProductsPage() {
const products = await getProducts();
return (
);
}
```
### 3. Server Actions ile Form İşlemleri
**Problem:** Form gönderimleri ve veri manipülasyonu genellikle API rotaları veya istemci tarafı state yönetimi gerektirir, bu da karmaşıklığı artırır.
**Çözüm:** Server Actions, form gönderimlerini doğrudan sunucu tarafında işlemek için yeni ve daha basit bir yol sunar. Bu, API rotası yazma ihtiyacını ortadan kaldırır ve istemci tarafındaki JavaScript'i azaltır.
**Kod Örneği:**
`app/contact/page.tsx`
```typescript react
// app/contact/page.tsx
'use client'; // Bu component bir Client Component'tir, Server Action'ı kullanabilir.
import { useState } from 'react';
import { submitContactForm } from './actions'; // Server Action'ı içe aktar
export default function ContactPage() {
const [message, setMessage] = useState('');
const [error, setError] = useState('');
const handleSubmit = async (formData: FormData) => {
setMessage('');
setError('');
try {
const result = await submitContactForm(formData);
if (result.success) {
setMessage('Mesajınız başarıyla gönderildi!');
} else {
setError(result.error || 'Bir hata oluştu.');
}
} catch (e: any) {
setError(e.message || 'Form gönderilirken bir hata oluştu.');
}
};
return (
);
};
```
`app/contact/actions.ts` (Sunucu Eylemi)
```typescript
// app/contact/actions.ts
'use server'; // Bu dosyadaki tüm fonksiyonlar Server Action'dır
export async function submitContactForm(formData: FormData) {
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const message = formData.get('message') as string;
if (!name || !email || !message) {
return { success: false, error: 'Tüm alanları doldurun.' };
}
// Burada veritabanına kaydetme, e-posta gönderme vb. sunucu tarafı işlemleri yapılır.
console.log('Form verileri alındı:', { name, email, message });
// Örnek olarak 2 saniyelik bir gecikme ekleyelim
await new Promise(resolve => setTimeout(resolve, 2000));
return { success: true };
}
```
### 4. Görüntü Optimizasyonu (`next/image`)
**Problem:** Büyük boyutlu veya optimize edilmemiş görüntüler, sayfa yükleme sürelerini önemli ölçüde artırarak kullanıcı deneyimini olumsuz etkiler.
**Çözüm:** Next.js'in `next/image` bileşeni, görüntüleri otomatik olarak optimize eder, farklı boyutlarda sunar (responsive images), modern formatlara dönüştürür (WebP) ve tembel yükleme (lazy loading) uygular. Bu, 2026'da Core Web Vitals metriklerini iyileştirmek için kritik bir araçtır.
**Kod Örneği:**
`app/page.tsx`
```typescript react
// app/page.tsx
import Image from 'next/image';
export default function HomePage() {
return (
);
}
```
`next.config.mjs` (Harici görüntüler için yapılandırma)
```javascript
// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'images.unsplash.com',
port: '',
pathname: '/**',
},
],
},
};
export default nextConfig;
```
## İleri Seviye Teknikler
Next.js'in temel özelliklerinin ötesine geçerek, uygulamanızın performansını, ölçeklenebilirliğini ve geliştirici deneyimini bir üst seviyeye taşıyacak ileri seviye tekniklere odaklanacağız. Bu teknikler, özellikle 2026'da büyük ölçekli ve karmaşık Next.js projelerinde vazgeçilmezdir.
### 1. Middleware Kullanımı
**Problem:** Belirli rotalara erişimi kısıtlamak, kullanıcı kimlik doğrulamasını yönetmek veya A/B testi gibi işlemleri istemci tarafında veya her API rotasında tekrarlamak verimsizdir.
**Çözüm:** Next.js Middleware, bir rota isteği tamamlanmadan önce kod çalıştırmanıza olanak tanır. Bu, yeniden yönlendirmeler, kimlik doğrulama kontrolleri, başlık manipülasyonu ve hatta A/B testleri için merkezi bir konum sağlar. Middleware, `app` dizininin kökünde veya bir alt klasörde `middleware.ts` (veya `.js`) adında bir dosya oluşturularak tanımlanır.
**Kod Örneği:**
`middleware.ts`
```typescript
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('auth_token');
const url = request.nextUrl.clone();
// Belirli bir rotayı koruma altına al
if (url.pathname.startsWith('/admin')) {
if (!token) {
url.pathname = '/login'; // Token yoksa login sayfasına yönlendir
return NextResponse.redirect(url);
}
// Token varsa, isteği devam ettir
return NextResponse.next();
}
// A/B testi için örnek bir senaryo
if (url.pathname === '/') {
const variant = Math.random() > 0.5 ? 'A' : 'B';
if (variant === 'B') {
url.pathname = '/home-variant-b';
return NextResponse.rewrite(url); // URL'i değiştirmeden içeriği yeniden yaz
}
}
return NextResponse.next();
}
// Middleware'in hangi rotalarda çalışacağını belirtir
export const config = {
matcher: ['/', '/admin/:path*'],
};
```
> **Deneyim Notu:** Production ortamında middleware kullanırken performansa dikkat etmek önemlidir. Çok karmaşık veya uzun süren işlemler, her isteği yavaşlatabilir. Basit yönlendirmeler ve başlık manipülasyonları için idealdir.
### 2. Custom Server ve Cluster Modu (Gelişmiş İhtiyaçlar İçin)
**Problem:** Next.js'in dahili sunucusu çoğu durumda yeterli olsa da, bazı özel gereksinimler (örneğin, özel routing, belirli bir sunucu teknolojisiyle entegrasyon, çoklu CPU çekirdeklerini kullanma) custom bir sunucu gerektirebilir.
**Çözüm:** `next start` komutu yerine kendi Express.js veya Koa.js sunucunuzu kullanarak Next.js uygulamanızı barındırabilirsiniz. Ayrıca Node.js'in `cluster` modunu kullanarak birden fazla CPU çekirdeğini etkin bir şekilde kullanabilir, böylece uygulamanızın performansını artırabilirsiniz.
**Kod Örneği:**
`server.js`
```javascript
// server.js
const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const dev = process.env.NODE_ENV !== 'production';
const hostname = 'localhost';
const port = 3000;
// Next.js uygulamasını başlat
const app = next({ dev, hostname, port });
const handle = app.getRequestHandler();
if (!dev && cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Worker'ları çatallandır
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
cluster.fork(); // Ölen worker yerine yenisini başlat
});
} else {
app.prepare().then(() => {
createServer(async (req, res) => {
try {
const parsedUrl = parse(req.url, true);
const { pathname, query } = parsedUrl;
// Özel rota tanımlamaları
if (pathname === '/a') {
await app.render(req, res, '/a', query);
} else if (pathname === '/b') {
await app.render(req, res, '/b', query);
} else {
await handle(req, res, parsedUrl);
}
} catch (err) {
console.error('Error occurred handling', req.url, err);
res.statusCode = 500;
res.end('internal server error');
}
}).listen(port, (err) => {
if (err) throw err;
console.log(`> Ready on http://${hostname}:${port} as ${dev ? 'development' : 'production'} worker ${process.pid}`);
});
});
}
```
`package.json` (server.js'i çalıştırmak için)
```json
{
"name": "my-next-app",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "node server.js"
},
"dependencies": {
"next": "^15.0.0-canary.0",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"eslint": "^8",
"eslint-config-next": "15.0.0-canary.0",
"typescript": "^5"
}
}
```
> **Uyarı:** Custom server kullanımı, Next.js'in bazı dahili optimizasyonlarını (örneğin, sunucusuz ortamlar için otomatik ölçeklendirme) devre dışı bırakabilir. Bu nedenle, yalnızca gerçekten özel bir sunucuya ihtiyacınız olduğunda bu yaklaşımı tercih etmelisiniz.
## Best Practices & Anti-Patterns
Next.js uygulamalarınızı 2026 standartlarında geliştirmek ve sürdürülebilir kılmak için belirli en iyi uygulamaları benimsemek ve yaygın anti-pattern'lardan kaçınmak kritik öneme sahiptir. İşte size üretim ortamında kanıtlanmış bazı yaklaşımlar:
* ✅ **App Router'ı Doğru Kullanın:** 2026 itibarıyla App Router, Next.js'in geleceğidir. Yeni projelerinizde App Router'ı kullanın ve Server Components, Server Actions gibi özelliklerinden faydalanın. Bu, performans ve geliştirici deneyimi açısından büyük avantajlar sağlar.
* ❌ **`pages` Router'da Takılı Kalmayın:** Mevcut projelerinizi hemen App Router'a taşımak zor olabilir, ancak yeni özellikler için `pages` router'a yeni kod yazmaktan kaçının. Yavaş yavaş geçiş stratejileri geliştirin.
* ✅ **`next/image` Bileşenini Daima Kullanın:** Görüntü optimizasyonu, web performansının temelidir. `Image` bileşenini kullanarak tembel yükleme, boyutlandırma ve modern format dönüşümlerinden otomatik olarak yararlanın. Bu, LCP (Largest Contentful Paint) skorlarınızı önemli ölçüde iyileştirir.
* ❌ **Görüntüleri Manuel Olarak Optimize Etmeyin:** Büyük boyutlu JPEG veya PNG dosyalarını doğrudan kullanmaktan kaçının. Bu, sayfa yükleme hızını düşürür ve bant genişliği tüketimini artırır.
* ✅ **Server Components ve Client Components Arasındaki Farkı Anlayın:** Server Components, veri çekme ve sunucu tarafı işlemleri için idealdir, istemciye daha az JavaScript gönderir. Client Components ise interaktif UI ve tarayıcı API'ları için kullanılır. Doğru component türünü seçmek performansı artırır.
* ❌ **Her Şeyi Client Component Yapmayın:** Gereksiz yere `"use client";` direktifini kullanmak, uygulamanızın istemci tarafında daha fazla JavaScript yüklemesine ve ilk yükleme süresinin uzamasına neden olabilir.
* ✅ **Veri Çekme İşlemlerini Optimize Edin:** `fetch` API'sini Server Components içinde kullanırken `revalidate` seçeneğini veya ISR (Incremental Static Regeneration) için `generateStaticParams` ve `revalidate` parametrelerini doğru ayarlayın. Bu, verilerin güncel kalmasını sağlarken gereksiz yeniden derlemeleri önler.
* ❌ **Gereksiz Yere Sık Tekrar Doğrulama (Revalidation) Yapmayın:** Her istekte veriyi yeniden çekmek, sunucu kaynaklarını tüketir ve performansı düşürür. Verilerinizin ne sıklıkla güncellendiğini göz önünde bulundurarak akıllı revalidation stratejileri uygulayın.
* ✅ **Ortam Değişkenlerini Güvenli Kullanın:** Hassas API anahtarları ve veritabanı bağlantı dizeleri gibi bilgileri `.env.local` dosyasında saklayın ve bunları istemci tarafına asla ifşa etmeyin. Sunucu tarafında kullanılan değişkenler için `process.env.SECRET_KEY` gibi tanımlamalar yapın.
* ❌ **Hassas Bilgileri İstemci Tarafına Açığa Çıkarmayın:** `NEXT_PUBLIC_` önekiyle başlayan değişkenler istemci tarafında erişilebilir olduğundan, bu değişkenlerde hassas bilgileri tutmaktan kaçının.
* ✅ **Modüler ve Okunabilir Kod Yazın:** Fonksiyonlarınızı ve component'larınızı küçük, tek sorumluluklu birimlere ayırın. Bu, kodun test edilebilirliğini, sürdürülebilirliğini ve ekip içinde işbirliğini artırır. TypeScript kullanımı, büyük projelerde bu konuda büyük avantaj sağlar.
* ❌ **God Component'lerden Kaçının:** Tek bir büyük component içinde tüm iş mantığını ve UI'ı birleştirmek, kodun okunmasını ve bakımını zorlaştırır.
* ✅ **Error Boundary'leri Kullanın:** Özellikle Client Components'lerde oluşabilecek hataları yakalamak ve kullanıcıya dostça bir mesaj göstermek için React'ın Error Boundary'lerini veya Next.js'in `error.tsx` dosyasını kullanın. Bu, uygulamanızın çökmesini engeller ve kullanıcı deneyimini korur.
* ❌ **Hataları Global Olarak Yakalamayın:** Tüm hataları tek bir `try-catch` bloğuyla yakalamaya çalışmak, hatanın kaynağını tespit etmeyi zorlaştırır ve uygulamanın belirli bir bölümündeki hatanın tüm uygulamayı etkilemesine neden olabilir.
## Yaygın Hatalar ve Çözümleri
Next.js geliştirirken karşılaşabileceğiniz bazı yaygın hatalar ve bunların çözüm yolları, geliştirme sürecinizi hızlandırabilir ve sizi saatlerce süren hata ayıklama süreçlerinden kurtarabilir. Bir Bilgisayar Mühendisi olarak, bu hataların çoğuyla üretim ortamında karşılaştım ve çözümlerini deneyimledim.
### 1. `ReferenceError: document is not defined`
* **Problem:** Bu hata, tarayıcıya özgü `document` veya `window` objelerine bir Server Component veya sunucu tarafında çalışan kod içinde erişmeye çalıştığınızda ortaya çıkar.
* **Sebep:** Next.js, varsayılan olarak component'ları sunucuda render eder. `document` ve `window` gibi objeler yalnızca tarayıcı ortamında mevcuttur.
* **Çözüm:** Bu hatayı çözmek için iki ana yaklaşım vardır:
1. Erişmeye çalıştığınız component'ı bir Client Component yapın. Dosyanın en üstüne `'use client';` direktifini ekleyin.
2. `typeof window !== 'undefined'` kontrolü yaparak kodunuzu yalnızca istemci tarafında çalışacak şekilde koşullandırın.
```typescript react
// Çözüm 1: Client Component olarak işaretle
'use client';
import { useEffect } from 'react';
export default function MyClientComponent() {
useEffect(() => {
// Bu kod sadece tarayıcıda çalışır
console.log(document.getElementById('root'));
}, []);
return
);
}
```
### 3. Ortam Değişkenlerine Yanlış Erişim
* **Problem:** Ortam değişkenlerine yanlış prefix ile erişmek veya hassas bilgileri istemci tarafına sızdırmak.
* **Sebep:** Next.js, güvenlik için ortam değişkenlerini `NEXT_PUBLIC_` önekiyle başlayıp başlamadığına göre farklı şekilde ele alır. Öneksiz değişkenler yalnızca sunucu tarafında erişilebilirken, `NEXT_PUBLIC_` ile başlayanlar hem sunucuda hem de is
Yönetim Paneli
Hoş geldiniz, kullanıcı!
Blog Yazısı: {params.slug}
Bu, {params.slug} hakkındaki detaylı yazıdır.
Ürünlerimiz
-
{products.map((product) => (
- {product.name} - ${product.price} ))}
Bize Ulaşın
{message &&{message}
} {error &&{error}
}Anasayfa
Next.js ile optimize edilmiş görüntüler.
Diğer içerikler...
Client Component
;
}
```
```typescript react
// Çözüm 2: Koşullu render
export default function MyServerComponent() {
if (typeof window !== 'undefined') {
// Bu kod sadece tarayıcıda çalışır
console.log(document.getElementById('root'));
}
return Server Component
;
}
```
### 2. `Hydration failed because the initial UI does not match what was rendered on the server.`
* **Problem:** Bu hata, Next.js'in sunucuda oluşturduğu HTML ile istemci tarafında React'ın beklendiği HTML yapısı arasında bir tutarsızlık olduğunda meydana gelir. Genellikle, sunucuda render edilen içerik ile istemcideki JavaScript'in DOM'u farklı oluşturmasından kaynaklanır.
* **Sebep:** En yaygın nedenler şunlardır:
* `useEffect` içinde DOM manipülasyonu yapmak.
* Sunucu tarafında belirli bir elementin olmaması, ancak istemcide var olması (veya tam tersi).
* Tarayıcı uzantılarının DOM'u değiştirmesi.
* `dangerouslySetInnerHTML` kullanımıyla ilgili sorunlar.
* `children` prop'unun istemci tarafında farklı render edilmesi.
* **Çözüm:**
1. **Duyarlı İçeriği `useEffect` İçine Taşıyın:** Eğer bir component tarayıcının özelliklerine (örneğin, pencere genişliği) göre farklı render ediliyorsa, bu mantığı bir `useEffect` hook'u içine taşıyın ve başlangıçta null veya varsayılan bir değer döndürün.
```typescript react
'use client';
import { useState, useEffect } from 'react';
export default function ResponsiveComponent() {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
setIsMobile(window.innerWidth < 768);
const handleResize = () => setIsMobile(window.innerWidth < 768);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
if (isMobile) {
return Mobil görünüm
; } returnMasaüstü görünüm
; } ``` 2. **`suppressHydrationWarning` Kullanımı (Geçici Çözüm):** Bazı durumlarda, özellikle üçüncü taraf kütüphanelerden gelen küçük tutarsızlıklar için `suppressHydrationWarning` prop'unu kullanabilirsiniz. Ancak bu, sorunu gizler, çözmez. ```typescript react{new Date().toLocaleTimeString()}
``` 3. **İstemciye Özgü Component'ları Dinamik Olarak İçe Aktarın:** Eğer bir component kesinlikle istemci tarafında çalışmalı ve sunucuda render edilmemeliyse, dinamik import ile `ssr: false` seçeneğini kullanın. ```typescript react import dynamic from 'next/dynamic'; const DynamicClientComponent = dynamic(() => import('../components/ClientOnlyComponent'), { ssr: false, loading: () =>Yükleniyor...
, }); export default function MyPage() { return (