Cansu Arı Logo
Blog
Nedir?

Middleware, Plugin ve Composable Arasındaki Fark

Nuxt 3 projelerinde sıkça duyulan üç kavram: Middleware, Plugin ve Composable. Hepsi farklı katmanlarda çalışır ama çoğu zaman birbirine karıştırılır. Aralarındaki farkı netleştirelim!

  • #Nuxt 3
  • #Vue.js

Skip to content

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ü.
Örnek: “Eğer kullanıcı giriş yapmadıysa /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.
Örnek: Uygulamanın her yerinde kullanılacak $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 dosyalar composables/ 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.
Örnek: useAuth(), useTheme(), useForm() gibi fonksiyonlar tamamen composable mantığıdır.

Karşılaştırma Tablosu

ÖzellikMiddlewarePluginComposable
Çalışma zamanıRoute değişimindeApp yüklenirkenBileşen çağrıldığında
AmaçRoute kontrolüGlobal servis tanımıMantık paylaşımı
SSR desteği
KapsamRoute / ServerUygulama genelindeYerel veya global
Kullanım yerimiddleware/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

  1. Composable’da Plugin kullanmak: Evet, mümkündür. Örneğin $api’yi bir composable içinde kullanabilirsin.
  2. Middleware’de Composable çağırmak: Evet, bu da mümkündür. Çünkü middleware bile setup aşamasında çalışır.
  3. Plugin içinde reactive tanım: Yapılabilir ama dikkatli ol; plugin’ler globaldir, state paylaşımı riski vardır.
💡 Pro tip: Global değişken tutmak istiyorsan 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ş.”
Bu üç yapı birlikte kullanıldığında Nuxt projeleri modüler, test edilebilir ve okunabilir hale gelir. Doğru yerde doğru yapı kullanmak, sadece performansı değil, kod mimarisini de güçlü kılar.
All tags
  • Nuxt 3
  • Vue.js