{"id":39382,"date":"2026-02-20T10:40:47","date_gmt":"2026-02-20T07:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39382"},"modified":"2026-02-20T10:40:47","modified_gmt":"2026-02-20T07:40:47","slug":"vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/","title":{"rendered":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na kesintisiz ve tutarl\u0131 bir deneyim sunmay\u0131 hedefler. Ancak internet ba\u011flant\u0131s\u0131n\u0131n do\u011fas\u0131 gere\u011fi, kullan\u0131c\u0131lar zaman zaman \u00e7evrimd\u0131\u015f\u0131 kalabilir veya ba\u011flant\u0131 kalitesi d\u00fc\u015febilir. Bu durumlar, bir uygulaman\u0131n kullan\u0131c\u0131 deneyimini, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve genel i\u015flevselli\u011fini ciddi \u015fekilde etkileyebilir. \u00d6zellikle mobil cihazlar\u0131n yayg\u0131nla\u015fmas\u0131 ve Progressive Web Uygulamalar\u0131n\u0131n (PWA) y\u00fckseli\u015fiyle birlikte, bir uygulaman\u0131n \u00e7evrimi\u00e7i ve \u00e7evrimd\u0131\u015f\u0131 durumunu do\u011fru bir \u015fekilde tespit edebilmesi ve bu duruma g\u00f6re adapte olabilmesi kritik bir gereklilik haline gelmi\u015ftir.<\/p>\n<p>Vue.js, reaktif yap\u0131s\u0131 ve bile\u015fen tabanl\u0131 mimarisiyle \u00f6n u\u00e7 geli\u015ftiricilerin favori \u00e7er\u00e7evelerinden biridir. Vue.js ekosistemi, bu t\u00fcr zorluklar\u0131 a\u015fmak i\u00e7in \u00e7e\u015fitli ara\u00e7lar ve k\u00fct\u00fcphaneler sunar. Bu makalede, Vue.js uygulamalar\u0131nda \u00e7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durum tespitini kolayla\u015ft\u0131ran ve daha g\u00fcvenilir hale getiren <code>v-offline<\/code> k\u00fct\u00fcphanesini derinlemesine inceleyece\u011fiz. <code>v-offline<\/code>&#8216;\u0131n ne oldu\u011funu, neden gerekli oldu\u011funu, nas\u0131l kuruldu\u011funu ve geli\u015fmi\u015f kullan\u0131m senaryolar\u0131yla birlikte en iyi uygulamalar\u0131n\u0131 ele alaca\u011f\u0131z. Amac\u0131m\u0131z, geli\u015ftiricilere ba\u011flant\u0131 durumunu proaktif bir \u015fekilde y\u00f6neterek daha sa\u011flam ve kullan\u0131c\u0131 dostu Vue.js uygulamalar\u0131 olu\u015fturma konusunda rehberlik etmektir.<\/p>\n<h3>\u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti Neden Kritik?<\/h3>\n<p>Bir web uygulamas\u0131n\u0131n \u00e7evrimi\u00e7i veya \u00e7evrimd\u0131\u015f\u0131 olma durumunu bilmek, sadece bir durum bilgisi olmaktan \u00f6te, uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 ve kullan\u0131c\u0131yla etkile\u015fimini temelden \u015fekillendiren bir fakt\u00f6rd\u00fcr. Bu durum tespiti, \u00e7e\u015fitli nedenlerle modern web geli\u015ftirme prati\u011finde merkezi bir rol oynamaktad\u0131r:<\/p>\n<h4>Kullan\u0131c\u0131 Deneyimi (UX)<\/h4>\n<p>Kullan\u0131c\u0131lar, bir uygulaman\u0131n her zaman eri\u015filebilir ve sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 beklerler. \u0130nternet ba\u011flant\u0131s\u0131 koptu\u011funda, uygulaman\u0131n donmas\u0131, hata mesajlar\u0131 g\u00f6stermesi veya beklemeye girmesi k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar. \u00c7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durum tespiti sayesinde, kullan\u0131c\u0131ya ba\u011flant\u0131 durumunu net bir \u015fekilde bildirebilir, \u00e7evrimd\u0131\u015f\u0131 iken hangi i\u015flemlerin yap\u0131labilece\u011fini veya yap\u0131lamayaca\u011f\u0131n\u0131 g\u00f6sterebiliriz. \u00d6rne\u011fin, bir &#8220;\u0130nternet ba\u011flant\u0131n\u0131z yok&#8221; banner&#8217;\u0131 veya grile\u015fmi\u015f butonlar, kullan\u0131c\u0131n\u0131n beklentilerini y\u00f6netmesine yard\u0131mc\u0131 olur.<\/p>\n<h4>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc ve Senkronizasyon<\/h4>\n<p>\u00c7o\u011fu web uygulamas\u0131, sunucu ile veri al\u0131\u015fveri\u015fi yapar. Kullan\u0131c\u0131 \u00e7evrimd\u0131\u015f\u0131yken bir form doldurur, bir g\u00f6nderi yapar veya bir ayar\u0131 de\u011fi\u015ftirirse, bu verilerin kaybolmamas\u0131 kritik \u00f6neme sahiptir. \u00c7evrimd\u0131\u015f\u0131 durum tespiti, bu t\u00fcr verileri yerel depolama mekanizmalar\u0131nda (IndexedDB, LocalStorage) ge\u00e7ici olarak saklamak ve ba\u011flant\u0131 yeniden sa\u011fland\u0131\u011f\u0131nda otomatik olarak sunucuyla senkronize etmek i\u00e7in bir tetikleyici g\u00f6revi g\u00f6r\u00fcr. Bu, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korurken, kullan\u0131c\u0131ya kesintisiz bir i\u015f ak\u0131\u015f\u0131 sunar.<\/p>\n<h4>Hata Y\u00f6netimi ve Kaynak Optimizasyonu<\/h4>\n<p>Ba\u011flant\u0131 sorunlar\u0131 genellikle genel a\u011f hatas\u0131 mesajlar\u0131 olarak ortaya \u00e7\u0131kar ve bu mesajlar kullan\u0131c\u0131 i\u00e7in pek anlaml\u0131 de\u011fildir. Ba\u011flant\u0131 durumunu bilmek, daha spesifik ve kullan\u0131c\u0131 dostu hata mesajlar\u0131 sunmam\u0131z\u0131 sa\u011flar (&#8220;Sunucuya ula\u015f\u0131lam\u0131yor&#8221; yerine &#8220;\u0130nternet ba\u011flant\u0131n\u0131z yok&#8221;). Ayr\u0131ca, \u00e7evrimd\u0131\u015f\u0131 iken gereksiz a\u011f istekleri g\u00f6ndermekten ka\u00e7\u0131narak hem uygulaman\u0131n performans\u0131n\u0131 art\u0131rabilir hem de kullan\u0131c\u0131n\u0131n cihaz\u0131ndaki pil ve veri kullan\u0131m\u0131n\u0131 optimize edebiliriz.<\/p>\n<h4>Offline-First Yakla\u015f\u0131m\u0131 ve PWA&#8217;lar<\/h4>\n<p>Progressive Web Uygulamalar\u0131 (PWA), \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fabilirlik \u00fczerine in\u015fa edilmi\u015ftir. Bir PWA&#8217;n\u0131n en temel \u00f6zelliklerinden biri, internet ba\u011flant\u0131s\u0131 olmasa bile temel i\u015flevselli\u011fini s\u00fcrd\u00fcrebilmesidir. <code>v-offline<\/code> gibi k\u00fct\u00fcphaneler, bir uygulaman\u0131n \u00e7evrimd\u0131\u015f\u0131 oldu\u011funu tespit ederek, Service Worker&#8217;lar arac\u0131l\u0131\u011f\u0131yla \u00f6nbelle\u011fe al\u0131nm\u0131\u015f i\u00e7erikleri sunma ve \u00e7evrimd\u0131\u015f\u0131 modda \u00e7al\u0131\u015fabilen \u00f6zelliklere y\u00f6nlendirme gibi offline-first stratejilerinin uygulanmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Taray\u0131c\u0131lar\u0131n Dahili Mekanizmalar\u0131 ve S\u0131n\u0131rlamalar\u0131<\/h3>\n<p>Web taray\u0131c\u0131lar\u0131, internet ba\u011flant\u0131 durumunu tespit etmek i\u00e7in baz\u0131 yerle\u015fik mekanizmalar sunar. En bilinenleri <code>navigator.onLine<\/code> \u00f6zelli\u011fi ve <code>online<\/code>\/<code>offline<\/code> olaylar\u0131d\u0131r.<\/p>\n<h4>navigator.onLine<\/h4>\n<p><code>navigator.onLine<\/code> \u00f6zelli\u011fi, taray\u0131c\u0131n\u0131n \u00e7evrimi\u00e7i olup olmad\u0131\u011f\u0131n\u0131 g\u00f6steren basit bir boolean de\u011feridir. <code>true<\/code> ise \u00e7evrimi\u00e7i, <code>false<\/code> ise \u00e7evrimd\u0131\u015f\u0131 demektir.<\/p>\n<p>\u00d6rnek kullan\u0131m:<\/p>\n<pre><code class=\"language-javascript\">if (navigator.onLine) {\n  console.log(\"Ba\u011fl\u0131s\u0131n\u0131z!\");\n} else {\n  console.log(\"\u00c7evrimd\u0131\u015f\u0131s\u0131n\u0131z!\");\n}<\/code><\/pre>\n<p>Ancak <code>navigator.onLine<\/code>&#8216;\u0131n \u00f6nemli bir s\u0131n\u0131rlamas\u0131 vard\u0131r: Yaln\u0131zca taray\u0131c\u0131n\u0131n yerel a\u011fa ba\u011fl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Yani, cihaz\u0131n\u0131z bir Wi-Fi a\u011f\u0131na ba\u011fl\u0131 olsa bile (\u00f6rne\u011fin, router&#8217;\u0131n\u0131z\u0131n internet ba\u011flant\u0131s\u0131 yoksa veya bir captive portal arkas\u0131ndaysan\u0131z), <code>navigator.onLine<\/code> yine de <code>true<\/code> d\u00f6nebilir. Bu durum, uygulaman\u0131z\u0131n ger\u00e7ek internet eri\u015fimi olmad\u0131\u011f\u0131 halde \u00e7evrimi\u00e7i oldu\u011funu d\u00fc\u015f\u00fcnmesine neden olabilir, bu da hatal\u0131 davran\u0131\u015flara ve k\u00f6t\u00fc kullan\u0131c\u0131 deneyimine yol a\u00e7ar.<\/p>\n<h4>online ve offline Olaylar\u0131<\/h4>\n<p>Taray\u0131c\u0131lar ayr\u0131ca <code>online<\/code> ve <code>offline<\/code> olaylar\u0131n\u0131 tetikler. Bu olaylar, ba\u011flant\u0131 durumu de\u011fi\u015fti\u011finde dinleyiciler arac\u0131l\u0131\u011f\u0131yla yakalanabilir.<\/p>\n<p>\u00d6rnek kullan\u0131m:<\/p>\n<pre><code class=\"language-javascript\">window.addEventListener('online', () => {\n  console.log('\u0130nternet ba\u011flant\u0131s\u0131 geri geldi.');\n});\n\nwindow.addEventListener('offline', () => {\n  console.log('\u0130nternet ba\u011flant\u0131s\u0131 kesildi.');\n});<\/code><\/pre>\n<p>Bu olaylar da <code>navigator.onLine<\/code> ile ayn\u0131 s\u0131n\u0131rlamalara sahiptir. Sadece yerel a\u011f ba\u011flant\u0131s\u0131n\u0131n de\u011fi\u015fti\u011fini bildirirler, ger\u00e7ek internet eri\u015fiminin olup olmad\u0131\u011f\u0131n\u0131 garanti etmezler. \u00d6zellikle modern a\u011f yap\u0131lar\u0131nda (proxy sunucular, VPN&#8217;ler, captive portal&#8217;lar) bu mekanizmalar yetersiz kalabilir ve uygulaman\u0131n yan\u0131lt\u0131c\u0131 bilgilere dayanarak hareket etmesine neden olabilir. Bu nedenle, daha g\u00fcvenilir bir \u00e7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durum tespiti i\u00e7in ek bir mekanizmaya ihtiya\u00e7 duyulur. \u0130\u015fte bu noktada <code>v-offline<\/code> gibi k\u00fct\u00fcphaneler devreye girer.<\/p>\n<h3>v-offline K\u00fct\u00fcphanesine Derinlemesine Bak\u0131\u015f<\/h3>\n<p><code>v-offline<\/code>, Vue.js uygulamalar\u0131 i\u00e7in tasarlanm\u0131\u015f, reaktif bir \u00e7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durum tespit k\u00fct\u00fcphanesidir. Taray\u0131c\u0131lar\u0131n yerle\u015fik <code>navigator.onLine<\/code> \u00f6zelli\u011finin s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farak, daha g\u00fcvenilir bir ba\u011flant\u0131 durumu tespiti sunar.<\/p>\n<h4>Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h4>\n<p><code>v-offline<\/code>, temel olarak belirli bir URL&#8217;ye (genellikle k\u00fc\u00e7\u00fck ve h\u0131zl\u0131 yan\u0131t veren bir dosya veya API endpoint&#8217;i) d\u00fczenli aral\u0131klarla ping iste\u011fi g\u00f6ndererek \u00e7al\u0131\u015f\u0131r. Bu ping iste\u011fi ba\u015far\u0131l\u0131 olursa, uygulama \u00e7evrimi\u00e7i kabul edilir; ba\u015far\u0131s\u0131z olursa (timeout veya a\u011f hatas\u0131), \u00e7evrimd\u0131\u015f\u0131 kabul edilir. Bu y\u00f6ntem, <code>navigator.onLine<\/code>&#8216;\u0131n aksine, cihaz\u0131n sadece bir a\u011fa ba\u011fl\u0131 olup olmad\u0131\u011f\u0131n\u0131 de\u011fil, ger\u00e7ek internet eri\u015fiminin olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/p>\n<h4>Avantajlar\u0131<\/h4>\n<p>*   <strong>Reaktiflik:<\/strong> Vue&#8217;nun reaktif sistemine tam entegrasyon sayesinde, ba\u011flant\u0131 durumu de\u011fi\u015fti\u011finde uygulaman\u0131z\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fc otomatik olarak g\u00fcncellenir.<br \/>\n*   <strong>G\u00fcvenilirlik:<\/strong> Belirlenen bir URL&#8217;ye ping atma mekanizmas\u0131 sayesinde, taray\u0131c\u0131n\u0131n yerle\u015fik \u00f6zelliklerinden daha do\u011fru bir internet ba\u011flant\u0131s\u0131 tespiti sa\u011flar.<br \/>\n*   <strong>Kolay Kullan\u0131m:<\/strong> Vue bile\u015feni, direktifi veya plugin olarak kolayca entegre edilebilir.<br \/>\n*   <strong>Yap\u0131land\u0131r\u0131labilirlik:<\/strong> Ping URL&#8217;si, zaman a\u015f\u0131m\u0131 (timeout) s\u00fcresi ve ping aral\u0131\u011f\u0131 gibi \u00f6nemli parametreler yap\u0131land\u0131r\u0131labilir.<br \/>\n*   <strong>Esneklik:<\/strong> Uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinde, ba\u011flant\u0131 durumuna g\u00f6re farkl\u0131 davran\u0131\u015flar sergilemek i\u00e7in kullan\u0131labilir.<\/p>\n<h3>v-offline Kurulumu ve Temel Kullan\u0131m\u0131<\/h3>\n<p><code>v-offline<\/code> k\u00fct\u00fcphanesini Vue.js projenize dahil etmek olduk\u00e7a basittir.<\/p>\n<h4>Kurulum<\/h4>\n<p>\u00d6ncelikle, k\u00fct\u00fcphaneyi projenize kurman\u0131z gerekir. <code>npm<\/code> veya <code>yarn<\/code> kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install v-offline\n<h2>veya<\/h2>\nyarn add v-offline<\/code><\/pre>\n<h4>Global Kay\u0131t (Plugin olarak)<\/h4>\n<p><code>v-offline<\/code>&#8216;\u0131 uygulaman\u0131z\u0131n her yerinden eri\u015filebilen global bir plugin olarak kaydetmek, genellikle en pratik yakla\u015f\u0131md\u0131r. Bu sayede, herhangi bir Vue bile\u015feninde <code>this.$offline.online<\/code> veya <code>this.$offline.offline<\/code> \u00f6zelliklerine eri\u015febilirsiniz.<\/p>\n<p><code>main.js<\/code> veya <code>main.ts<\/code> dosyan\u0131zda:<\/p>\n<pre><code class=\"language-javascript\">import { createApp } from 'vue'; \/\/ Vue 3 i\u00e7in\n\/\/ import Vue from 'vue'; \/\/ Vue 2 i\u00e7in\nimport App from '.\/App.vue';\nimport VOffline from 'v-offline';\n\nconst app = createApp(App); \/\/ Vue 3 i\u00e7in\n\n\/\/ VOffline'\u0131 global bir plugin olarak kaydet\napp.use(VOffline, {\n  \/\/ Opsiyonel yap\u0131land\u0131rma se\u00e7enekleri\n  \/\/ pingUrl: 'https:\/\/www.google.com\/favicon.ico',\n  \/\/ pingTimeout: 5000,\n  \/\/ interval: 5000,\n  \/\/ debounceDelay: 100\n});\n\napp.mount('#app');\n\n\/*\n\/\/ Vue 2 i\u00e7in:\nVue.use(VOffline, {\n  \/\/ Opsiyonel yap\u0131land\u0131rma se\u00e7enekleri\n});\nnew Vue({\n  render: h => h(App),\n}).$mount('#app');\n*\/<\/code><\/pre>\n<p>Global olarak kaydettikten sonra, herhangi bir Vue bile\u015feninde ba\u011flant\u0131 durumunu \u015fu \u015fekilde kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3 v-if=\"$offline.online\">\u00c7evrimi\u00e7isiniz!<\/h3>\n    <h3 v-else>\u00c7evrimd\u0131\u015f\u0131s\u0131n\u0131z!<\/h3>\n    <p>Ba\u011flant\u0131 Durumu: {{ $offline.online ? 'Aktif' : 'Kesik' }}<\/p>\n    <button :disabled=\"!$offline.online\">Veri G\u00f6nder<\/button>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  mounted() {\n    \/\/ Ba\u011flant\u0131 durumu de\u011fi\u015fti\u011finde bir aksiyon almak isterseniz\n    \/\/ $offline objesi reaktif oldu\u011fu i\u00e7in do\u011frudan izleyebilirsiniz\n    this.$watch('$offline.online', (newVal, oldVal) => {\n      if (newVal) {\n        console.log('Ba\u011flant\u0131 geri geldi!');\n        \/\/ Bekleyen verileri senkronize et\n      } else {\n        console.log('Ba\u011flant\u0131 kesildi!');\n        \/\/ Kullan\u0131c\u0131ya bildirim g\u00f6ster\n      }\n    });\n  }\n}\n<\/script><\/code><\/pre>\n<h4>Bile\u015fen Olarak Kullan\u0131m<\/h4>\n<p><code>v-offline<\/code>&#8216;\u0131 do\u011frudan bir bile\u015fen olarak da kullanabilirsiniz. Bu y\u00f6ntem, belirli bir bile\u015fenin i\u00e7inde ba\u011flant\u0131 durumunu y\u00f6netmek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <v-offline @detected-condition=\"handleConnectivityChange\">\n      <template v-slot=\"{ online }\">\n        <h3 v-if=\"online\">\u00c7evrimi\u00e7isiniz! (Bile\u015fen)<\/h3>\n        <h3 v-else>\u00c7evrimd\u0131\u015f\u0131s\u0131n\u0131z! (Bile\u015fen)<\/h3>\n        <p>Ba\u011flant\u0131 Durumu: {{ online ? 'Aktif' : 'Kesik' }}<\/p>\n      <\/template>\n    <\/v-offline>\n  <\/div>\n<\/template>\n\n<script>\nimport VOffline from 'v-offline'; \/\/ Bile\u015fen olarak kullanmak i\u00e7in import edin\n\nexport default {\n  components: {\n    VOffline\n  },\n  methods: {\n    handleConnectivityChange(online) {\n      if (online) {\n        console.log('Ba\u011flant\u0131 geri geldi! (Bile\u015fen)');\n      } else {\n        console.log('Ba\u011flant\u0131 kesildi! (Bile\u015fen)');\n      }\n    }\n  }\n}\n<\/script><\/code><\/pre>\n<p>Bu kullan\u0131mda, <code>v-offline<\/code> bile\u015feni <code>detected-condition<\/code> ad\u0131nda bir olay (event) yayar ve bu olay\u0131n arg\u00fcman\u0131 olarak g\u00fcncel ba\u011flant\u0131 durumunu (<code>true<\/code> veya <code>false<\/code>) iletir. Ayr\u0131ca, slot kullanarak <code>online<\/code> \u00f6zelli\u011fine do\u011frudan eri\u015febilirsiniz.<\/p>\n<h3>v-offline Yap\u0131land\u0131rma Se\u00e7enekleri<\/h3>\n<p><code>v-offline<\/code>, ba\u011flant\u0131 tespit mekanizmas\u0131n\u0131 ihtiya\u00e7lar\u0131n\u0131za g\u00f6re \u00f6zelle\u015ftirmenizi sa\u011flayan bir dizi yap\u0131land\u0131rma se\u00e7ene\u011fi sunar. Bu se\u00e7enekler, <code>Vue.use()<\/code> ile plugin olarak kaydederken veya bile\u015fen olarak kullan\u0131rken prop olarak ge\u00e7irilebilir.<\/p>\n<p>*   <strong><code>ping-url<\/code> (String, varsay\u0131lan: <code>'https:\/\/www.google.com\/favicon.ico'<\/code>)<\/strong>:<br \/>\n    K\u00fct\u00fcphanenin ba\u011flant\u0131y\u0131 test etmek i\u00e7in kullanaca\u011f\u0131 URL. Bu URL, m\u00fcmk\u00fcn oldu\u011funca h\u0131zl\u0131 yan\u0131t veren, k\u00fc\u00e7\u00fck boyutlu ve her zaman eri\u015filebilir bir kaynak olmal\u0131d\u0131r. <code>https:\/\/www.google.com\/favicon.ico<\/code> veya <code>https:\/\/gstatic.com\/generate_204<\/code> gibi genel, g\u00fcvenilir endpoint&#8217;ler tercih edilebilir. Kendi backend&#8217;inizde k\u00fc\u00e7\u00fck bir &#8220;sa\u011fl\u0131k kontrol\u00fc&#8221; endpoint&#8217;i olu\u015fturmak da iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<p>*   <strong><code>ping-timeout<\/code> (Number, varsay\u0131lan: <code>5000<\/code> ms)<\/strong>:<br \/>\n    Ping iste\u011finin yan\u0131t vermesi i\u00e7in beklenecek maksimum s\u00fcre (milisaniye cinsinden). Belirtilen s\u00fcre i\u00e7inde yan\u0131t al\u0131namazsa, istek ba\u015far\u0131s\u0131z kabul edilir ve ba\u011flant\u0131 \u00e7evrimd\u0131\u015f\u0131 olarak alg\u0131lan\u0131r. A\u011f ko\u015fullar\u0131n\u0131za ve beklenen yan\u0131t s\u00fcrelerine g\u00f6re ayarlayabilirsiniz.<\/p>\n<p>*   <strong><code>interval<\/code> (Number, varsay\u0131lan: <code>5000<\/code> ms)<\/strong>:<br \/>\n    Ping istekleri aras\u0131nda beklenecek s\u00fcre (milisaniye cinsinden). Bu de\u011fer, ba\u011flant\u0131 durumunun ne s\u0131kl\u0131kla kontrol edilece\u011fini belirler. \u00c7ok d\u00fc\u015f\u00fck bir de\u011fer gereksiz a\u011f trafi\u011fine neden olabilirken, \u00e7ok y\u00fcksek bir de\u011fer durum de\u011fi\u015fikliklerinin ge\u00e7 fark edilmesine yol a\u00e7abilir. Genellikle 5-10 saniye aras\u0131 makul bir de\u011ferdir.<\/p>\n<p>*   <strong><code>debounce-delay<\/code> (Number, varsay\u0131lan: <code>100<\/code> ms)<\/strong>:<br \/>\n    Ba\u011flant\u0131 durumu de\u011fi\u015fikliklerini raporlamadan \u00f6nce beklenecek s\u00fcre (milisaniye cinsinden). Bu, k\u0131sa s\u00fcreli ve istikrars\u0131z ba\u011flant\u0131 kesintilerinin (titre\u015fim) anl\u0131k olarak durumu de\u011fi\u015ftirmesini engellemek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, ba\u011flant\u0131 anl\u0131k olarak kesilip hemen geri gelirse, bu gecikme sayesinde uygulaman\u0131z gereksiz yere &#8220;\u00e7evrimd\u0131\u015f\u0131&#8221; durumuna ge\u00e7ip geri d\u00f6nmez.<\/p>\n<p>*   <strong><code>silent<\/code> (Boolean, varsay\u0131lan: <code>false<\/code>)<\/strong>:<br \/>\n    <code>true<\/code> olarak ayarland\u0131\u011f\u0131nda, k\u00fct\u00fcphane konsola hata veya uyar\u0131 mesaj\u0131 basmaz. \u00dcretim ortamlar\u0131nda konsolun temiz kalmas\u0131n\u0131 sa\u011flamak i\u00e7in faydal\u0131 olabilir, ancak geli\u015ftirme a\u015famas\u0131nda <code>false<\/code> olarak b\u0131rak\u0131lmas\u0131 sorun giderme i\u00e7in daha iyidir.<\/p>\n<p>\u00d6rnek Yap\u0131land\u0131rma (Plugin olarak):<\/p>\n<pre><code class=\"language-javascript\">app.use(VOffline, {\n  pingUrl: 'https:\/\/api.mywebsite.com\/health-check', \/\/ Kendi API'nizin sa\u011fl\u0131k kontrol\u00fc endpoint'i\n  pingTimeout: 3000, \/\/ 3 saniye zaman a\u015f\u0131m\u0131\n  interval: 10000,   \/\/ Her 10 saniyede bir kontrol et\n  debounceDelay: 200, \/\/ 200 ms gecikme ile durumu raporla\n  silent: true        \/\/ Konsol mesajlar\u0131n\u0131 kapat\n});<\/code><\/pre>\n<p>\u00d6rnek Yap\u0131land\u0131rma (Bile\u015fen olarak):<\/p>\n<pre><code class=\"language-vue\"><v-offline\n  ping-url=\"https:\/\/api.mywebsite.com\/health-check\"\n  :ping-timeout=\"3000\"\n  :interval=\"10000\"\n  :debounce-delay=\"200\"\n  :silent=\"true\"\n  @detected-condition=\"handleConnectivityChange\"\n>\n  <!-- Slot i\u00e7eri\u011fi -->\n<\/v-offline><\/code><\/pre>\n<h3>Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p><code>v-offline<\/code> k\u00fct\u00fcphanesi, basit bir ba\u011flant\u0131 durumu tespitinden \u00e7ok daha fazlas\u0131n\u0131 yapman\u0131za olanak tan\u0131r. \u0130\u015fte baz\u0131 geli\u015fmi\u015f kullan\u0131m senaryolar\u0131 ve en iyi uygulamalar:<\/p>\n<h4>Kullan\u0131c\u0131ya Bildirim G\u00f6sterme<\/h4>\n<p>Ba\u011flant\u0131 durumu de\u011fi\u015fti\u011finde kullan\u0131c\u0131y\u0131 bilgilendirmek, k\u00f6t\u00fc bir deneyimi \u00f6nlemenin en etkili yollar\u0131ndan biridir.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <div v-if=\"!$offline.online\" class=\"offline-banner\">\n      <p>\u0130nternet ba\u011flant\u0131n\u0131z yok. Baz\u0131 \u00f6zellikler kullan\u0131lamayabilir.<\/p>\n    <\/div>\n    <!-- Uygulaman\u0131z\u0131n geri kalan\u0131 -->\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  \/\/ ...\n}\n<\/script>\n\n<style scoped>\n.offline-banner {\n  background-color: #ffcc00;\n  color: #333;\n  padding: 10px;\n  text-align: center;\n  position: sticky;\n  top: 0;\n  z-index: 1000;\n}\n<\/style><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>$offline.online<\/code> de\u011feri <code>false<\/code> oldu\u011funda otomatik olarak bir uyar\u0131 banner&#8217;\u0131 g\u00f6r\u00fcn\u00fcr. Bu banner, kullan\u0131c\u0131ya durum hakk\u0131nda bilgi verir ve uygulaman\u0131n neden beklenen \u015fekilde \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 anlamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h4>Veri Senkronizasyonu Y\u00f6netimi<\/h4>\n<p>\u00c7evrimd\u0131\u015f\u0131 modda kullan\u0131c\u0131lar\u0131n veri giri\u015fine devam etmesini sa\u011flamak ve ba\u011flant\u0131 geri geldi\u011finde bu verileri senkronize etmek, karma\u015f\u0131k ancak kritik bir senaryodur.<br \/>\n1.  <strong>Yerel Depolama:<\/strong> Kullan\u0131c\u0131 \u00e7evrimd\u0131\u015f\u0131yken yap\u0131lan t\u00fcm de\u011fi\u015fiklikleri (form g\u00f6nderimleri, ayar g\u00fcncellemeleri vb.) IndexedDB veya LocalStorage gibi yerel depolama mekanizmalar\u0131nda saklay\u0131n.<br \/>\n2.  <strong>Vuex\/Pinia ile Durum Y\u00f6netimi:<\/strong> Vuex (Vue 2) veya Pinia (Vue 3) gibi bir durum y\u00f6netim k\u00fct\u00fcphanesi kullanarak bekleyen i\u015flemleri bir kuyrukta tutun.<br \/>\n3.  <strong><code>$offline.online<\/code> \u0130zleme:<\/strong> Global <code>this.$offline.online<\/code> \u00f6zelli\u011fini izleyerek ba\u011flant\u0131 durumu de\u011fi\u015fti\u011finde (\u00e7evrimd\u0131\u015f\u0131dan \u00e7evrimi\u00e7ine ge\u00e7i\u015fte) kuyruktaki i\u015flemleri sunucuya g\u00f6nderin.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Vuex action \u00f6rne\u011fi\nactions: {\n  async submitData({ state, commit }, payload) {\n    if (this.$offline.online) {\n      try {\n        await api.post('\/data', payload);\n        commit('clearPendingData');\n      } catch (error) {\n        commit('addPendingData', payload); \/\/ Hata durumunda bekleyenlere ekle\n      }\n    } else {\n      commit('addPendingData', payload);\n    }\n  },\n  async syncPendingData({ state, commit }) {\n    if (this.$offline.online && state.pendingData.length > 0) {\n      for (const data of state.pendingData) {\n        try {\n          await api.post('\/data', data);\n          commit('removePendingData', data); \/\/ Ba\u015far\u0131l\u0131 ise kald\u0131r\n        } catch (error) {\n          console.error('Veri senkronizasyonu ba\u015far\u0131s\u0131z:', error);\n          \/\/ Hata durumunda tekrar denemek i\u00e7in bekleyenlerde tut\n          break; \/\/ Di\u011ferlerini de denemeden \u00f6nce bir hata olu\u015ftuysa dur\n        }\n      }\n    }\n  }\n}\n\n\/\/ mounted hook'unda veya bir watcher i\u00e7inde:\nthis.$watch('$offline.online', (newVal) => {\n  if (newVal) {\n    this.$store.dispatch('syncPendingData'); \/\/ Vuex\n    \/\/ useStore().syncPendingData(); \/\/ Pinia\n  }\n});<\/code><\/pre>\n<h4>UI Durumunun De\u011fi\u015ftirilmesi<\/h4>\n<p>Ba\u011flant\u0131 durumuna g\u00f6re UI elemanlar\u0131n\u0131 (butonlar, form alanlar\u0131) etkinle\u015ftirmek veya devre d\u0131\u015f\u0131 b\u0131rakmak, kullan\u0131c\u0131ya hangi i\u015flemlerin m\u00fcmk\u00fcn oldu\u011funu net bir \u015fekilde g\u00f6sterir.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <form @submit.prevent=\"submitForm\">\n      <input type=\"text\" v-model=\"formData.name\" :disabled=\"!$offline.online\" \/>\n      <button type=\"submit\" :disabled=\"!$offline.online\">G\u00f6nder<\/button>\n    <\/form>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bu, kullan\u0131c\u0131n\u0131n \u00e7evrimd\u0131\u015f\u0131yken g\u00f6nderilemeyecek bir i\u015flemi denemesini engeller.<\/p>\n<h4>Servis \u00c7al\u0131\u015fanlar\u0131 (Service Workers) ile Entegrasyon<\/h4>\n<p>PWA&#8217;lar i\u00e7in <code>v-offline<\/code> ve Service Worker&#8217;lar birbirini tamamlar. <code>v-offline<\/code> ger\u00e7ek ba\u011flant\u0131 durumunu tespit ederken, Service Worker&#8217;lar \u00f6nbelle\u011fe al\u0131nm\u0131\u015f i\u00e7erikleri sunarak uygulaman\u0131n \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. <code>v-offline<\/code>&#8216;\u0131n \u00e7evrimd\u0131\u015f\u0131 durumunu bildirmesiyle, Service Worker&#8217;a y\u00f6nlendirme veya \u00e7evrimd\u0131\u015f\u0131 modda farkl\u0131 bir kullan\u0131c\u0131 aray\u00fcz\u00fc sunma mant\u0131\u011f\u0131 tetiklenebilir.<\/p>\n<h4>Test Edilebilirlik<\/h4>\n<p><code>v-offline<\/code> ile yaz\u0131lan bile\u015fenleri veya mant\u0131\u011f\u0131 test ederken, <code>$offline.online<\/code> de\u011ferini taklit etmek \u00f6nemlidir. Vue Test Utils ile bile\u015fen testlerinde, <code>global.plugins<\/code> veya <code>mocks<\/code> se\u00e7ene\u011fini kullanarak <code>$offline<\/code> objesini mock&#8217;layabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">import { mount } from '@vue\/test-utils';\nimport MyComponent from '.\/MyComponent.vue';\n\ndescribe('MyComponent', () => {\n  it('should display offline message when offline', async () => {\n    const wrapper = mount(MyComponent, {\n      global: {\n        mocks: {\n          $offline: {\n            online: false\n          }\n        }\n      }\n    });\n    expect(wrapper.text()).toContain('\u00c7evrimd\u0131\u015f\u0131s\u0131n\u0131z!');\n  });\n\n  it('should enable button when online', async () => {\n    const wrapper = mount(MyComponent, {\n      global: {\n        mocks: {\n          $offline: {\n            online: true\n          }\n        }\n      }\n    });\n    expect(wrapper.find('button').attributes('disabled')).toBeUndefined();\n  });\n});<\/code><\/pre>\n<h4>Sunucu Taraf\u0131 Olu\u015fturma (SSR) ile Uyumluluk<\/h4>\n<p><code>v-offline<\/code>, taray\u0131c\u0131 tabanl\u0131 bir k\u00fct\u00fcphane oldu\u011fundan, Sunucu Taraf\u0131 Olu\u015fturma (SSR) ortamlar\u0131nda do\u011frudan kullan\u0131lamaz. SSR s\u0131ras\u0131nda <code>$offline<\/code> objesi veya <code>v-offline<\/code> bile\u015feni mevcut olmayacakt\u0131r. Bu nedenle, SSR uygulamalar\u0131nda <code>v-offline<\/code>&#8216;\u0131 yaln\u0131zca <code>client-side<\/code> (istemci taraf\u0131) montajdan sonra kullanmaya \u00f6zen g\u00f6stermelisiniz. \u00d6rne\u011fin, <code>mounted()<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131 i\u00e7inde <code>$offline<\/code>&#8216;a eri\u015fmek veya <code>v-if<\/code> ile sadece istemci taraf\u0131nda render edilecek bile\u015fenler i\u00e7inde kullanmak gibi y\u00f6ntemler izlenebilir.<\/p>\n<h3>Alternatif Yakla\u015f\u0131mlar ve Kar\u015f\u0131la\u015ft\u0131rma<\/h3>\n<p><code>v-offline<\/code> kullanmak yerine ba\u011flant\u0131 durumunu y\u00f6netmek i\u00e7in ba\u015fka yakla\u015f\u0131mlar da mevcuttur. Bunlar\u0131 kar\u015f\u0131la\u015ft\u0131rmak, <code>v-offline<\/code>&#8216;\u0131n neden tercih edilmesi gerekti\u011fini daha iyi anlamam\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Sadece <code>navigator.onLine<\/code> Kullan\u0131m\u0131<\/h4>\n<p>Daha \u00f6nce bahsedildi\u011fi gibi, <code>navigator.onLine<\/code> sadece yerel a\u011f ba\u011flant\u0131s\u0131n\u0131 kontrol eder. Kurulumu en basit y\u00f6ntem olsa da, ger\u00e7ek internet eri\u015fimini garanti etmedi\u011fi i\u00e7in yan\u0131lt\u0131c\u0131 olabilir. K\u00fc\u00e7\u00fck, statik web siteleri i\u00e7in yeterli olabilirken, dinamik ve veri odakl\u0131 uygulamalar i\u00e7in yetersizdir.<\/p>\n<h4>Kendi Ping Mekanizmas\u0131n\u0131 Yazmak<\/h4>\n<p>Bir geli\u015ftirici, <code>v-offline<\/code>&#8216;\u0131n yapt\u0131\u011f\u0131 gibi kendi <code>ping<\/code> mekanizmas\u0131n\u0131 yazmay\u0131 d\u00fc\u015f\u00fcnebilir. Bu, <code>fetch<\/code> veya <code>XMLHttpRequest<\/code> kullanarak belirli bir URL&#8217;ye d\u00fczenli istekler atmay\u0131 ve yan\u0131t\u0131 analiz etmeyi i\u00e7erir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Basit bir kendi ping \u00f6rne\u011fi\nfunction checkOnlineStatus(url = 'https:\/\/www.google.com\/favicon.ico', timeout = 5000) {\n  return new Promise(resolve => {\n    const xhr = new XMLHttpRequest();\n    xhr.timeout = timeout;\n    xhr.onload = () => resolve(true);\n    xhr.onerror = () => resolve(false);\n    xhr.open('GET', url + '?t=' + Date.now()); \/\/ Cache busting\n    xhr.send();\n  });\n}\n\n\/\/ Sonra bunu bir Vue bile\u015feninde veya global olarak kullanmak gerekir.<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, tam kontrol sa\u011flar ancak bak\u0131m y\u00fck\u00fcn\u00fc art\u0131r\u0131r. <code>debounce<\/code> mekanizmalar\u0131, reaktif entegrasyon, hata y\u00f6netimi gibi detaylar\u0131 ba\u015ftan sona kendiniz implemente etmeniz gerekir. <code>v-offline<\/code>, bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlayarak size haz\u0131r bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h4>Backend Tabanl\u0131 Kontrol<\/h4>\n<p>Baz\u0131 durumlarda, bir uygulaman\u0131n \u00e7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durumunu backend \u00fczerinden kontrol etmek de m\u00fcmk\u00fcnd\u00fcr. \u00d6rne\u011fin, her API iste\u011fi ba\u015far\u0131s\u0131z oldu\u011funda, bu bir ba\u011flant\u0131 sorunu olarak yorumlanabilir. Ancak bu, anl\u0131k bir durum tespiti sa\u011flamaz ve her ba\u015far\u0131s\u0131z API iste\u011fi ger\u00e7ekten ba\u011flant\u0131 sorunundan m\u0131 kaynaklan\u0131yor, yoksa sunucu taraf\u0131nda bir hata m\u0131 var, ayr\u0131m\u0131n\u0131 yapmak zordur. <code>v-offline<\/code> gibi \u00f6n u\u00e7 odakl\u0131 \u00e7\u00f6z\u00fcmler, bu t\u00fcr sorunlar\u0131 taray\u0131c\u0131 seviyesinde proaktif olarak tespit ederek daha h\u0131zl\u0131 geri bildirim sa\u011flar.<\/p>\n<p><code>v-offline<\/code>, bu alternatif yakla\u015f\u0131mlar\u0131n s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farak, Vue.js geli\u015ftiricilerine g\u00fcvenilir, reaktif ve kolayca yap\u0131land\u0131r\u0131labilir bir \u00e7\u00f6z\u00fcm sunar. Kendi ping mekanizmas\u0131n\u0131 yazman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na girmeden, taray\u0131c\u0131n\u0131n yerle\u015fik \u00f6zelliklerinin yetersizli\u011fini giderir.<\/p>\n<h3>Performans ve Optimizasyon \u0130pu\u00e7lar\u0131<\/h3>\n<p><code>v-offline<\/code> k\u00fct\u00fcphanesini kullan\u0131rken uygulaman\u0131z\u0131n performans\u0131n\u0131 etkilememek i\u00e7in dikkat etmeniz gereken baz\u0131 noktalar vard\u0131r:<\/p>\n<p>*   <strong><code>ping-url<\/code> Se\u00e7imi:<\/strong> Ping URL&#8217;si olarak h\u0131zl\u0131 yan\u0131t veren, d\u00fc\u015f\u00fck gecikmeli ve co\u011frafi olarak kullan\u0131c\u0131n\u0131za yak\u0131n bir endpoint se\u00e7in. Kendi statik varl\u0131k sunucunuzdaki k\u00fc\u00e7\u00fck bir dosya veya CDN \u00fczerindeki bir kaynak idealdir. Google&#8217;\u0131n <code>favicon.ico<\/code>&#8216;su veya <code>gstatic.com\/generate_204<\/code> gibi genel hizmetler genellikle iyi \u00e7al\u0131\u015f\u0131r, ancak kendi kontrol\u00fcn\u00fczdeki bir endpoint daha g\u00fcvenilir olabilir.<br \/>\n*   <strong><code>interval<\/code> Ayar\u0131:<\/strong> Ping istekleri aras\u0131ndaki s\u00fcreyi (<code>interval<\/code>) \u00e7ok d\u00fc\u015f\u00fck tutmaktan ka\u00e7\u0131n\u0131n. Her 1-2 saniyede bir ping atmak, \u00f6zellikle mobil cihazlarda gereksiz pil t\u00fcketimine ve veri kullan\u0131m\u0131na yol a\u00e7abilir. Genellikle 5-10 saniye aras\u0131 makul bir denge sunar. Uygulaman\u0131z\u0131n kritiklik seviyesine g\u00f6re bu de\u011feri ayarlay\u0131n.<br \/>\n*   <strong><code>debounce-delay<\/code> Kullan\u0131m\u0131:<\/strong> Ba\u011flant\u0131 durumundaki k\u0131sa s\u00fcreli dalgalanmalar\u0131 filtrelemek i\u00e7in <code>debounce-delay<\/code> ayar\u0131n\u0131 kullan\u0131n. Bu, uygulaman\u0131z\u0131n gereksiz yere &#8220;\u00e7evrimd\u0131\u015f\u0131&#8221; durumuna ge\u00e7ip hemen geri d\u00f6nmesini engeller ve UI g\u00fcncellemelerinin say\u0131s\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Sadece \u0130htiya\u00e7 Duyulan Yerlerde Kullanma:<\/strong> E\u011fer uygulaman\u0131z\u0131n belirli bir b\u00f6l\u00fcm\u00fcnde ba\u011flant\u0131 durumu bilgisine ihtiyac\u0131n\u0131z yoksa, o b\u00f6l\u00fcmde <code>v-offline<\/code>&#8216;\u0131n reaktif \u00f6zelliklerini kullanmaktan ka\u00e7\u0131n\u0131n. Global olarak kaydettiyseniz, <code>$offline.online<\/code>&#8216;a sadece ilgili bile\u015fenlerde eri\u015fin.<br \/>\n*   <strong>A\u011f \u0130steklerini Optimize Etme:<\/strong> <code>v-offline<\/code> \u00e7evrimd\u0131\u015f\u0131 oldu\u011funu bildirdi\u011finde, uygulaman\u0131z\u0131n gereksiz API istekleri g\u00f6ndermesini engelleyin. Bu hem sunucu y\u00fck\u00fcn\u00fc azalt\u0131r hem de kullan\u0131c\u0131n\u0131n cihaz\u0131ndaki kaynaklar\u0131 korur.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue.js uygulamalar\u0131nda \u00e7evrimi\u00e7i\/\u00e7evrimd\u0131\u015f\u0131 durum tespiti, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Kullan\u0131c\u0131 deneyimini iyile\u015ftirmek, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak ve uygulaman\u0131n genel g\u00fcvenilirli\u011fini art\u0131rmak i\u00e7in bu yetenek vazge\u00e7ilmezdir. Taray\u0131c\u0131lar\u0131n yerle\u015fik mekanizmalar\u0131 (<code>navigator.onLine<\/code> ve <code>online<\/code>\/<code>offline<\/code> olaylar\u0131) basit senaryolar i\u00e7in yeterli olsa da, ger\u00e7ek d\u00fcnya ko\u015fullar\u0131nda s\u0131kl\u0131kla yetersiz kal\u0131r ve yan\u0131lt\u0131c\u0131 sonu\u00e7lar verebilir.<\/p>\n<p><code>v-offline<\/code> k\u00fct\u00fcphanesi, bu eksikli\u011fi gidererek Vue.js geli\u015ftiricilerine g\u00fcvenilir, reaktif ve kolayca yap\u0131land\u0131r\u0131labilir bir \u00e7\u00f6z\u00fcm sunar. Belirlenen bir URL&#8217;ye d\u00fczenli ping istekleri g\u00f6ndererek ger\u00e7ek internet eri\u015fimini kontrol etmesi sayesinde, uygulaman\u0131z\u0131n ba\u011flant\u0131 durumu hakk\u0131nda her zaman do\u011fru bilgiye sahip olmas\u0131n\u0131 sa\u011flar. Plugin, bile\u015fen veya direktif olarak esnek kullan\u0131m se\u00e7enekleri, ping URL&#8217;si, zaman a\u015f\u0131m\u0131 ve interval gibi yap\u0131land\u0131rma se\u00e7enekleri, <code>v-offline<\/code>&#8216;\u0131 Vue.js projeleri i\u00e7in ideal bir se\u00e7im haline getirir.<\/p>\n<p>Bu makalede ele ald\u0131\u011f\u0131m\u0131z geli\u015fmi\u015f kullan\u0131m senaryolar\u0131 (kullan\u0131c\u0131ya bildirimler, veri senkronizasyonu, UI durum y\u00f6netimi, PWA entegrasyonu) ve optimizasyon ipu\u00e7lar\u0131, <code>v-offline<\/code>&#8216;\u0131n potansiyelini tam olarak kullanman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Ba\u011flant\u0131 durumunu proaktif bir \u015fekilde y\u00f6neterek, Vue.js uygulamalar\u0131n\u0131z\u0131 daha sa\u011flam, daha performansl\u0131 ve en \u00f6nemlisi, kullan\u0131c\u0131lar\u0131n\u0131z i\u00e7in daha keyifli hale getirebilirsiniz. Gelece\u011fin web uygulamalar\u0131, her ko\u015fulda \u00e7al\u0131\u015fabilen, adaptif ve kullan\u0131c\u0131 odakl\u0131 \u00e7\u00f6z\u00fcmler gerektirecektir ve <code>v-offline<\/code> bu yolda \u00f6nemli bir ara\u00e7t\u0131r.<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim\nGiri\u015f\nModern web uygulamalar\u0131, kulla","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-39382","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 Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim - 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-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim\" \/>\n<meta property=\"og:description\" content=\"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim Giri\u015f Modern web uygulamalar\u0131, kulla\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-20T07:40:47+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=\"18 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-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim\",\"datePublished\":\"2026-02-20T07:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\"},\"wordCount\":3008,\"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-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\",\"name\":\"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-20T07:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim\"}]},{\"@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 Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim - 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-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim","og_description":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim Giri\u015f Modern web uygulamalar\u0131, kulla","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-20T07:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim","datePublished":"2026-02-20T07:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/"},"wordCount":3008,"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-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/","name":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-20T07:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-cevrimici-cevrimdisi-durum-tespiti-v-offline-kutuphanesi-ile-etkili-yonetim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Uygulamalar\u0131nda \u00c7evrimi\u00e7i\/\u00c7evrimd\u0131\u015f\u0131 Durum Tespiti: v-offline K\u00fct\u00fcphanesi ile Etkili Y\u00f6netim"}]},{"@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\/39382","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=39382"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39382\/revisions"}],"predecessor-version":[{"id":39383,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39382\/revisions\/39383"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}