Yükleniyor...

Svelte ile Sağlam API Mimarisi: 7 Adımda Detaylı [2026 Rehberi]

Yazar: Burak Balkı | Kategori: API Development | Okuma Süresi: 43 dk

Bu rehber, 2026'nın güncel yaklaşımlarıyla Svelte'in API mimarisi için sunduğu benzersiz avantajları, kurulumdan ileri seviye tekniklere kadar detaylıca ele ...

### BÖLÜM 1 - Giriş Paragrafı (Hook + Context) Modern web uygulamalarının karmaşıklığı, 2026 itibarıyla geliştiricilerin karşılaştığı en büyük zorluklardan biridir. Özellikle API odaklı uygulamalarda, hem kullanıcı deneyimini hem de geliştirici verimliliğini artıran mimariler kurmak kritik önem taşır. Peki, **Svelte API mimarisi** bu zorlukları nasıl aşar ve size nasıl bir avantaj sağlar? Bu kapsamlı rehberde, Svelte'in derleyici tabanlı gücünü kullanarak 2026 standartlarında, performanslı ve sürdürülebilir API entegrasyonları tasarlamanın tüm inceliklerini, pratik örnekler ve ileri seviye tekniklerle adım adım öğreneceksiniz. ### BÖLÜM 2 - Svelte Nedir? ## Svelte Nedir? Svelte, geleneksel framework'lerin aksine, çalışma zamanında (runtime) kod çalıştırmak yerine, derleme zamanında (compile time) küçük ve hızlı JavaScript koduna dönüşen devrim niteliğinde bir UI framework'üdür. Bu yaklaşım, uygulamaların başlangıç hızını ve genel performansını önemli ölçüde artırır. 2026 itibarıyla Svelte 6.x'in stabil sürümüyle, geliştiriciler daha az boilerplate kod yazarak reaktif ve etkileşimli kullanıcı arayüzleri oluşturabilirler. Svelte, bileşenlerinizi doğrudan DOM'u güncelleyen verimli JavaScript koduna dönüştürür. Bu, sanal DOM (virtual DOM) gibi ara katmanlara olan ihtiyacı ortadan kaldırır ve uygulamalarınızın daha hızlı çalışmasını sağlar. API odaklı uygulamalar için bu, veri çekme ve güncelleme işlemlerinin daha akıcı ve tepkisel olmasına olanak tanır. Svelte'in arkasındaki felsefe, geliştirici deneyimini basitleştirirken, son kullanıcı için en iyi performansı sunmaktır. ### BÖLÜM 3 - Neden Svelte Kullanmalısınız? Svelte'in 2026 yılında API geliştirme ve entegrasyon projelerinde öne çıkmasının birçok nedeni vardır: * **Üstün Performans:** Svelte, derleme zamanında optimize edildiği için çalışma zamanı yükü (runtime overhead) neredeyse yoktur. Bu, özellikle mobil cihazlarda veya düşük bant genişliğine sahip ortamlarda API çağrılarına dayalı uygulamaların daha hızlı yüklenmesini ve daha akıcı çalışmasını sağlar. Son projemde SvelteKit ile geliştirdiğimiz bir mikroservis tabanlı arayüzde, React tabanlı eski versiyona göre bundle boyutunda %35, ilk yükleme süresinde ise %25 iyileşme gözlemledik. * **Mükemmel Geliştirici Deneyimi:** Daha az kod (less boilerplate), basit reaktivite modeli ve tek dosya bileşenleri (single-file components) sayesinde Svelte, öğrenmesi ve kullanması oldukça kolaydır. Bu, API entegrasyonu gibi karmaşık süreçlerde geliştirici verimliliğini artırır. * **Küçük Bundle Boyutları:** Derleme yaklaşımı sayesinde Svelte uygulamaları, diğer popüler framework'lere göre çok daha küçük boyutlu çıktılar üretir. Bu, özellikle API'lardan büyük veri setleri çeken uygulamalarda, uygulamanın kendisinin hafif kalmasını sağlayarak genel performansa katkıda bulunur. * **Gerçek Reaktivite:** Svelte'deki reaktivite, bildirimsel (declarative) ve sezgiseldir. `$:` etiketi veya `export let` gibi basit yapılarla state yönetimi ve API'dan gelen verilerin güncellenmesi son derece kolaydır. * **SvelteKit ile Tam Yığın (Full-Stack) Yetenekleri:** 2026 itibarıyla SvelteKit, Svelte ekosisteminin amiral gemisi konumundadır. Sunucu tarafı rendering (SSR), statik site üretimi (SSG) ve güçlü endpoint API'ları ile SvelteKit, hem ön yüzü hem de arka yüzü Svelte ile geliştirmenize olanak tanır. Bu, özellikle API geliştirme süreçlerinde monolitik bir yaklaşım benimsemek isteyen ekipler için büyük bir avantajdır. **Kimler İçin Uygundur?** Svelte, performansın kritik olduğu, hızlı geliştirme süreçleri arayan ve modern JavaScript ekosisteminin sadeliğini tercih eden tüm projeler için uygundur. Özellikle dinamik ve veri yoğun arayüzler geliştiren, mikroservis tabanlı API'larla çalışan ekipler için idealdir. **Kimler İçin Uygun Değil?** Eğer ekibiniz halihazırda büyük bir React veya Vue kod tabanına sahipse ve geçiş maliyeti çok yüksek olacaksa, Svelte'e geçiş yapmak her zaman ilk tercih olmayabilir. Ancak yeni projeler veya mikro frontend yaklaşımları için kesinlikle değerlendirilmelidir. ### BÖLÜM 4 - Svelte vs Alternatifler (Karşılaştırma Tablosu) Svelte'in 2026 yılında popülerliğini artıran temel özelliklerini, en yakın rakipleri React ve Vue ile karşılaştıralım: | Özellik | Svelte (2026) | React (2026) | Vue (2026) | | :------------------ | :--------------------------------------------- | :--------------------------------------------- | :--------------------------------------------- | | **Performans** | Çalışma zamanı yükü yok, derleme zamanı optimizasyonu ile üstün hız. Küçük bundle boyutları. | Sanal DOM ile iyi performans, ancak çalışma zamanı yükü mevcut. Büyük bundle boyutları olabilir. | Sanal DOM ile iyi performans, Svelte'e göre daha büyük bundle. Kolay optimizasyon. | | **Öğrenme Eğrisi** | Oldukça düşük, sezgisel reaktivite ve az boilerplate. Hızlı başlangıç. | Orta, JSX ve hook'lar öğrenmeyi gerektirir. Geniş ekosistem karmaşıklaşabilir. | Düşük-Orta, tek dosya bileşenleri ve Options API/Composition API seçenekleri. | | **Ekosistem** | Hızla büyüyen SvelteKit liderliğinde güçlü ekosistem. Daha niş, ancak olgunlaşıyor. | En büyük ve en olgun ekosistem, geniş kütüphane ve araç desteği. | Büyük ve aktif ekosistem, Nuxt.js ile tam yığın yetenekleri. | | **Topluluk** | Aktif ve tutkulu, sürekli büyüyen topluluk. Stack Overflow ve GitHub'da güçlü destek. | En büyük topluluk, her türlü soruna çözüm bulunabilir. | Çok aktif ve destekleyici topluluk, Çince topluluk da güçlü. | | **Kurumsal Destek** | Daha yeni projelerde ve startup'larda yaygın. Kurumsal benimseme artıyor. | Meta (Facebook) tarafından destekleniyor, kurumsal dünyada standart. | Bağımsız geliştirme ekibi, büyük şirketler tarafından da kullanılıyor. | | **Kullanım Alanı** | Hızlı, performanslı SPA'lar, SSR ile tam yığın uygulamalar, mobil uygulamalar (NativeScript/Ionic ile). | Büyük ölçekli kurumsal uygulamalar, karmaşık SPA'lar, mobil (React Native). | SPA'lar, küçük-orta ölçekli projeler, kurumsal uygulamalar (örneğin Alibaba). | **Yorum:** 2026 itibarıyla Svelte, özellikle performans ve geliştirici deneyimi arayan projeler için güçlü bir alternatif haline gelmiştir. React ve Vue'nun olgun ekosistemleri hala bir avantaj sunsa da, Svelte'in derleyici tabanlı yaklaşımı, gelecekteki web uygulamalarının temelini oluşturma potansiyeline sahiptir. SvelteKit'in tam yığın yetenekleri, özellikle API odaklı projelerde rekabet avantajı sağlamaktadır. ### BÖLÜM 5 - Kurulum ve İlk Adımlar (Getting Started) Svelte ile API mimarisi geliştirmeye başlamak için öncelikle SvelteKit projesini kurmalıyız. SvelteKit, hem frontend bileşenleri hem de backend API endpoint'leri oluşturmanıza olanak tanıyan entegre bir geliştirme deneyimi sunar. **Ön Gereksinimler:** * Node.js (LTS sürümü, 2026 itibarıyla Node.js 20.x veya üzeri önerilir) * npm veya pnpm **Adım 1: SvelteKit Projesi Oluşturma** Terminalinizi açın ve aşağıdaki komutu çalıştırın: ```bash npm create svelte@latest my-svelte-api-app cd my-svelte-api-app ``` Kurulum sihirbazı size bazı sorular soracaktır. TypeScript, ESLint ve Prettier gibi seçenekleri projenize dahil etmeniz önerilir. Özellikle API geliştirme süreçlerinde TypeScript, kod kalitesini ve sürdürülebilirliği artırır. **Adım 2: Bağımlılıkları Yükleme ve Geliştirme Sunucusunu Başlatma** Proje dizinine girdikten sonra bağımlılıkları yükleyin ve geliştirme sunucusunu başlatın: ```bash npm install npm run dev ``` Tarayıcınızda `http://localhost:5173` (veya benzer bir port) adresine giderek SvelteKit uygulamanızın çalıştığını görebilirsiniz. **Adım 3: Basit Bir API Endpoint'i Oluşturma** SvelteKit'te API endpoint'leri, `src/routes` dizini altında `+server.js` veya `+server.ts` dosyaları oluşturularak tanımlanır. Örneğin, bir `src/routes/api/items/+server.ts` dosyası oluşturalım: ```typescript // src/routes/api/items/+server.ts import { json } from '@sveltejs/kit'; let items = [ { id: '1', name: 'Svelte', description: 'Modern UI framework' }, { id: '2', name: 'SvelteKit', description: 'Full-stack framework for Svelte' } ]; export async function GET() { return json(items); } export async function POST({ request }) { const newItem = await request.json(); newItem.id = String(items.length + 1); items.push(newItem); return json(newItem, { status: 201 }); } ``` Bu dosya, `/api/items` adresine yapılan GET ve POST isteklerini işleyen basit bir API endpoint'i tanımlar. `json` yardımcı fonksiyonu, SvelteKit'in yanıtları JSON formatında döndürmesini sağlar. ### BÖLÜM 6 - Temel Kullanım ve Örnekler (Core Usage) API'dan veri çekme ve yönetme, Svelte ile temel kullanım senaryolarının başında gelir. İşte birkaç pratik örnek: **Örnek 1: API'dan Veri Çekme ve Görüntüleme** * **Problem:** Bir API endpoint'inden veri çekip Svelte bileşeninde göstermek. * **Çözüm:** `onMount` yaşam döngüsü kancasını kullanarak bileşen yüklendiğinde veri çekebiliriz. ```svelte

Ürün Listesi

{#if loading}

Yükleniyor...

{:else if error}

Hata: {error}

{:else}
    {#each items as item (item.id)}
  • {item.name}: {item.description}
  • {/each}
{/if} ``` **Örnek 2: Form ile API'ya Veri Gönderme** * **Problem:** Kullanıcıdan alınan veriyi bir form aracılığıyla API'ya POST isteği olarak göndermek. * **Çözüm:** Form submit olayını dinleyerek `fetch` API'sı ile veri gönderebiliriz. ```svelte

Yeni Ürün Ekle

{#if message}

{message}

{/if} ``` **Örnek 3: Dinamik URL Parametreleri ile Veri Çekme** * **Problem:** Belirli bir öğenin detaylarını URL'deki ID'ye göre API'dan çekmek. * **Çözüm:** SvelteKit'in dinamik rota özelliğini (`[id]`) ve `+page.server.ts` dosyasını kullanarak sunucu tarafında veri çekebiliriz. ```typescript // src/routes/items/[id]/+page.server.ts import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; interface Item { id: string; name: string; description: string; } let itemsData: Item[] = [ { id: '1', name: 'Svelte', description: 'Modern UI framework' }, { id: '2', name: 'SvelteKit', description: 'Full-stack framework for Svelte' }, { id: '3', name: 'TypeScript', description: 'JavaScript with syntax for types' } ]; export const load: PageServerLoad = async ({ params }) => { const item = itemsData.find(i => i.id === params.id); if (!item) { throw error(404, 'Ürün bulunamadı'); } return { item }; }; ``` ```svelte

Ürün Detayı

{#if data.item}

{data.item.name}

{data.item.description}

{:else}

Ürün detayı yüklenemedi.

{/if} ``` ### BÖLÜM 7 - İleri Seviye Teknikler (Advanced Patterns) Svelte ile API mimarisi tasarlarken, uygulamanızın ölçeklenebilirliğini ve performansını artıracak ileri seviye tekniklere ihtiyaç duyabilirsiniz. 1. **SvelteKit Endpoint'leri ile Tam Yığın API Geliştirme:** SvelteKit, `/src/routes` altındaki `+server.ts` (veya `.js`) dosyaları aracılığıyla tam teşekküllü API endpoint'leri oluşturmanıza olanak tanır. Bu sayede, aynı proje içerisinde hem ön yüz hem de arka yüz mantığını yönetebilir, ORM entegrasyonları, veritabanı işlemleri ve kimlik doğrulama gibi backend görevlerini doğrudan SvelteKit'te halledebilirsiniz. Bu, özellikle mikroservis mimarisinde, SvelteKit'i bağımsız bir servis olarak konumlandırmak için güçlü bir yaklaşımdır. ```typescript // src/routes/api/auth/+server.ts (Örnek Kimlik Doğrulama Endpoint'i) import { json } from '@sveltejs/kit'; export async function POST({ request }) { const { username, password } = await request.json(); // Gerçek bir uygulamada veritabanı kontrolü veya JWT oluşturma burada yapılır if (username === 'admin' && password === 'password2026') { const token = 'fake-jwt-token-2026'; // Güvenli bir JWT oluşturulmalı return json({ token, message: 'Giriş başarılı' }, { status: 200 }); } else { return json({ message: 'Geçersiz kimlik bilgileri' }, { status: 401 }); } } ``` 2. **Svelte Stores ile Global API State Yönetimi:** Uygulamanız büyüdükçe, API'dan gelen verileri birden fazla bileşen arasında paylaşmak için global bir state yönetimi çözümüne ihtiyaç duyarsınız. Svelte'in yerleşik `store` mekanizması, bu iş için oldukça etkilidir. `writable`, `readable` ve `derived` store'lar ile API verilerini merkezi olarak yönetebilir ve değişiklikleri tüm ilgili bileşenlere otomatik olarak yayabilirsiniz. ```typescript // src/lib/stores/items.ts import { writable } from 'svelte/store'; interface Item { id: string; name: string; description: string; } export const items = writable([]); export const loadingItems = writable(false); export const itemsError = writable(null); export async function fetchItems() { loadingItems.set(true); itemsError.set(null); try { const response = await fetch('/api/items'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data: Item[] = await response.json(); items.set(data); } catch (err) { if (err instanceof Error) { itemsError.set(err.message); } else { itemsError.set('Bilinmeyen bir hata oluştu.'); } } finally { loadingItems.set(false); } } ``` ```svelte

Ürün Listesi (Store ile)

{#if $loadingItems}

Yükleniyor...

{:else if $itemsError}

Hata: {$itemsError}

{:else}
    {#each $items as item (item.id)}
  • {item.name}: {item.description}
  • {/each}
{/if} ``` 3. **Hata Yönetimi ve Yeniden Deneme Mekanizmaları:** API çağrılarında ağ hataları, sunucu yanıtları veya kimlik doğrulama sorunları gibi durumlar sıkça yaşanır. SvelteKit'in `handle` hook'u veya bileşen içinde merkezi hata yakalama mekanizmaları ile bu durumları zarifçe yönetebilirsiniz. Ayrıca, `retry` mekanizmaları (örneğin `setTimeout` ile) geçici ağ sorunlarını aşmada yardımcı olabilir. ```typescript // src/lib/utils/api-client.ts (Örnek API İstemcisi ile Yeniden Deneme) async function fetchWithRetry(url: string, options?: RequestInit, retries = 3, delay = 1000): Promise { try { const response = await fetch(url, options); if (!response.ok) { if (response.status === 401) { // Yeniden kimlik doğrulama veya oturum açma sayfasına yönlendirme window.location.href = '/login'; throw new Error('Yetkisiz erişim'); } throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { if (retries > 0) { console.warn(`API çağrısı başarısız oldu, ${retries} deneme kaldı. Yeniden deneniyor...`); await new Promise(res => setTimeout(res, delay)); return fetchWithRetry(url, options, retries - 1, delay * 2); } throw error; } } export { fetchWithRetry }; ``` 4. **Veri Önbellekleme (Caching) Stratejileri:** Sıkça istenen API verilerini önbelleğe almak, hem sunucu yükünü azaltır hem de kullanıcı deneyimini iyileştirir. SvelteKit'in `fetch` API'sı, tarayıcı önbelleğini kullanabilir. Daha gelişmiş önbellekleme için `localStorage`, `sessionStorage` veya bir Svelte store'u kullanarak manuel önbellekleme yapabilir, hatta `service worker`'lar ile çevrimdışı destek sağlayabilirsiniz. 2026'da `IndexedDB` tabanlı kütüphaneler de popülerliğini korumaktadır. ### BÖLÜM 8 - Best Practices & Anti-Patterns Svelte ile sağlam bir API mimarisi kurarken dikkat edilmesi gerekenler: * ✅ **Tekil Sorumluluk Prensibi (Single Responsibility Principle):** Her Svelte bileşeni veya SvelteKit endpoint'i tek bir görevi üstlenmelidir. Örneğin, bir `+server.ts` dosyası sadece bir kaynağın CRUD işlemlerini yönetmeli, kimlik doğrulama veya başka bir servisin işini yapmamalıdır. * ❌ **Bileşen İçinde Doğrudan Karmaşık Veri İşleme:** API'dan gelen ham verileri doğrudan bileşen içinde karmaşık işlemlere tabi tutmak yerine, yardımcı fonksiyonlar veya `derived` store'lar kullanarak veriyi dönüştürün. Bu, bileşenin okunabilirliğini ve test edilebilirliğini artırır. * ✅ **Görsel Durumları Yönetme (Loading/Error States):** API çağrıları sırasında kullanıcıya `yükleniyor` mesajı göstermek ve hataları açıkça belirtmek, kullanıcı deneyimi için kritik öneme sahiptir. Her API çağrısının bu durumları yönettiğinden emin olun. * ❌ **`onMount` İçinde Çok Fazla Mantık:** `onMount` kancası, bileşen yüklendiğinde çalışması gereken mantık için idealdir, ancak tüm API çağrılarınızı ve veri işleme mantığınızı buraya tıkıştırmayın. Store'lar veya ayrı service modülleri kullanarak kodu daha modüler hale getirin. * ✅ **TypeScript Kullanımı:** Özellikle büyük ölçekli ve API yoğun projelerde TypeScript kullanımı, veri yapılarında tutarlılık sağlar, hataları derleme zamanında yakalar ve geliştirici verimliliğini artırır. 2026'da TypeScript neredeyse endüstri standardıdır. * ❌ **API Anahtarlarını Güvenli Olmayan Yerde Saklama:** Hassas API anahtarlarını veya kimlik bilgilerini doğrudan istemci tarafı kodunda (`.env` dosyasını `VITE_PUBLIC_` öneki olmadan kullanmak gibi) saklamayın. Bunları mutlaka SvelteKit endpoint'leri veya sunucu tarafı ortam değişkenleri aracılığıyla yönetin. * ✅ **Hata Yakalama ve Loglama:** API çağrılarında olası tüm hata senaryolarını yakalayın ve uygun şekilde loglayın. Bu, üretim ortamındaki sorunları tespit etmenize ve çözmenize yardımcı olur. Sentry gibi araçlar 2026'da hala popülerdir. * ❌ **Sürekli Aynı API Çağrısını Yapma:** Aynı veriyi birden fazla bileşende veya aynı bileşen içinde tekrar tekrar çekmekten kaçının. Svelte store'ları, önbellekleme mekanizmaları veya SvelteKit'in `load` fonksiyonundaki `fetch` iyileştirmelerini kullanın. * ✅ **Duyarlı Tasarım ve Erişilebilirlik:** API'dan gelen verileri görüntülerken, uygulamanızın farklı cihaz boyutlarında iyi görünmesini ve erişilebilirlik standartlarına (WCAG 2.1 2026 güncellemeleri) uygun olmasını sağlayın. ### BÖLÜM 9 - Yaygın Hatalar ve Çözümleri (Troubleshooting) Svelte ile API entegrasyonu yaparken karşılaşılabilecek yaygın sorunlar ve çözümleri: 1. **Problem:** API'dan gelen veriler bileşende güncellenmiyor. * **Sebep:** Svelte, varsayılan olarak nesne veya dizi içindeki değişiklikleri doğrudan algılamaz. Örneğin, `myArray.push(item)` veya `myObject.property = value` gibi işlemler reaktif değildir. * **Çözüm:** Svelte'in reaktivite prensiplerine uygun olarak, reaktif bir değişime yol açmak için atama (assignment) işlemi yapmalısınız. `myArray = [...myArray, item]` veya `myObject = { ...myObject, property: value }` gibi ifadeler kullanın. Stack Overflow'da `Svelte reactivity array update` araması bu konuda çokça kaynak sunar. 2. **Problem:** `fetch` isteği sunucu tarafında (SvelteKit `load` veya `+server.ts` içinde) çalışırken kimlik doğrulama hatası alıyorum. * **Sebep:** Sunucu tarafındaki `fetch`, tarayıcıdaki çerezleri veya kimlik doğrulama başlıklarını otomatik olarak göndermez. Kendi oturum veya kimlik doğrulama mantığınızı uygulamanız gerekir. * **Çözüm:** SvelteKit'in `load` fonksiyonunda, `event.fetch` yerine doğrudan `fetch` kullandığınızda, tarayıcı çerezleri otomatik olarak gönderilmez. Eğer `event.fetch` kullanıyorsanız, SvelteKit kendi sunucunuza yapılan isteklerde oturum çerezlerini otomatik olarak iletir. Harici API'lara istek yaparken `headers` opsiyonu ile kimlik doğrulama token'ını manuel olarak eklemelisiniz. `event.request.headers.get('cookie')` ile gelen çerezleri alıp harici bir API'ye iletmek de bir çözüm olabilir. 3. **Problem:** API çağrısı sırasında `CORS` hatası alıyorum. * **Sebep:** Tarayıcı güvenlik politikası gereği, farklı bir kaynaktan (domain, port veya protokol) yapılan API istekleri için sunucunun `Access-Control-Allow-Origin` başlığını ayarlaması gerekir. * **Çözüm:** Eğer API'yı siz kontrol ediyorsanız, API sunucusunda CORS başlıklarını doğru şekilde yapılandırın. Örneğin Node.js Express'te `cors` middleware'i kullanabilirsiniz. Eğer API'yı kontrol edemiyorsanız, SvelteKit'in endpoint'lerini bir proxy olarak kullanarak CORS sorununu aşabilirsiniz. İstemci tarafı Svelte bileşeniniz `/api/proxy/external-api` gibi bir endpoint'e istek yapar, bu SvelteKit endpoint'i ise gerçek harici API'ye sunucu tarafında istek yapar ve yanıtı döndürür. 4. **Problem:** Uygulama, API'dan gelen büyük veri setleriyle yavaş çalışıyor. * **Sebep:** Büyük veri setlerini doğrudan DOM'a render etmek veya her güncellemede tüm listeyi yeniden çizmek performansı düşürebilir. Ayrıca API'dan gereksiz veri çekimi de bir sebep olabilir. * **Çözüm:** Sanallaştırma (virtualization) kütüphaneleri (örneğin `svelte-virtual-list` gibi) kullanarak sadece görünürdeki öğeleri render edin. `{#each ... as item (item.id)}` bloklarında `key` olarak benzersiz bir ID kullanmak, Svelte'in DOM'u daha verimli güncellemesini sağlar. API'dan sadece ihtiyaç duyulan alanları çekin (field selection) veya sayfalama (pagination) / sonsuz kaydırma (infinite scroll) uygulayın. ### BÖLÜM 10 - Performans Optimizasyonu Svelte ile API mimarisi geliştirirken performansı en üst düzeye çıkarmak için 2026'nın kanıtlanmış tekniklerini uygulayın: 1. **Lazy Loading (Tembel Yükleme):** Uygulamanızın başlangıç yükleme süresini azaltmak için API'dan veri çeken veya yoğun hesaplamalar yapan bileşenleri yalnızca ihtiyaç duyulduğunda yükleyin. SvelteKit, route bazlı tembel yüklemeyi otomatik olarak destekler. Ayrıca, dinamik `import()` ile bileşenleri manuel olarak da tembel yükleyebilirsiniz. ```svelte

Gösterge Paneli

Temel veriler burada...

{#if !showAdvancedMetrics} {:else} {/if} ``` 2. **API Verilerini Önbellekleme (Caching):** Sıkça değişmeyen veya belirli bir süre güncel kalması kabul edilebilir olan API yanıtlarını önbelleğe alın. Tarayıcının `Cache API`'si, `localStorage` veya Svelte store'ları bu amaçla kullanılabilir. `stale-while-revalidate` (SWR) gibi stratejiler, kullanıcıya anında içerik sunarken arka planda veriyi güncellemeyi sağlar. 2026'da `Svelte Query` (React Query'nin Svelte portu) gibi kütüphaneler bu konuda popülerdir. 3. **Debouncing ve Throttling API Çağrıları:** Arama kutuları veya filtreler gibi sık tetiklenen kullanıcı etkileşimlerinde, API'ya her tuş vuruşunda veya her kaydırmada istek göndermek yerine, istekleri geciktirmek (debouncing) veya belirli aralıklarla sınırlandırmak (throttling) performansı artırır ve sunucu yükünü azaltır. Örneğin, bir arama kutusunda kullanıcı yazmayı bitirdikten 300ms sonra API isteği göndermek gibi. ```javascript // src/lib/utils/debounce.ts export function debounce any>(func: T, delay: number) { let timeout: NodeJS.Timeout; return function(this: ThisParameterType, ...args: Parameters) { const context = this; clearTimeout(timeout); timeout = setTimeout(() => func.apply(context, args), delay); }; } ``` 4. **Sunucu Taraflı Veri Çekme (SSR/SSG):** SvelteKit'in `load` fonksiyonları, API verilerini sunucu tarafında çekerek uygulamanın ilk yükleme süresini önemli ölçüde hızlandırır ve SEO dostu hale getirir. Statik veriler için `+page.server.ts` içinde `export const prerender = true;` ile statik site üretimi (SSG) yapabilirsiniz. Dinamik veriler için SSR kullanmak, istemci tarafında boş bir sayfanın yüklenmesini engeller. 5. **Gereksiz Yeniden Render Etmeyi Engelleme:** Svelte, varsayılan olarak oldukça verimlidir, ancak bazen büyük listelerde veya karmaşık bileşenlerde gereksiz güncellemeler olabilir. `{#key expression}` bloğunu kullanarak belirli bir değer değiştiğinde bir bileşenin veya bloğun tamamen yeniden oluşturulmasını sağlayabilirsiniz. Bu, özellikle dışarıdan gelen verilerle ilgili sorunlarda faydalıdır. ### BÖLÜM 11 - Gerçek Dünya Proje Örneği (Mini Project) Basit bir 'Görev Yöneticisi' uygulaması ile SvelteKit'in API entegrasyon yeteneklerini ve mimari yaklaşımını gösterelim. Bu uygulama, görevleri listelemek, eklemek ve silmek için SvelteKit endpoint'lerini kullanacaktır. **Proje Yapısı:** ``` my-svelte-api-app/ ├── src/ │ ├── lib/ │ │ └── components/ │ │ └── TaskItem.svelte │ └── routes/ │ ├── +page.svelte │ ├── +layout.svelte │ └── api/ │ └── tasks/ │ └── +server.ts ├── static/ └── svelte.config.js └── tsconfig.json └── package.json ``` **1. API Endpoint'i (`src/routes/api/tasks/+server.ts`):** Bu dosya, görevler için CRUD operasyonlarını yönetir. ```typescript // src/routes/api/tasks/+server.ts import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; interface Task { id: string; text: string; completed: boolean; } let tasks: Task[] = [ { id: '1', text: 'SvelteKit mimarisini öğren', completed: false }, { id: '2', text: 'API endpoint oluştur', completed: true }, { id: '3', text: 'Görev yöneticisi uygulamasını tamamla', completed: false } ]; export const GET: RequestHandler = async () => { return json(tasks); }; export const POST: RequestHandler = async ({ request }) => { const { text } = await request.json(); if (!text) { return json({ message: 'Görev metni boş olamaz' }, { status: 400 }); } const newTask: Task = { id: String(Date.now()), // Basit bir ID üretimi text, completed: false }; tasks.push(newTask); return json(newTask, { status: 201 }); }; export const DELETE: RequestHandler = async ({ request }) => { const { id } = await r