Farklı yaşam döngüleri, farklı sorumluluklar
Nuxt 3 güçlü ama ilk başta biraz kafa karıştırıcı bir ekosisteme sahiptir. Özellikle üç kavram sıklıkla birbirine karıştırılır: Middleware, Plugin ve Composable.
Hepsi uygulamanın farklı yaşam döngülerinde devreye girer ve farklı sorumluluklara sahiptir.
Bu yazıda, bu üç kavramın görevlerini, farklarını ve en iyi kullanım senaryolarını örneklerle açıklıyoruz.
1. Middleware - Sayfa Geçişlerini Yönetmek
Middleware, Nuxt’ın yönlendirme (routing) sistemine entegre çalışan, sayfa yüklenmeden önce devreye giren fonksiyonlardır. Genellikle yetkilendirme, yönlendirme kontrolü veya veri doğrulama işlemlerinde kullanılır.Nasıl Çalışır?
Bir sayfaya gitmeden önce middleware devreye girer, izin verirse sayfa yüklenir, aksi halde yönlendirme yapılır.// middleware/auth.global.ts
export default defineNuxtRouteMiddleware((to, from) => {
const user = useSupabaseUser()
if (!user.value) return navigateTo('/login')
})
Türleri
- Route Middleware: Sayfa bazlı veya global çalışır (
middleware/klasöründe). - Server Middleware: API veya sunucu isteği seviyesinde çalışır (
server/middleware/).
Ne Zaman Kullanılır?
- Kimlik doğrulama / yönlendirme kontrolü.
- Route bazlı izin sistemi.
- Sayfa yüklenmeden önce yapılan veri kontrolü.
/login sayfasına yönlendir.”2. Plugin -- Uygulamayı Genişletmek
Plugin, uygulamaya global özellikler, kütüphaneler veya servisler eklemek için kullanılır. Vue instance’ına, Nuxt context’ine veya global app düzeyine müdahale eder.Nasıl Çalışır?
Plugins, uygulama başlatıldığında yüklenir ve app instance’ına erişim sağlar.// plugins/axios.ts
import axios from 'axios'
export default defineNuxtPlugin((nuxtApp) => {
const api = axios.create({ baseURL: '/api' })
nuxtApp.provide('api', api)
})
Artık uygulamanın herhangi bir yerinde:const { $api } = useNuxtApp()
ile bu servisi kullanabilirsin.Ne Zaman Kullanılır?
- Üçüncü parti kütüphaneler (ör. Axios, dayjs, GSAP) entegre edileceğinde.
- Global mixin veya helper eklemek istendiğinde.
- App genelinde kullanılacak servis tanımlamak için.
$api veya $auth servisini tanımlamak.3. Composable -- Mantığı Tekrar Kullanmak
Composable, Composition API’nin bir uzantısıdır. Tekrarlayan mantığı fonksiyon haline getirip farklı bileşenlerde paylaşmanı sağlar. Yani component değil, mantık modülü oluşturursun.Nasıl Çalışır?
Composable dosyalarcomposables/ klasörüne yazılır. Bu klasör otomatik olarak global import edilir (Nuxt 3 özelliği).// composables/useCounter.ts
export const useCounter = () => {
const count = ref(0)
const inc = () => count.value++
const dec = () => count.value--
return { count, inc, dec }
}
Artık herhangi bir bileşende:const { count, inc } = useCounter()
şeklinde kullanabilirsin.Ne Zaman Kullanılır?
- Birden fazla bileşende aynı mantığı paylaşmak istediğinde.
- LocalStorage, API çağrıları, form doğrulama gibi kodları tek yerde toplamak istediğinde.
- Daha modüler, test edilebilir yapı kurmak için.
Karşılaştırma Tablosu
| Özellik | Middleware | Plugin | Composable |
|---|---|---|---|
| Çalışma zamanı | Route değişiminde | App yüklenirken | Bileşen çağrıldığında |
| Amaç | Route kontrolü | Global servis tanımı | Mantık paylaşımı |
| SSR desteği | ✅ | ✅ | ✅ |
| Kapsam | Route / Server | Uygulama genelinde | Yerel veya global |
| Kullanım yeri | middleware/ | plugins/ | composables/ |
Örnek Senaryo
Bir uygulamada kullanıcı doğrulaması yapıyorsun.- Giriş kontrolü → Middleware (
auth.global.ts) - Auth servisinin oluşturulması → Plugin (
plugins/auth.ts) - Login mantığının component dışında paylaşımı → Composable (
useAuth.ts)
middleware/auth.global.ts → Erişim kontrolü
plugins/auth.ts → $auth servisi tanımı
composables/useAuth.ts → Login / logout mantığı
Üçü birlikte çalışır, ama birbirine karışmaz.Sık Karıştırılan Durumlar
- Composable’da Plugin kullanmak: Evet, mümkündür. Örneğin
$api’yi bir composable içinde kullanabilirsin. - Middleware’de Composable çağırmak: Evet, bu da mümkündür. Çünkü middleware bile setup aşamasında çalışır.
- Plugin içinde reactive tanım: Yapılabilir ama dikkatli ol; plugin’ler globaldir, state paylaşımı riski vardır.
useState() kullan. Bu, SSR sırasında her request için izole context yaratır.Sonuç
Nuxt 3’te:- Middleware → “Gitmeden önce kontrol et.”
- Plugin → “Uygulamayı genişlet.” 🔌
- Composable → “Mantığı paylaş.”