{"id":34550,"date":"2025-11-18T18:41:37","date_gmt":"2025-11-18T15:41:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34550"},"modified":"2025-11-18T18:41:37","modified_gmt":"2025-11-18T15:41:37","slug":"vue-js-asenkron-bilesenlere-giris","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/","title":{"rendered":"Vue.js Asenkron Bile\u015fenlere Giri\u015f"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini (UX) iyile\u015ftirmek ve ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcrelerini optimize etmek i\u00e7in genellikle kod b\u00f6lme (code splitting) ve tembel y\u00fckleme (lazy loading) tekniklerini kullan\u0131r. Vue.js, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere asenkron bile\u015fenler (async components) ad\u0131 verilen g\u00fc\u00e7l\u00fc bir \u00f6zellik sunar. Bu bile\u015fenler, yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fcklenir, bu da uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 paket boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve genel performans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Ancak, asenkron y\u00fckleme i\u015flemi s\u0131ras\u0131nda kullan\u0131c\u0131ya geri bildirim sa\u011flamak hayati \u00f6neme sahiptir. Kullan\u0131c\u0131lar, bir bile\u015fenin y\u00fcklendi\u011fini veya bir hata olu\u015ftu\u011funu bilmek ister. Bu rehberde, Vue.js asenkron bile\u015fenlerini kullanarak y\u00fckleme ve hata durumlar\u0131n\u0131 nas\u0131l etkin bir \u015fekilde y\u00f6netece\u011finizi, pratik kod \u00f6rnekleri ve en iyi uygulamalarla ele alaca\u011f\u0131z.<\/p>\n<h2>Vue.js Asenkron Bile\u015fenlere Giri\u015f<\/h2>\n<p>Asenkron bile\u015fenler, bir bile\u015feni dinamik olarak i\u00e7eri aktarman\u0131za olanak tan\u0131r. Vue 3&#8217;te bu i\u015flem, <code>defineAsyncComponent<\/code> yard\u0131mc\u0131 fonksiyonu arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Bu fonksiyon, bir factory fonksiyonu al\u0131r ve bu fonksiyon, bile\u015feni d\u00f6nd\u00fcren bir Promise d\u00f6nd\u00fcrmelidir.<\/p>\n<h3>Neden Asenkron Bile\u015fenler Kullanmal\u0131y\u0131z?<\/h3>\n<ul>\n<li><strong>Performans \u0130yile\u015ftirme:<\/strong> Uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcresini ve paket boyutunu azalt\u0131r.<\/li>\n<li><strong>Kaynak Verimlili\u011fi:<\/strong> Bellek ve CPU kaynaklar\u0131n\u0131 yaln\u0131zca ihtiya\u00e7 duyulan bile\u015fenler i\u00e7in kullan\u0131r.<\/li>\n<li><strong>Daha \u0130yi Kullan\u0131c\u0131 Deneyimi:<\/strong> B\u00fcy\u00fck uygulamalarda kullan\u0131c\u0131lar\u0131n daha h\u0131zl\u0131 etkile\u015fime ge\u00e7mesini sa\u011flar.<\/li>\n<\/ul>\n<h3>Temel Asenkron Bile\u015fen Tan\u0131mlamas\u0131<\/h3>\n<p>En basit haliyle, bir asenkron bile\u015feni \u015fu \u015fekilde tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/MyAsyncComponent.vue\n\/\/ Bu bile\u015fen sadece ihtiya\u00e7 duyuldu\u011funda y\u00fcklenecek\n\n\/\/ Uygulaman\u0131z\u0131n ana dosyas\u0131nda veya bir bile\u015fen i\u00e7inde\nimport { defineAsyncComponent } from 'vue';\n\nconst MyAsyncComponent = defineAsyncComponent(() =>\n  import('.\/MyAsyncComponent.vue')\n);\n\nexport default {\n  components: {\n    MyAsyncComponent,\n  },\n  template: <code>\n    <div>\n      <h3>Ana Bile\u015fen<\/h3>\n      <MyAsyncComponent \/>\n    <\/div>\n  <\/code>,\n};\n<\/code><\/pre>\n<p>Bu kod, <code>MyAsyncComponent.vue<\/code> dosyas\u0131n\u0131 yaln\u0131zca <code>MyAsyncComponent<\/code> ilk kez render edildi\u011finde y\u00fckleyecektir. Ancak, bu temel kurulumda y\u00fckleme s\u00fcreci veya olas\u0131 hatalar hakk\u0131nda herhangi bir geri bildirim yoktur.<\/p>\n<h2>Y\u00fckleme Durumu Y\u00f6netimi<\/h2>\n<p>Bir asenkron bile\u015fen y\u00fcklenirken kullan\u0131c\u0131ya bir g\u00f6sterge sunmak, uygulaman\u0131z\u0131n duyarl\u0131 oldu\u011funu hissettirir. <code>defineAsyncComponent<\/code> fonksiyonu, y\u00fckleme durumunu y\u00f6netmek i\u00e7in bir dizi se\u00e7enek sunar.<\/p>\n<h3>Y\u00fckleme Bile\u015feni Tan\u0131mlama<\/h3>\n<p><code>loadingComponent<\/code> se\u00e7ene\u011fini kullanarak, asenkron bile\u015fen y\u00fcklenirken g\u00f6sterilecek ba\u015fka bir bile\u015fen belirleyebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/LoadingSpinner.vue\n<template>\n  <div class=\"loading-spinner\">\n    Y\u00fckleniyor...\n    <!-- Basit bir y\u00fckleme animasyonu eklenebilir -->\n  <\/div>\n<\/template>\n\n<style scoped>\n.loading-spinner {\n  padding: 20px;\n  border: 1px solid #ddd;\n  background-color: #f9f9f9;\n  text-align: center;\n  color: #555;\n  font-weight: bold;\n}\n<\/style>\n<\/code><\/pre>\n<p>\u015eimdi bu y\u00fckleme bile\u015fenini asenkron bile\u015fen tan\u0131m\u0131m\u0131za ekleyelim:<\/p>\n<pre><code class=\"language-javascript\">\nimport { defineAsyncComponent } from 'vue';\nimport LoadingSpinner from '.\/LoadingSpinner.vue';\n\nconst MyAsyncComponent = defineAsyncComponent({\n  loader: () => import('.\/MyAsyncComponent.vue'),\n  loadingComponent: LoadingSpinner,\n  \/\/ Di\u011fer se\u00e7enekler buraya gelecek\n});\n\nexport default {\n  components: {\n    MyAsyncComponent,\n  },\n  template: <code>\n    <div>\n      <h3>Ana Bile\u015fen<\/h3>\n      <MyAsyncComponent \/>\n    <\/div>\n  <\/code>,\n};\n<\/code><\/pre>\n<h3>Gecikme (Delay) ve Zaman A\u015f\u0131m\u0131 (Timeout) Kullan\u0131m\u0131<\/h3>\n<p>Bazen bile\u015fenler o kadar h\u0131zl\u0131 y\u00fcklenir ki, y\u00fckleme g\u00f6stergesinin k\u0131sa bir anl\u0131\u011f\u0131na yan\u0131p s\u00f6nmesi kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir. <code>delay<\/code> se\u00e7ene\u011fi, y\u00fckleme bile\u015feninin g\u00f6sterilmeden \u00f6nce beklenecek s\u00fcreyi (milisaniye cinsinden) belirlemenizi sa\u011flar. Bu sayede, \u00e7ok h\u0131zl\u0131 y\u00fcklenen bile\u015fenler i\u00e7in y\u00fckleme g\u00f6stergesi hi\u00e7 g\u00f6r\u00fcnmez.<\/p>\n<p><code>timeout<\/code> se\u00e7ene\u011fi ise, asenkron bile\u015fenin y\u00fcklenmesi i\u00e7in beklenecek maksimum s\u00fcreyi (milisaniye cinsinden) belirler. Belirlenen s\u00fcre i\u00e7inde bile\u015fen y\u00fcklenmezse, bir hata durumu tetiklenir.<\/p>\n<pre><code class=\"language-javascript\">\nimport { defineAsyncComponent } from 'vue';\nimport LoadingSpinner from '.\/LoadingSpinner.vue';\nimport ErrorDisplay from '.\/ErrorDisplay.vue'; \/\/ Hata bile\u015fenini de ekleyelim\n\nconst MyAsyncComponent = defineAsyncComponent({\n  loader: () => new Promise((resolve) => {\n    \/\/ Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131 veya a\u011f gecikmesi sim\u00fcle edelim\n    setTimeout(() => {\n      resolve(import('.\/MyAsyncComponent.vue'));\n    }, 2000); \/\/ 2 saniye sonra y\u00fcklenecek\n  }),\n  \n  loadingComponent: LoadingSpinner,\n  delay: 200, \/\/ Y\u00fckleme bile\u015fenini g\u00f6stermeden \u00f6nce 200ms bekle\n  \n  errorComponent: ErrorDisplay,\n  timeout: 3000, \/\/ 3 saniye i\u00e7inde y\u00fcklenmezse hata ver\n});\n\n\/\/ ... di\u011fer kodlar\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, bile\u015fen 2 saniye sonra y\u00fcklenecek. <code>delay: 200<\/code> sayesinde, ilk 200ms boyunca hi\u00e7bir \u015fey g\u00f6sterilmeyecek. Ard\u0131ndan, <code>LoadingSpinner<\/code> bile\u015feni 1.8 saniye boyunca g\u00f6r\u00fcnecek. E\u011fer y\u00fckleme 3 saniyeyi a\u015fsayd\u0131 (\u00f6rne\u011fin 4 saniye olsayd\u0131), <code>ErrorDisplay<\/code> bile\u015feni g\u00f6r\u00fcnecekti.<\/p>\n<h2>Hata Durumu Y\u00f6netimi<\/h2>\n<p>A\u011f sorunlar\u0131, sunucu hatalar\u0131 veya yanl\u0131\u015f dosya yollar\u0131 gibi \u00e7e\u015fitli nedenlerle asenkron bile\u015fen y\u00fcklemesi ba\u015far\u0131s\u0131z olabilir. Bu durumda kullan\u0131c\u0131ya anlaml\u0131 bir hata mesaj\u0131 g\u00f6stermek ve belki de yeniden deneme se\u00e7ene\u011fi sunmak \u00f6nemlidir.<\/p>\n<h3>Hata Bile\u015feni Tan\u0131mlama<\/h3>\n<p><code>errorComponent<\/code> se\u00e7ene\u011fi, asenkron y\u00fckleme ba\u015far\u0131s\u0131z oldu\u011funda g\u00f6sterilecek bile\u015feni belirler.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/ErrorDisplay.vue\n<template>\n  <div class=\"error-display\">\n    <p>Bile\u015fen y\u00fcklenirken bir hata olu\u015ftu.<\/p>\n    <button @click=\"retry\">Tekrar Dene<\/button>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  props: {\n    error: Error, \/\/ Hata nesnesi (Vue taraf\u0131ndan sa\u011flan\u0131r)\n    retry: Function, \/\/ Yeniden deneme fonksiyonu (Vue taraf\u0131ndan sa\u011flan\u0131r)\n  },\n};\n<\/script>\n\n<style scoped>\n.error-display {\n  padding: 20px;\n  border: 1px solid #f00;\n  background-color: #ffe0e0;\n  color: #c00;\n  text-align: center;\n}\n.error-display button {\n  margin-top: 10px;\n  padding: 8px 15px;\n  background-color: #c00;\n  color: white;\n  border: none;\n  cursor: pointer;\n}\n<\/style>\n<\/code><\/pre>\n<p><code>errorComponent<\/code>&#8216;e, y\u00fckleme hatas\u0131 durumunda otomatik olarak <code>error<\/code> ve <code>retry<\/code> ad\u0131nda iki prop iletilir. <code>error<\/code>, hata nesnesini i\u00e7erir, <code>retry<\/code> ise y\u00fckleme i\u015flemini yeniden ba\u015flatacak bir fonksiyondur.<\/p>\n<p>Asenkron bile\u015fen tan\u0131m\u0131na hata bile\u015fenini ekleyelim:<\/p>\n<pre><code class=\"language-javascript\">\nimport { defineAsyncComponent } from 'vue';\nimport LoadingSpinner from '.\/LoadingSpinner.vue';\nimport ErrorDisplay from '.\/ErrorDisplay.vue';\n\nconst MyAsyncComponent = defineAsyncComponent({\n  loader: () => new Promise((resolve, reject) => {\n    \/\/ Hata senaryosu sim\u00fcle edelim\n    setTimeout(() => {\n      \/\/ Math.random() < 0.5 ? resolve(...) : reject(new Error(&#039;Y\u00fckleme hatas\u0131!&#039;))\n      reject(new Error(&#039;A\u011f ba\u011flant\u0131s\u0131 kesildi veya dosya bulunamad\u0131.&#039;)); \n    }, 1500); \n  }),\n  \n  loadingComponent: LoadingSpinner,\n  delay: 200,\n  \n  errorComponent: ErrorDisplay,\n  timeout: 3000,\n});\n\n\/\/ ... di\u011fer kodlar\n<\/code><\/pre>\n<h3>onError Callback Fonksiyonu<\/h3>\n<p>Daha karma\u015f\u0131k hata y\u00f6netimi veya hata loglama senaryolar\u0131 i\u00e7in <code>onError<\/code> callback fonksiyonunu kullanabilirsiniz. Bu fonksiyon, bir hata olu\u015ftu\u011funda tetiklenir ve hata nesnesini, yeniden deneme fonksiyonunu ve asenkron y\u00fcklemeyi yapan fonksiyonu (<code>retries<\/code>) arg\u00fcman olarak al\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\nimport { defineAsyncComponent } from 'vue';\nimport LoadingSpinner from '.\/LoadingSpinner.vue';\nimport ErrorDisplay from '.\/ErrorDisplay.vue';\n\nconst MyAsyncComponent = defineAsyncComponent({\n  loader: () => new Promise((resolve, reject) => {\n    setTimeout(() => {\n      \/\/ \u00d6rnek bir hata\n      reject(new Error('API yan\u0131t vermedi.'));\n    }, 1000); \n  }),\n  \n  loadingComponent: LoadingSpinner,\n  delay: 200,\n  \n  errorComponent: ErrorDisplay,\n  timeout: 3000,\n\n  onError: (error, retry, fail, attempts) => {\n    console.error('Asenkron bile\u015fen y\u00fcklenirken hata olu\u015ftu:', error.message);\n    if (attempts <= 3) {\n      \/\/ 3 denemeye kadar tekrar et\n      console.log(<code>${attempts}. deneme yap\u0131l\u0131yor...<\/code>);\n      retry(); \/\/ Yeniden deneme fonksiyonunu \u00e7a\u011f\u0131r\n    } else {\n      console.error('Maksimum deneme say\u0131s\u0131 a\u015f\u0131ld\u0131.');\n      fail(); \/\/ Tamamen ba\u015far\u0131s\u0131z oldu\u011funu i\u015faretle (errorComponent g\u00f6sterilir)\n    }\n  },\n});\n\n\/\/ ... di\u011fer kodlar\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>onError<\/code> fonksiyonu, hatay\u0131 konsola loglar ve 3 denemeye kadar otomatik olarak yeniden y\u00fcklemeyi dener. Maksimum deneme say\u0131s\u0131na ula\u015f\u0131ld\u0131\u011f\u0131nda <code>fail()<\/code> \u00e7a\u011fr\u0131l\u0131r ve <code>errorComponent<\/code> g\u00f6sterilir.<\/p>\n<h2>\u0130leri Seviye Kullan\u0131m ve En \u0130yi Pratikler<\/h2>\n<p>Asenkron bile\u015fenlerinizi daha verimli ve kullan\u0131c\u0131 dostu hale getirmek i\u00e7in baz\u0131 ileri seviye teknikler ve en iyi pratikler mevcuttur.<\/p>\n<h3>Global Asenkron Bile\u015fen Ayarlar\u0131<\/h3>\n<p>Uygulaman\u0131zda \u00e7ok say\u0131da asenkron bile\u015fen kullan\u0131yorsan\u0131z ve hepsi i\u00e7in ayn\u0131 y\u00fckleme\/hata bile\u015fenlerini veya gecikme\/zaman a\u015f\u0131m\u0131 ayarlar\u0131n\u0131 kullanmak istiyorsan\u0131z, bunlar\u0131 global olarak tan\u0131mlamak tekrar\u0131 \u00f6nler.<\/p>\n<p>Bunu, kendi \u00f6zel bir sar\u0131c\u0131 (wrapper) fonksiyonunuzu olu\u015fturarak veya Vue uygulamas\u0131n\u0131n <code>app.component<\/code> metodunu kullanarak yapabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ main.js veya app.js\nimport { createApp, defineAsyncComponent } from 'vue';\nimport App from '.\/App.vue';\nimport LoadingSpinner from '.\/components\/LoadingSpinner.vue';\nimport ErrorDisplay from '.\/components\/ErrorDisplay.vue';\n\nconst app = createApp(App);\n\n\/\/ Global bir asenkron bile\u015fen sar\u0131c\u0131s\u0131 olu\u015fturma\nconst createGlobalAsyncComponent = (loaderFn) => {\n  return defineAsyncComponent({\n    loader: loaderFn,\n    loadingComponent: LoadingSpinner,\n    errorComponent: ErrorDisplay,\n    delay: 200,\n    timeout: 5000,\n    onError: (error, retry, fail, attempts) => {\n      console.error('Global async component error:', error.message);\n      if (attempts <= 2) {\n        retry();\n      } else {\n        fail();\n      }\n    },\n  });\n};\n\n\/\/ \u015eimdi bu sar\u0131c\u0131y\u0131 kullanarak asenkron bile\u015fenlerinizi tan\u0131mlay\u0131n\napp.component('GlobalAsyncComponent', createGlobalAsyncComponent(() => import('.\/components\/AnotherAsyncComponent.vue')));\n\napp.mount('#app');\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, her <code>defineAsyncComponent<\/code> \u00e7a\u011fr\u0131s\u0131nda ayn\u0131 se\u00e7enekleri tekrarlamaktan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Suspense API ile Entegrasyon (Vue 3)<\/h3>\n<p>Vue 3'te <code>Suspense<\/code> bile\u015feni, birden \u00e7ok asenkron bile\u015feni veya kurulum fonksiyonundaki asenkron i\u015flemleri tek bir y\u00fckleme durumu alt\u0131nda y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>defineAsyncComponent<\/code>, tek bir bile\u015fen i\u00e7in y\u00fckleme\/hata durumunu y\u00f6netirken, <code>Suspense<\/code> daha genel bir koordinasyon sa\u011flar.<\/p>\n<pre><code class=\"language-html\">\n<template>\n  <Suspense>\n    <!-- Ana i\u00e7erik -->\n    <template #default>\n      <MyAsyncComponent \/>\n      <AnotherAsyncDataComponent \/>\n    <\/template>\n\n    <!-- Y\u00fcklenirken g\u00f6sterilecek i\u00e7erik -->\n    <template #fallback>\n      <LoadingSpinner \/>\n    <\/template>\n  <\/Suspense>\n<\/template>\n\n<script>\nimport { defineAsyncComponent } from 'vue';\nimport LoadingSpinner from '.\/LoadingSpinner.vue';\n\nconst MyAsyncComponent = defineAsyncComponent(() => import('.\/MyAsyncComponent.vue'));\nconst AnotherAsyncDataComponent = defineAsyncComponent(() => import('.\/AnotherAsyncDataComponent.vue'));\n\nexport default {\n  components: {\n    MyAsyncComponent,\n    AnotherAsyncDataComponent,\n    LoadingSpinner,\n  },\n};\n<\/script>\n<\/code><\/pre>\n<p><code>Suspense<\/code>, i\u00e7indeki t\u00fcm asenkron ba\u011f\u0131ml\u0131l\u0131klar \u00e7\u00f6z\u00fclene kadar <code>fallback<\/code> i\u00e7eri\u011fini g\u00f6sterir. Hata y\u00f6netimi i\u00e7in ise <code>Suspense<\/code>'i \u00e7evreleyen bir hata s\u0131n\u0131r\u0131 (error boundary) kullanman\u0131z gerekebilir.<\/p>\n<h3>Kullan\u0131c\u0131 Deneyimi (UX) \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li><strong>Anlaml\u0131 Y\u00fckleme Mesajlar\u0131:<\/strong> Sadece \"Y\u00fckleniyor...\" yerine, \"\u00dcr\u00fcn Detaylar\u0131 Y\u00fckleniyor...\", \"Veriler Getiriliyor...\" gibi daha spesifik mesajlar kullan\u0131n.<\/li>\n<li><strong>Tutarl\u0131 Tasar\u0131m:<\/strong> Y\u00fckleme ve hata bile\u015fenlerinizin uygulaman\u0131z\u0131n genel tasar\u0131m diliyle uyumlu oldu\u011fundan emin olun.<\/li>\n<li><strong>Hata Mesajlar\u0131nda Detay:<\/strong> Hata mesajlar\u0131 kullan\u0131c\u0131 dostu olmal\u0131, ancak geli\u015ftiriciler i\u00e7in gerekirse daha fazla teknik detay i\u00e7erebilir (konsola loglama yoluyla).<\/li>\n<li><strong>Yeniden Deneme Butonu:<\/strong> Hata durumunda kullan\u0131c\u0131ya \"Tekrar Dene\" se\u00e7ene\u011fi sunmak, kullan\u0131c\u0131lar\u0131n sorunlar\u0131 kendi ba\u015flar\u0131na \u00e7\u00f6zmelerine yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Eri\u015filebilirlik (Accessibility):<\/strong> Y\u00fckleme ve hata durumlar\u0131 i\u00e7in uygun ARIA niteliklerini ve ekran okuyucu dostu metinleri kullan\u0131n.<\/li>\n<\/ul>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Vue.js asenkron bile\u015fenleri, modern web uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. <code>defineAsyncComponent<\/code> taraf\u0131ndan sunulan <code>loadingComponent<\/code>, <code>errorComponent<\/code>, <code>delay<\/code>, <code>timeout<\/code> ve <code>onError<\/code> gibi se\u00e7enekleri etkin bir \u015fekilde kullanarak, hem uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rabilir hem de kullan\u0131c\u0131lar\u0131n\u0131za kesintisiz ve bilgilendirici bir deneyim sunabilirsiniz. Y\u00fckleme ve hata durumlar\u0131n\u0131 do\u011fru bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini ve profesyonelli\u011fini g\u00f6sterir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>S1: <code>defineAsyncComponent<\/code> ile <code>Suspense<\/code> aras\u0131ndaki fark nedir?<\/h4>\n<p><strong>C:<\/strong> <code>defineAsyncComponent<\/code>, tek bir bile\u015fenin tembel y\u00fcklemesi s\u0131ras\u0131nda kendi y\u00fckleme ve hata durumlar\u0131n\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. <code>Suspense<\/code> ise, birden \u00e7ok asenkron ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 (birden \u00e7ok asenkron bile\u015fen veya <code>setup()<\/code> i\u00e7indeki asenkron i\u015flemler) tek bir \u00fcst d\u00fczey y\u00fckleme g\u00f6stergesi alt\u0131nda koordine etmek i\u00e7in tasarlanm\u0131\u015f bir bile\u015fendir. Birbirini tamamlay\u0131c\u0131 olarak kullan\u0131labilirler.<\/p>\n<h4>S2: T\u00fcm asenkron bile\u015fenler i\u00e7in global ayarlar nas\u0131l yap\u0131l\u0131r?<\/h4>\n<p><strong>C:<\/strong> Kendi \u00f6zel bir sar\u0131c\u0131 fonksiyonu olu\u015fturarak ve bu fonksiyonu kullanarak asenkron bile\u015fenlerinizi tan\u0131mlayarak global ayarlar yapabilirsiniz. \u00d6rne\u011fin, <code>createGlobalAsyncComponent<\/code> gibi bir fonksiyon tan\u0131mlay\u0131p, t\u00fcm ortak se\u00e7enekleri bu fonksiyonda belirleyebilirsiniz.<\/p>\n<h4>S3: Hata durumunda yeniden deneme butonu nas\u0131l eklenir?<\/h4>\n<p><strong>C:<\/strong> <code>errorComponent<\/code> prop'una iletilen hata bile\u015feninizde, Vue taraf\u0131ndan otomatik olarak prop olarak sa\u011flanan <code>retry<\/code> fonksiyonunu \u00e7a\u011f\u0131racak bir buton ekleyebilirsiniz. Ayr\u0131ca <code>onError<\/code> callback'ini kullanarak da programatik olarak yeniden deneme mant\u0131\u011f\u0131 uygulayabilirsiniz.<\/p>\n<h4>S4: Y\u00fckleme bile\u015feni ne zaman g\u00f6sterilmeli?<\/h4>\n<p><strong>C:<\/strong> K\u0131sa y\u00fcklemelerde (\u00f6rne\u011fin 200ms'den az) y\u00fckleme bile\u015feni g\u00f6stermek genellikle gereksizdir ve kullan\u0131c\u0131 deneyimini bozabilir (yan\u0131p s\u00f6nme etkisi). <code>delay<\/code> se\u00e7ene\u011fini kullanarak, y\u00fckleme bile\u015feninin g\u00f6sterilmeden \u00f6nce k\u0131sa bir s\u00fcre beklemesini sa\u011flayabilirsiniz. Bu, h\u0131zl\u0131 y\u00fcklemeler i\u00e7in y\u00fckleme g\u00f6stergesinin g\u00f6r\u00fcnmesini engeller.<\/p>\n<h4>S5: Production ortam\u0131nda hata mesajlar\u0131 nas\u0131l y\u00f6netilmeli?<\/h4>\n<p><strong>C:<\/strong> Production ortam\u0131nda kullan\u0131c\u0131lara g\u00f6sterilen hata mesajlar\u0131 genel, anla\u015f\u0131l\u0131r ve eylem odakl\u0131 olmal\u0131d\u0131r (\"Bir sorun olu\u015ftu, l\u00fctfen daha sonra tekrar deneyin\"). Ancak, geli\u015ftiriciler i\u00e7in daha detayl\u0131 hata bilgilerini bir hata izleme servisine (Sentry, Bugsnag vb.) g\u00f6ndermek veya konsola loglamak \u00f6nemlidir. <code>onError<\/code> callback'i bu entegrasyon i\u00e7in ideal bir yerdir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini (UX) iyile\u015ftirmek ve ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcrelerini optimize etmek i\u00e7in genellikle kod b\u00f6lme","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1402],"tags":[],"class_list":{"0":"post-34550","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vue.js Asenkron Bile\u015fenlere Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Asenkron Bile\u015fenlere Giri\u015f\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini (UX) iyile\u015ftirmek ve ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcrelerini optimize etmek i\u00e7in genellikle kod b\u00f6lme\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-18T15:41:37+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Asenkron Bile\u015fenlere Giri\u015f\",\"datePublished\":\"2025-11-18T15:41:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\"},\"wordCount\":1432,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\",\"name\":\"Vue.js Asenkron Bile\u015fenlere Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-18T15:41:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Asenkron Bile\u015fenlere Giri\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vue.js Asenkron Bile\u015fenlere Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Asenkron Bile\u015fenlere Giri\u015f","og_description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini (UX) iyile\u015ftirmek ve ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcrelerini optimize etmek i\u00e7in genellikle kod b\u00f6lme","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-18T15:41:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Asenkron Bile\u015fenlere Giri\u015f","datePublished":"2025-11-18T15:41:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/"},"wordCount":1432,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/","name":"Vue.js Asenkron Bile\u015fenlere Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-18T15:41:37+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-asenkron-bilesenlere-giris\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Asenkron Bile\u015fenlere Giri\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34550"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34550\/revisions"}],"predecessor-version":[{"id":34551,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34550\/revisions\/34551"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}