Takip et

Vue.js Asenkron Bileşenlere Giriş

Modern web uygulamaları, kullanıcı deneyimini (UX) iyileştirmek ve başlangıç yükleme sürelerini optimize etmek için genellikle kod bölme

Modern web uygulamaları, kullanıcı deneyimini (UX) iyileştirmek ve başlangıç yükleme sürelerini optimize etmek için genellikle kod bölme (code splitting) ve tembel yükleme (lazy loading) tekniklerini kullanır. Vue.js, bu ihtiyacı karşılamak üzere asenkron bileşenler (async components) adı verilen güçlü bir özellik sunar. Bu bileşenler, yalnızca ihtiyaç duyulduğunda yüklenir, bu da uygulamanızın başlangıç paket boyutunu küçültür ve genel performansını artırır.

Ancak, asenkron yükleme işlemi sırasında kullanıcıya geri bildirim sağlamak hayati öneme sahiptir. Kullanıcılar, bir bileşenin yüklendiğini veya bir hata oluştuğunu bilmek ister. Bu rehberde, Vue.js asenkron bileşenlerini kullanarak yükleme ve hata durumlarını nasıl etkin bir şekilde yöneteceğinizi, pratik kod örnekleri ve en iyi uygulamalarla ele alacağız.

Vue.js Asenkron Bileşenlere Giriş

Asenkron bileşenler, bir bileşeni dinamik olarak içeri aktarmanıza olanak tanır. Vue 3’te bu işlem, defineAsyncComponent yardımcı fonksiyonu aracılığıyla yapılır. Bu fonksiyon, bir factory fonksiyonu alır ve bu fonksiyon, bileşeni döndüren bir Promise döndürmelidir.

Neden Asenkron Bileşenler Kullanmalıyız?

  • Performans İyileştirme: Uygulamanızın başlangıç yükleme süresini ve paket boyutunu azaltır.
  • Kaynak Verimliliği: Bellek ve CPU kaynaklarını yalnızca ihtiyaç duyulan bileşenler için kullanır.
  • Daha İyi Kullanıcı Deneyimi: Büyük uygulamalarda kullanıcıların daha hızlı etkileşime geçmesini sağlar.

Temel Asenkron Bileşen Tanımlaması

En basit haliyle, bir asenkron bileşeni şu şekilde tanımlayabilirsiniz:


// src/components/MyAsyncComponent.vue
// Bu bileşen sadece ihtiyaç duyulduğunda yüklenecek

// Uygulamanızın ana dosyasında veya bir bileşen içinde
import { defineAsyncComponent } from 'vue';

const MyAsyncComponent = defineAsyncComponent(() =>
  import('./MyAsyncComponent.vue')
);

export default {
  components: {
    MyAsyncComponent,
  },
  template: 
    

Ana Bileşen

, };

Bu kod, MyAsyncComponent.vue dosyasını yalnızca MyAsyncComponent ilk kez render edildiğinde yükleyecektir. Ancak, bu temel kurulumda yükleme süreci veya olası hatalar hakkında herhangi bir geri bildirim yoktur.

Yükleme Durumu Yönetimi

Bir asenkron bileşen yüklenirken kullanıcıya bir gösterge sunmak, uygulamanızın duyarlı olduğunu hissettirir. defineAsyncComponent fonksiyonu, yükleme durumunu yönetmek için bir dizi seçenek sunar.

Yükleme Bileşeni Tanımlama

loadingComponent seçeneğini kullanarak, asenkron bileşen yüklenirken gösterilecek başka bir bileşen belirleyebilirsiniz.


// src/components/LoadingSpinner.vue



Şimdi bu yükleme bileşenini asenkron bileşen tanımımıza ekleyelim:


import { defineAsyncComponent } from 'vue';
import LoadingSpinner from './LoadingSpinner.vue';

const MyAsyncComponent = defineAsyncComponent({
  loader: () => import('./MyAsyncComponent.vue'),
  loadingComponent: LoadingSpinner,
  // Diğer seçenekler buraya gelecek
});

export default {
  components: {
    MyAsyncComponent,
  },
  template: 
    

Ana Bileşen

, };

Gecikme (Delay) ve Zaman Aşımı (Timeout) Kullanımı

Bazen bileşenler o kadar hızlı yüklenir ki, yükleme göstergesinin kısa bir anlığına yanıp sönmesi kullanıcı deneyimini olumsuz etkileyebilir. delay seçeneği, yükleme bileşeninin gösterilmeden önce beklenecek süreyi (milisaniye cinsinden) belirlemenizi sağlar. Bu sayede, çok hızlı yüklenen bileşenler için yükleme göstergesi hiç görünmez.

timeout seçeneği ise, asenkron bileşenin yüklenmesi için beklenecek maksimum süreyi (milisaniye cinsinden) belirler. Belirlenen süre içinde bileşen yüklenmezse, bir hata durumu tetiklenir.


import { defineAsyncComponent } from 'vue';
import LoadingSpinner from './LoadingSpinner.vue';
import ErrorDisplay from './ErrorDisplay.vue'; // Hata bileşenini de ekleyelim

const MyAsyncComponent = defineAsyncComponent({
  loader: () => new Promise((resolve) => {
    // Gerçek bir API çağrısı veya ağ gecikmesi simüle edelim
    setTimeout(() => {
      resolve(import('./MyAsyncComponent.vue'));
    }, 2000); // 2 saniye sonra yüklenecek
  }),
  
  loadingComponent: LoadingSpinner,
  delay: 200, // Yükleme bileşenini göstermeden önce 200ms bekle
  
  errorComponent: ErrorDisplay,
  timeout: 3000, // 3 saniye içinde yüklenmezse hata ver
});

// ... diğer kodlar

Bu örnekte, bileşen 2 saniye sonra yüklenecek. delay: 200 sayesinde, ilk 200ms boyunca hiçbir şey gösterilmeyecek. Ardından, LoadingSpinner bileşeni 1.8 saniye boyunca görünecek. Eğer yükleme 3 saniyeyi aşsaydı (örneğin 4 saniye olsaydı), ErrorDisplay bileşeni görünecekti.

Hata Durumu Yönetimi

Ağ sorunları, sunucu hataları veya yanlış dosya yolları gibi çeşitli nedenlerle asenkron bileşen yüklemesi başarısız olabilir. Bu durumda kullanıcıya anlamlı bir hata mesajı göstermek ve belki de yeniden deneme seçeneği sunmak önemlidir.

Hata Bileşeni Tanımlama

errorComponent seçeneği, asenkron yükleme başarısız olduğunda gösterilecek bileşeni belirler.


// src/components/ErrorDisplay.vue





errorComponent‘e, yükleme hatası durumunda otomatik olarak error ve retry adında iki prop iletilir. error, hata nesnesini içerir, retry ise yükleme işlemini yeniden başlatacak bir fonksiyondur.

Asenkron bileşen tanımına hata bileşenini ekleyelim:


import { defineAsyncComponent } from 'vue';
import LoadingSpinner from './LoadingSpinner.vue';
import ErrorDisplay from './ErrorDisplay.vue';

const MyAsyncComponent = defineAsyncComponent({
  loader: () => new Promise((resolve, reject) => {
    // Hata senaryosu simüle edelim
    setTimeout(() => {
      // Math.random() < 0.5 ? resolve(...) : reject(new Error('Yükleme hatası!'))
      reject(new Error('Ağ bağlantısı kesildi veya dosya bulunamadı.')); 
    }, 1500); 
  }),
  
  loadingComponent: LoadingSpinner,
  delay: 200,
  
  errorComponent: ErrorDisplay,
  timeout: 3000,
});

// ... diğer kodlar

onError Callback Fonksiyonu

Daha karmaşık hata yönetimi veya hata loglama senaryoları için onError callback fonksiyonunu kullanabilirsiniz. Bu fonksiyon, bir hata oluştuğunda tetiklenir ve hata nesnesini, yeniden deneme fonksiyonunu ve asenkron yüklemeyi yapan fonksiyonu (retries) argüman olarak alır.


import { defineAsyncComponent } from 'vue';
import LoadingSpinner from './LoadingSpinner.vue';
import ErrorDisplay from './ErrorDisplay.vue';

const MyAsyncComponent = defineAsyncComponent({
  loader: () => new Promise((resolve, reject) => {
    setTimeout(() => {
      // Örnek bir hata
      reject(new Error('API yanıt vermedi.'));
    }, 1000); 
  }),
  
  loadingComponent: LoadingSpinner,
  delay: 200,
  
  errorComponent: ErrorDisplay,
  timeout: 3000,

  onError: (error, retry, fail, attempts) => {
    console.error('Asenkron bileşen yüklenirken hata oluştu:', error.message);
    if (attempts <= 3) {
      // 3 denemeye kadar tekrar et
      console.log(${attempts}. deneme yapılıyor...);
      retry(); // Yeniden deneme fonksiyonunu çağır
    } else {
      console.error('Maksimum deneme sayısı aşıldı.');
      fail(); // Tamamen başarısız olduğunu işaretle (errorComponent gösterilir)
    }
  },
});

// ... diğer kodlar

Bu örnekte, onError fonksiyonu, hatayı konsola loglar ve 3 denemeye kadar otomatik olarak yeniden yüklemeyi dener. Maksimum deneme sayısına ulaşıldığında fail() çağrılır ve errorComponent gösterilir.

İleri Seviye Kullanım ve En İyi Pratikler

Asenkron bileşenlerinizi daha verimli ve kullanıcı dostu hale getirmek için bazı ileri seviye teknikler ve en iyi pratikler mevcuttur.

Global Asenkron Bileşen Ayarları

Uygulamanızda çok sayıda asenkron bileşen kullanıyorsanız ve hepsi için aynı yükleme/hata bileşenlerini veya gecikme/zaman aşımı ayarlarını kullanmak istiyorsanız, bunları global olarak tanımlamak tekrarı önler.

Bunu, kendi özel bir sarıcı (wrapper) fonksiyonunuzu oluşturarak veya Vue uygulamasının app.component metodunu kullanarak yapabilirsiniz:


// main.js veya app.js
import { createApp, defineAsyncComponent } from 'vue';
import App from './App.vue';
import LoadingSpinner from './components/LoadingSpinner.vue';
import ErrorDisplay from './components/ErrorDisplay.vue';

const app = createApp(App);

// Global bir asenkron bileşen sarıcısı oluşturma
const createGlobalAsyncComponent = (loaderFn) => {
  return defineAsyncComponent({
    loader: loaderFn,
    loadingComponent: LoadingSpinner,
    errorComponent: ErrorDisplay,
    delay: 200,
    timeout: 5000,
    onError: (error, retry, fail, attempts) => {
      console.error('Global async component error:', error.message);
      if (attempts <= 2) {
        retry();
      } else {
        fail();
      }
    },
  });
};

// Şimdi bu sarıcıyı kullanarak asenkron bileşenlerinizi tanımlayın
app.component('GlobalAsyncComponent', createGlobalAsyncComponent(() => import('./components/AnotherAsyncComponent.vue')));

app.mount('#app');

Bu yaklaşım, her defineAsyncComponent çağrısında aynı seçenekleri tekrarlamaktan kaçınmanızı sağlar.

Suspense API ile Entegrasyon (Vue 3)

Vue 3'te Suspense bileşeni, birden çok asenkron bileşeni veya kurulum fonksiyonundaki asenkron işlemleri tek bir yükleme durumu altında yönetmek için tasarlanmıştır. defineAsyncComponent, tek bir bileşen için yükleme/hata durumunu yönetirken, Suspense daha genel bir koordinasyon sağlar.





Suspense, içindeki tüm asenkron bağımlılıklar çözülene kadar fallback içeriğini gösterir. Hata yönetimi için ise Suspense'i çevreleyen bir hata sınırı (error boundary) kullanmanız gerekebilir.

Kullanıcı Deneyimi (UX) İpuçları

  • Anlamlı Yükleme Mesajları: Sadece "Yükleniyor..." yerine, "Ürün Detayları Yükleniyor...", "Veriler Getiriliyor..." gibi daha spesifik mesajlar kullanın.
  • Tutarlı Tasarım: Yükleme ve hata bileşenlerinizin uygulamanızın genel tasarım diliyle uyumlu olduğundan emin olun.
  • Hata Mesajlarında Detay: Hata mesajları kullanıcı dostu olmalı, ancak geliştiriciler için gerekirse daha fazla teknik detay içerebilir (konsola loglama yoluyla).
  • Yeniden Deneme Butonu: Hata durumunda kullanıcıya "Tekrar Dene" seçeneği sunmak, kullanıcıların sorunları kendi başlarına çözmelerine yardımcı olur.
  • Erişilebilirlik (Accessibility): Yükleme ve hata durumları için uygun ARIA niteliklerini ve ekran okuyucu dostu metinleri kullanın.

Sonuç ve Sıkça Sorulan Sorular

Vue.js asenkron bileşenleri, modern web uygulamaları için vazgeçilmez bir araçtır. defineAsyncComponent tarafından sunulan loadingComponent, errorComponent, delay, timeout ve onError gibi seçenekleri etkin bir şekilde kullanarak, hem uygulamanızın performansını artırabilir hem de kullanıcılarınıza kesintisiz ve bilgilendirici bir deneyim sunabilirsiniz. Yükleme ve hata durumlarını doğru bir şekilde yönetmek, uygulamanızın güvenilirliğini ve profesyonelliğini gösterir.

Sıkça Sorulan Sorular (SSS)

S1: defineAsyncComponent ile Suspense arasındaki fark nedir?

C: defineAsyncComponent, tek bir bileşenin tembel yüklemesi sırasında kendi yükleme ve hata durumlarını yönetmek için kullanılır. Suspense ise, birden çok asenkron bağımlılığı (birden çok asenkron bileşen veya setup() içindeki asenkron işlemler) tek bir üst düzey yükleme göstergesi altında koordine etmek için tasarlanmış bir bileşendir. Birbirini tamamlayıcı olarak kullanılabilirler.

S2: Tüm asenkron bileşenler için global ayarlar nasıl yapılır?

C: Kendi özel bir sarıcı fonksiyonu oluşturarak ve bu fonksiyonu kullanarak asenkron bileşenlerinizi tanımlayarak global ayarlar yapabilirsiniz. Örneğin, createGlobalAsyncComponent gibi bir fonksiyon tanımlayıp, tüm ortak seçenekleri bu fonksiyonda belirleyebilirsiniz.

S3: Hata durumunda yeniden deneme butonu nasıl eklenir?

C: errorComponent prop'una iletilen hata bileşeninizde, Vue tarafından otomatik olarak prop olarak sağlanan retry fonksiyonunu çağıracak bir buton ekleyebilirsiniz. Ayrıca onError callback'ini kullanarak da programatik olarak yeniden deneme mantığı uygulayabilirsiniz.

S4: Yükleme bileşeni ne zaman gösterilmeli?

C: Kısa yüklemelerde (örneğin 200ms'den az) yükleme bileşeni göstermek genellikle gereksizdir ve kullanıcı deneyimini bozabilir (yanıp sönme etkisi). delay seçeneğini kullanarak, yükleme bileşeninin gösterilmeden önce kısa bir süre beklemesini sağlayabilirsiniz. Bu, hızlı yüklemeler için yükleme göstergesinin görünmesini engeller.

S5: Production ortamında hata mesajları nasıl yönetilmeli?

C: Production ortamında kullanıcılara gösterilen hata mesajları genel, anlaşılır ve eylem odaklı olmalıdır ("Bir sorun oluştu, lütfen daha sonra tekrar deneyin"). Ancak, geliştiriciler için daha detaylı hata bilgilerini bir hata izleme servisine (Sentry, Bugsnag vb.) göndermek veya konsola loglamak önemlidir. onError callback'i bu entegrasyon için ideal bir yerdir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.