{"id":31523,"date":"2025-10-10T22:41:04","date_gmt":"2025-10-10T19:41:04","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31523"},"modified":"2025-10-10T22:41:04","modified_gmt":"2025-10-10T19:41:04","slug":"angular-service-worker-guncellemelerle-basa-cikmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/","title":{"rendered":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lara masa\u00fcst\u00fc uygulamalar\u0131na benzer bir deneyim sunmay\u0131 hedefler. Bu hedefe ula\u015fmada Progressive Web App (PWA) teknolojileri ve \u00f6zellikle Service Worker&#8217;lar kilit rol oynar. Angular, PWA yeteneklerini projelere entegre etmeyi basitle\u015ftiren <code>@angular\/pwa<\/code> paketi ile bu alanda g\u00fc\u00e7l\u00fc bir destek sunar. Ancak, bir Service Worker&#8217;\u0131n temel i\u015flevi olan kaynaklar\u0131 \u00f6nbelle\u011fe almak, uygulaman\u0131n yeni s\u00fcr\u00fcmlerinin kullan\u0131c\u0131lara sorunsuz bir \u015fekilde ula\u015fmas\u0131 gerekti\u011finde karma\u015f\u0131k bir durum yaratabilir. &#8220;Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak&#8221; konusu, bu karma\u015f\u0131kl\u0131\u011f\u0131 anlamay\u0131, Angular&#8217;\u0131n g\u00fcncelleme mekanizmas\u0131n\u0131 \u00f6\u011frenmeyi ve kullan\u0131c\u0131 deneyimini bozmadan uygulama g\u00fcncellemelerini y\u00f6netmenin en iyi yollar\u0131n\u0131 ke\u015ffetmeyi ama\u00e7lamaktad\u0131r.<\/p>\n<h3>Service Worker ve Angular Entegrasyonu<\/h3>\n<p>Service Worker, taray\u0131c\u0131n\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131ndan ayr\u0131 \u00e7al\u0131\u015fan, web uygulamas\u0131 ile taray\u0131c\u0131 aras\u0131nda bir proxy g\u00f6revi g\u00f6ren bir JavaScript beti\u011fidir. Temel yetenekleri aras\u0131nda a\u011f isteklerini yakalama, \u00f6nbelle\u011fe alma, push bildirimleri g\u00f6nderme ve arka planda senkronizasyon yapma bulunur. Bu yetenekler, bir web uygulamas\u0131n\u0131 \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fabilir hale getirme, performans\u0131 art\u0131rma ve bildirimler arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131larla etkile\u015fim kurma potansiyelini sunar.<\/p>\n<p>Angular, <code>ng add @angular\/pwa<\/code> komutuyla projeye kolayca bir Service Worker eklemeyi sa\u011flar. Bu komut, a\u015fa\u011f\u0131daki temel de\u011fi\u015fiklikleri yapar:<br \/>\n*   <code>@angular\/service-worker<\/code> paketini projenize ekler.<br \/>\n*   <code>angular.json<\/code> dosyas\u0131nda <code>serviceWorker: true<\/code> ayar\u0131n\u0131 etkinle\u015ftirir.<br \/>\n*   Uygulaman\u0131n k\u00f6k dizinine <code>ngsw-config.json<\/code> ad\u0131nda bir yap\u0131land\u0131rma dosyas\u0131 ekler.<br \/>\n*   <code>src\/index.html<\/code> dosyas\u0131na Service Worker&#8217;\u0131 kaydetmek i\u00e7in gerekli kodu ekler.<br \/>\n*   <code>src\/manifest.webmanifest<\/code> dosyas\u0131n\u0131 olu\u015fturur.<\/p>\n<p>Uygulama derlendi\u011finde (genellikle <code>ng build --configuration production<\/code> ile), Angular CLI, <code>ngsw-config.json<\/code> dosyas\u0131ndaki kurallara g\u00f6re uygulaman\u0131n t\u00fcm statik varl\u0131klar\u0131n\u0131n (HTML, CSS, JavaScript, resimler vb.) bir listesini ve her birinin i\u00e7erik karmas\u0131n\u0131 (hash) i\u00e7eren bir <code>ngsw.json<\/code> manifest dosyas\u0131 olu\u015fturur. Bu <code>ngsw.json<\/code> dosyas\u0131, Service Worker&#8217;\u0131n hangi varl\u0131klar\u0131 \u00f6nbelle\u011fe alaca\u011f\u0131n\u0131 ve hangi s\u00fcr\u00fcmde olduklar\u0131n\u0131 takip etmesini sa\u011flayan anahtard\u0131r.<\/p>\n<h3>G\u00fcncelleme Mekanizmas\u0131n\u0131n Zorluklar\u0131<\/h3>\n<p>Service Worker&#8217;lar\u0131n sa\u011flad\u0131\u011f\u0131 \u00e7evrimd\u0131\u015f\u0131 yetenekler ve performans art\u0131\u015f\u0131, \u00f6nbelle\u011fe alma mekanizmalar\u0131na dayan\u0131r. Ancak, bu \u00f6nbelle\u011fe alma, uygulaman\u0131n yeni bir s\u00fcr\u00fcm\u00fc yay\u0131nland\u0131\u011f\u0131nda &#8220;eski&#8221; i\u00e7eri\u011fin kullan\u0131c\u0131lara sunulmas\u0131na neden olabilir. Kullan\u0131c\u0131lar, taray\u0131c\u0131lar\u0131nda uygulaman\u0131n eski bir s\u00fcr\u00fcm\u00fcn\u00fc g\u00f6rmeye devam ederken, sunucuda yeni bir s\u00fcr\u00fcm\u00fcn mevcut olmas\u0131, kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na ve k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7abilir. Bu durum, \u00f6zellikle API istekleri veya veri yap\u0131lar\u0131 de\u011fi\u015fti\u011finde ciddi sorunlara neden olabilir.<\/p>\n<p>Geleneksel web uygulamalar\u0131nda, bir sunucu g\u00fcncellemesi genellikle taray\u0131c\u0131n\u0131n bir sonraki sayfay\u0131 y\u00fcklemesinde veya tam bir yenileme yapmas\u0131nda otomatik olarak yeni i\u00e7eri\u011fi getirmesini sa\u011flar. Service Worker ile bu durum farkl\u0131d\u0131r; Service Worker, taray\u0131c\u0131n\u0131n a\u011f isteklerini yakalad\u0131\u011f\u0131 i\u00e7in, yeni bir s\u00fcr\u00fcm\u00fcn fark\u0131na varmas\u0131 ve onu etkinle\u015ftirmesi \u00f6zel bir s\u00fcre\u00e7 gerektirir. Kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131, Service Worker taraf\u0131ndan \u00f6nbelle\u011fe al\u0131nm\u0131\u015f eski varl\u0131klar\u0131 kullanmaya devam edebilir ve yeni s\u00fcr\u00fcm\u00fcn varl\u0131\u011f\u0131ndan haberdar olmayabilir. Bu nedenle, Service Worker kullanan uygulamalar\u0131n, yeni s\u00fcr\u00fcmlerin varl\u0131\u011f\u0131n\u0131 tespit etme, indirme ve etkinle\u015ftirme konusunda bilin\u00e7li bir stratejiye sahip olmas\u0131 kritik \u00f6neme sahiptir.<\/p>\n<h3>Angular Service Worker&#8217;\u0131n G\u00fcncelleme Y\u00f6netimi<\/h3>\n<p>Angular Service Worker, bu g\u00fcncelleme zorluklar\u0131n\u0131 ele almak i\u00e7in sofistike bir mekanizma sunar. Bu mekanizma, uygulaman\u0131n farkl\u0131 s\u00fcr\u00fcmlerini y\u00f6netmeyi ve kullan\u0131c\u0131ya sorunsuz bir ge\u00e7i\u015f sa\u011flamay\u0131 ama\u00e7lar.<\/p>\n<h4>\u0130\u00e7erik Karmalar\u0131 (Content Hashes) ve <code>ngsw.json<\/code><\/h4>\n<p>Angular CLI, \u00fcretim derlemesi s\u0131ras\u0131nda (<code>ng build --configuration production<\/code>), uygulaman\u0131n t\u00fcm statik varl\u0131klar\u0131 i\u00e7in benzersiz i\u00e7erik karmalar\u0131 (hash) olu\u015fturur. Bu karmalar, dosyan\u0131n i\u00e7eri\u011fi de\u011fi\u015fti\u011finde de\u011fi\u015fir. <code>ngsw.json<\/code> manifest dosyas\u0131, bu varl\u0131klar\u0131n yollar\u0131n\u0131 ve ilgili i\u00e7erik karmalar\u0131n\u0131 i\u00e7erir.<br \/>\n\u00d6rnek <code>ngsw.json<\/code> yap\u0131s\u0131 (basitle\u015ftirilmi\u015f):<\/p>\n<pre><code class=\"language-json\">{\n  \"configVersion\": 1,\n  \"index\": \"\/index.html\",\n  \"assetGroups\": [\n    {\n      \"name\": \"app\",\n      \"installMode\": \"prefetch\",\n      \"updateMode\": \"prefetch\",\n      \"urls\": [\n        \"\/favicon.ico\",\n        \"\/index.html\",\n        \"\/main.js\",\n        \"\/polyfills.js\",\n        \"\/runtime.js\",\n        \"\/styles.css\"\n      ],\n      \"patterns\": [],\n      \"cacheQueryOptions\": {\n        \"ignoreSearch\": false\n      }\n    }\n  ],\n  \"hashTable\": {\n    \"\/favicon.ico\": \"a2444b02a90e36617807c4568019a3b6899b8705\",\n    \"\/index.html\": \"4e731d1d8a1f6a1e3b5e0c9d7f0a8c2b1e3d4f5g\",\n    \"\/main.js\": \"h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7a8\",\n    \/\/ ... di\u011fer varl\u0131klar ve karmalar\u0131\n  }\n}<\/code><\/pre>\n<p>Uygulaman\u0131n yeni bir s\u00fcr\u00fcm\u00fc da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda, yeni <code>ngsw.json<\/code> dosyas\u0131 da sunucuya y\u00fcklenir. E\u011fer herhangi bir dosyan\u0131n i\u00e7eri\u011fi de\u011fi\u015fmi\u015fse, o dosyan\u0131n karmas\u0131 da de\u011fi\u015fir.<\/p>\n<h4>G\u00fcncelleme Kontrolleri<\/h4>\n<p>Angular Service Worker, yeni bir uygulama s\u00fcr\u00fcm\u00fcn\u00fcn varl\u0131\u011f\u0131n\u0131 otomatik olarak veya manuel olarak kontrol edebilir.<\/p>\n<h5>Otomatik Kontroller<\/h5>\n<p>*   <strong>Uygulama Ba\u015flang\u0131c\u0131nda:<\/strong> Service Worker, her uygulama ba\u015flang\u0131c\u0131nda (<code>index.html<\/code> y\u00fcklendi\u011finde), sunucudaki <code>ngsw.json<\/code> dosyas\u0131n\u0131 kontrol eder. E\u011fer bu dosya, mevcut Service Worker&#8217;\u0131n bildi\u011fi <code>ngsw.json<\/code> dosyas\u0131ndan farkl\u0131 bir i\u00e7erik karmas\u0131na sahipse (yani yeni bir s\u00fcr\u00fcm varsa), Service Worker yeni s\u00fcr\u00fcm\u00fc indirmeye ba\u015flar.<br \/>\n*   <strong><code>app.update.versionUpdates<\/code> Ak\u0131\u015f\u0131:<\/strong> Angular&#8217;\u0131n <code>SwUpdate<\/code> servisi, uygulaman\u0131n yeni s\u00fcr\u00fcmlerinin durumu hakk\u0131nda bilgi sa\u011flayan bir <code>versionUpdates<\/code> (eski s\u00fcr\u00fcmlerde <code>available<\/code> ve <code>activated<\/code>) ak\u0131\u015f\u0131na sahiptir. Bu ak\u0131\u015fa abone olarak, uygulama i\u00e7inde g\u00fcncellemeleri y\u00f6netebiliriz.<\/p>\n<h5>Manuel Kontroller<\/h5>\n<p>Uygulama, <code>SwUpdate<\/code> servisindeki <code>checkForUpdate()<\/code> metodunu \u00e7a\u011f\u0131rarak manuel olarak bir g\u00fcncelleme kontrol\u00fc ba\u015flatabilir. Bu, \u00f6zellikle kullan\u0131c\u0131ya &#8220;G\u00fcncellemeleri kontrol et&#8221; gibi bir d\u00fc\u011fme sunmak istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { SwUpdate, VersionReadyEvent, VersionDetectedEvent, VersionInstallationFailedEvent } from '@angular\/service-worker';\nimport { Injectable } from '@angular\/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class UpdateService {\n\n  constructor(private swUpdate: SwUpdate) {\n    if (this.swUpdate.isEnabled) {\n      this.swUpdate.versionUpdates.subscribe(event => {\n        if (event.type === 'VERSION_READY') {\n          console.log(<code>Yeni uygulama s\u00fcr\u00fcm\u00fc haz\u0131r: ${event.latestVersion.hash}<\/code>);\n          \/\/ Kullan\u0131c\u0131ya g\u00fcncelleme bildirimi g\u00f6ster\n          \/\/ this.promptUserForUpdate();\n        } else if (event.type === 'VERSION_DETECTED') {\n          console.log(<code>Yeni uygulama s\u00fcr\u00fcm\u00fc tespit edildi: ${event.version.hash}<\/code>);\n        } else if (event.type === 'VERSION_INSTALLATION_FAILED') {\n          console.log(<code>Yeni uygulama s\u00fcr\u00fcm\u00fc y\u00fcklenemedi: ${event.version.hash}, Hata: ${event.error}<\/code>);\n        }\n      });\n\n      \/\/ Eski API (Angular 12 ve \u00f6ncesi i\u00e7in):\n      \/\/ this.swUpdate.available.subscribe(event => {\n      \/\/   console.log('Yeni uygulama s\u00fcr\u00fcm\u00fc mevcut:', event.current, event.available);\n      \/\/   \/\/ Kullan\u0131c\u0131ya g\u00fcncelleme bildirimi g\u00f6ster\n      \/\/   \/\/ this.promptUserForUpdate();\n      \/\/ });\n      \/\/ this.swUpdate.activated.subscribe(event => {\n      \/\/   console.log('Uygulama yeni s\u00fcr\u00fcme g\u00fcncellendi:', event.previous, event.current);\n      \/\/ });\n    }\n  }\n\n  checkForUpdates(): Promise<boolean> {\n    if (this.swUpdate.isEnabled) {\n      console.log('Manuel g\u00fcncelleme kontrol\u00fc ba\u015flat\u0131l\u0131yor...');\n      return this.swUpdate.checkForUpdate();\n    }\n    return Promise.resolve(false);\n  }\n\n  activateUpdate(): Promise<void> {\n    if (this.swUpdate.isEnabled) {\n      console.log('Yeni s\u00fcr\u00fcm etkinle\u015ftiriliyor...');\n      return this.swUpdate.activateUpdate();\n    }\n    return Promise.resolve();\n  }\n}<\/code><\/pre>\n<h4>G\u00fcncelleme Etkinle\u015ftirme (<code>activateUpdate()<\/code>)<\/h4>\n<p>Bir Service Worker yeni bir s\u00fcr\u00fcm\u00fc tespit edip indirdi\u011finde, bu yeni s\u00fcr\u00fcm hemen etkinle\u015ftirilmez. Taray\u0131c\u0131, yeni Service Worker&#8217;\u0131 &#8220;waiting&#8221; (beklemede) durumuna getirir. Bu, mevcut Service Worker&#8217;\u0131n hala aktif oldu\u011fu ve kullan\u0131c\u0131ya eski s\u00fcr\u00fcm\u00fc sundu\u011fu anlam\u0131na gelir. Yeni Service Worker, ancak mevcut Service Worker&#8217;\u0131n kontrol etti\u011fi t\u00fcm sayfalar kapat\u0131ld\u0131\u011f\u0131nda veya mevcut Service Worker&#8217;\u0131n kendisi sonland\u0131r\u0131ld\u0131\u011f\u0131nda otomatik olarak aktif hale gelir.<\/p>\n<p>Ancak, \u00e7o\u011fu durumda kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131y\u0131 kapatmas\u0131n\u0131 beklemek iyi bir kullan\u0131c\u0131 deneyimi de\u011fildir. \u0130\u015fte bu noktada <code>SwUpdate.activateUpdate()<\/code> metodu devreye girer. Bu metot \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, beklemede olan yeni Service Worker&#8217;\u0131n hemen etkinle\u015ftirilmesi i\u00e7in bir sinyal g\u00f6nderilir. Etkinle\u015ftirme ba\u015far\u0131l\u0131 olduktan sonra, sayfan\u0131n yeniden y\u00fcklenmesi (\u00f6rne\u011fin <code>document.location.reload()<\/code>) yeni Service Worker taraf\u0131ndan kontrol edilen yeni varl\u0131klar\u0131n y\u00fcklenmesini sa\u011flar.<\/p>\n<p>Bu &#8220;bekleme&#8221; ve &#8220;etkinle\u015ftirme&#8221; ayr\u0131m\u0131, Service Worker&#8217;lar\u0131n kritik bir \u00f6zelli\u011fidir: asla aktif olarak kullan\u0131lan bir Service Worker&#8217;\u0131 aniden de\u011fi\u015ftirmemek. Bu, uygulaman\u0131n o anki durumuyla ilgili tutars\u0131zl\u0131klar\u0131 \u00f6nler ve kullan\u0131c\u0131 deneyimini korur.<\/p>\n<h3>Uygulama \u0130\u00e7inde G\u00fcncelleme Bildirimlerini Uygulama<\/h3>\n<p>Kullan\u0131c\u0131lara yeni bir s\u00fcr\u00fcm\u00fcn mevcut oldu\u011funu bildirmek ve onlar\u0131 g\u00fcncellemeyi etkinle\u015ftirmeye te\u015fvik etmek, iyi bir kullan\u0131c\u0131 deneyimi i\u00e7in \u00e7ok \u00f6nemlidir.<\/p>\n<h4>Kullan\u0131c\u0131 Deneyimi (UX) De\u011ferlendirmeleri<\/h4>\n<p>*   <strong>Ne Zaman Bildirilmeli?<\/strong><br \/>\n    *   <strong>Hemen:<\/strong> Yeni s\u00fcr\u00fcm tespit edildi\u011finde ve indirildi\u011finde an\u0131nda bildirim g\u00f6sterilebilir. Bu, en g\u00fcncel i\u00e7eri\u011fi isteyen kullan\u0131c\u0131lar i\u00e7in idealdir.<br \/>\n    *   <strong>Gecikmeli:<\/strong> Kullan\u0131c\u0131n\u0131n aktif bir i\u015flem yapmad\u0131\u011f\u0131 bir anda veya belli bir s\u00fcre sonra bildirim g\u00f6sterilebilir.<br \/>\n    *   <strong>Sonraki Ziyarette:<\/strong> Kullan\u0131c\u0131 uygulamay\u0131 kapat\u0131p tekrar a\u00e7t\u0131\u011f\u0131nda yeni s\u00fcr\u00fcm otomatik olarak etkinle\u015ftirilebilir. Ancak bu, kullan\u0131c\u0131n\u0131n eski s\u00fcr\u00fcm\u00fc daha uzun s\u00fcre g\u00f6rmesine neden olabilir.<br \/>\n*   <strong>Nas\u0131l Bildirilmeli?<\/strong><br \/>\n    *   <strong>Snackbar\/Toast:<\/strong> K\u0131sa s\u00fcreli, dikkat \u00e7ekici bir mesaj.<br \/>\n    *   <strong>Diyalog Kutusu:<\/strong> Kullan\u0131c\u0131n\u0131n daha fazla dikkatini \u00e7eken ve bir eylem gerektiren bir pencere.<br \/>\n    *   <strong>Uygulama \u0130\u00e7i Mesaj:<\/strong> Uygulaman\u0131n bir b\u00f6l\u00fcm\u00fcnde kal\u0131c\u0131 olarak g\u00f6sterilen bir banner.<br \/>\n*   <strong>Hangi Eylem Gerekmeli?<\/strong><br \/>\n    *   <strong>Yenile (Refresh):<\/strong> Kullan\u0131c\u0131n\u0131n sayfay\u0131 yeniden y\u00fcklemesini isteyen bir d\u00fc\u011fme.<br \/>\n    *   <strong>Yoksay (Ignore):<\/strong> G\u00fcncellemeyi \u015fimdilik erteleme se\u00e7ene\u011fi.<\/p>\n<h4>Kod \u00d6rne\u011fi: Bir G\u00fcncelleme Bildirimi<\/h4>\n<p>Genellikle, uygulaman\u0131n ana bile\u015feninde (\u00f6rne\u011fin <code>AppComponent<\/code>) veya bir servis arac\u0131l\u0131\u011f\u0131yla <code>SwUpdate<\/code> servisi dinlenir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ app.component.ts\nimport { Component, OnInit } from '@angular\/core';\nimport { SwUpdate, VersionReadyEvent, VersionInstallationFailedEvent } from '@angular\/service-worker';\nimport { MatSnackBar } from '@angular\/material\/snack-bar'; \/\/ \u00d6rnek olarak Angular Material Snackbar kullan\u0131lm\u0131\u015ft\u0131r\n\n@Component({\n  selector: 'app-root',\n  templateUrl: '.\/app.component.html',\n  styleUrls: ['.\/app.component.css']\n})\nexport class AppComponent implements OnInit {\n  title = 'my-angular-pwa';\n\n  constructor(private swUpdate: SwUpdate, private snackBar: MatSnackBar) {}\n\n  ngOnInit(): void {\n    if (this.swUpdate.isEnabled) {\n      \/\/ Yeni s\u00fcr\u00fcm\u00fcn haz\u0131r oldu\u011funu dinle\n      this.swUpdate.versionUpdates.subscribe(event => {\n        if (event.type === 'VERSION_READY') {\n          console.log(<code>Yeni uygulama s\u00fcr\u00fcm\u00fc haz\u0131r: ${event.latestVersion.hash}<\/code>);\n          this.promptUpdate();\n        } else if (event.type === 'VERSION_INSTALLATION_FAILED') {\n          console.warn(<code>Yeni uygulama s\u00fcr\u00fcm\u00fc y\u00fcklenemedi: ${event.version.hash}, Hata: ${event.error}<\/code>);\n          \/\/ Kullan\u0131c\u0131ya bir hata mesaj\u0131 g\u00f6sterebilirsiniz.\n        }\n      });\n\n      \/\/ Uygulama a\u00e7\u0131l\u0131\u015f\u0131nda g\u00fcncelleme kontrol\u00fc yap (opsiyonel, Angular SW zaten yapar)\n      \/\/ this.swUpdate.checkForUpdate().then(() => console.log('G\u00fcncelleme kontrol\u00fc tamamland\u0131.'));\n\n      \/\/ Kurtar\u0131lamaz bir hata durumunu ele al (\u00f6rne\u011fin bozuk Service Worker)\n      this.swUpdate.unrecoverable.subscribe(event => {\n        console.error('Kurtar\u0131lamaz Service Worker hatas\u0131:', event.reason);\n        alert('Uygulamada \u00f6nemli bir hata olu\u015ftu. L\u00fctfen sayfay\u0131 yenileyin.');\n        window.location.reload();\n      });\n    } else {\n      console.log('Service Worker etkin de\u011fil.');\n    }\n  }\n\n  promptUpdate(): void {\n    const snackBarRef = this.snackBar.open('Yeni bir uygulama s\u00fcr\u00fcm\u00fc mevcut!', 'G\u00fcncelle', {\n      duration: 10000, \/\/ 10 saniye sonra otomatik kapan\u0131r\n    });\n\n    snackBarRef.onAction().subscribe(() => {\n      console.log('Kullan\u0131c\u0131 g\u00fcncellemeyi kabul etti.');\n      this.swUpdate.activateUpdate().then(() => {\n        document.location.reload();\n      });\n    });\n  }\n\n  \/\/ Manuel g\u00fcncelleme kontrol\u00fc i\u00e7in bir metod\n  checkManuallyForUpdates(): void {\n    if (this.swUpdate.isEnabled) {\n      this.swUpdate.checkForUpdate().then(updateAvailable => {\n        if (updateAvailable) {\n          console.log('Manuel kontrol: Yeni s\u00fcr\u00fcm mevcut.');\n          \/\/ E\u011fer zaten bir prompt g\u00f6sterilmediyse burada g\u00f6sterebilirsiniz.\n          \/\/ this.promptUpdate();\n        } else {\n          console.log('Manuel kontrol: Zaten en g\u00fcncel s\u00fcr\u00fcmdesiniz.');\n          this.snackBar.open('Zaten en g\u00fcncel s\u00fcr\u00fcmdesiniz.', 'Kapat', { duration: 3000 });\n        }\n      }).catch(err => {\n        console.error('Manuel g\u00fcncelleme kontrol\u00fcnde hata:', err);\n        this.snackBar.open('G\u00fcncelleme kontrol\u00fc ba\u015far\u0131s\u0131z oldu.', 'Kapat', { duration: 3000 });\n      });\n    }\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n1.  <code>SwUpdate<\/code> servisi enjekte edilir.<br \/>\n2.  <code>ngOnInit<\/code> i\u00e7inde, <code>swUpdate.versionUpdates<\/code> ak\u0131\u015f\u0131na abone olunur.<br \/>\n3.  <code>VERSION_READY<\/code> olay\u0131 tetiklendi\u011finde (yani yeni s\u00fcr\u00fcm indirilip etkinle\u015ftirilmeye haz\u0131r oldu\u011funda), kullan\u0131c\u0131ya bir <code>MatSnackBar<\/code> bildirimi g\u00f6sterilir.<br \/>\n4.  Kullan\u0131c\u0131 &#8220;G\u00fcncelle&#8221; d\u00fc\u011fmesine t\u0131klad\u0131\u011f\u0131nda, <code>activateUpdate()<\/code> \u00e7a\u011fr\u0131l\u0131r ve ard\u0131ndan <code>document.location.reload()<\/code> ile sayfa yeniden y\u00fcklenir. Bu, yeni Service Worker&#8217;\u0131n kontrol\u00fcndeki yeni uygulama varl\u0131klar\u0131n\u0131n y\u00fcklenmesini sa\u011flar.<br \/>\n5.  <code>unrecoverable<\/code> olay\u0131, Service Worker&#8217;\u0131n kritik bir hata nedeniyle \u00e7al\u0131\u015famaz hale geldi\u011fi durumlarda tetiklenir. Bu durumda genellikle kullan\u0131c\u0131ya sayfay\u0131 yenilemesi s\u00f6ylenir.<\/p>\n<h3>Geli\u015fmi\u015f Senaryolar ve En \u0130yi Uygulamalar<\/h3>\n<p>Angular Service Worker ile g\u00fcncellemeleri y\u00f6netirken dikkate al\u0131nmas\u0131 gereken baz\u0131 geli\u015fmi\u015f senaryolar ve en iyi uygulamalar mevcuttur.<\/p>\n<h4><code>ngsw-config.json<\/code> De\u011fi\u015fiklikleri ve Zorunlu G\u00fcncelleme<\/h4>\n<p><code>ngsw-config.json<\/code> dosyas\u0131nda yap\u0131lan bir de\u011fi\u015fiklik (\u00f6rne\u011fin yeni bir \u00f6nbellek grubu eklemek, \u00f6nbellekleme stratejilerini de\u011fi\u015ftirmek) uygulaman\u0131n &#8220;s\u00fcr\u00fcm\u00fcn\u00fc&#8221; de etkiler. Bu t\u00fcr bir de\u011fi\u015fiklik, Service Worker&#8217;\u0131n yeni bir <code>ngsw.json<\/code> manifest dosyas\u0131 olu\u015fturmas\u0131na neden olur ve bu da normal bir uygulama g\u00fcncellemesi gibi alg\u0131lan\u0131r. Dolay\u0131s\u0131yla, <code>ngsw-config.json<\/code>&#8216;da yap\u0131lan her de\u011fi\u015fiklik, kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131na yeni bir Service Worker s\u00fcr\u00fcm\u00fcn\u00fcn da\u011f\u0131t\u0131lmas\u0131n\u0131 tetikler.<\/p>\n<h4>\u00d6n Bellekleme Stratejileri: Pre-caching vs. Runtime Caching<\/h4>\n<p><code>ngsw-config.json<\/code> i\u00e7inde iki ana \u00f6nbellekleme stratejisi vard\u0131r:<br \/>\n*   <strong>Pre-caching (<code>assetGroups<\/code>):<\/strong> Uygulama y\u00fcklendi\u011finde veya yeni bir s\u00fcr\u00fcm tespit edildi\u011finde Service Worker taraf\u0131ndan otomatik olarak \u00f6nbelle\u011fe al\u0131nan varl\u0131klar (HTML, CSS, JS, resimler vb.). Bu varl\u0131klar, <code>ngsw.json<\/code> i\u00e7indeki karmalarla takip edilir ve bir de\u011fi\u015fiklik oldu\u011funda yeni s\u00fcr\u00fcm indirilir. Bu, uygulaman\u0131n temel varl\u0131klar\u0131 i\u00e7in idealdir.<br \/>\n*   <strong>Runtime Caching (<code>dataGroups<\/code>):<\/strong> Uygulama \u00e7al\u0131\u015f\u0131rken a\u011f isteklerine dayal\u0131 olarak \u00f6nbelle\u011fe al\u0131nan varl\u0131klar (API \u00e7a\u011fr\u0131lar\u0131, dinamik i\u00e7erik). Bu varl\u0131klar i\u00e7in <code>ngsw.json<\/code>&#8216;da karma takibi yap\u0131lmaz. <code>maxAge<\/code>, <code>maxEntries<\/code> ve <code>strategy<\/code> gibi ayarlar kullan\u0131larak \u00f6nbellekleme davran\u0131\u015flar\u0131 kontrol edilir. API verilerini \u00f6nbelle\u011fe al\u0131rken, bu verilerin g\u00fcncelli\u011fini korumak i\u00e7in uygun bir strateji (\u00f6rne\u011fin <code>freshness<\/code> veya <code>networkFirst<\/code>) se\u00e7mek ve <code>maxAge<\/code> de\u011ferini dikkatlice belirlemek \u00f6nemlidir.<\/p>\n<p>API verilerinin g\u00fcncellenmesi, Service Worker&#8217;\u0131n uygulama g\u00fcncelleme mekanizmas\u0131ndan ayr\u0131 d\u00fc\u015f\u00fcn\u00fclmelidir. Bir API endpoint&#8217;inden gelen veriler de\u011fi\u015fti\u011finde, Service Worker&#8217;\u0131n \u00f6nbelle\u011findeki verinin de g\u00fcncellenmesi gerekir. Bu, genellikle <code>dataGroups<\/code> i\u00e7inde tan\u0131mlanan stratejilerle veya uygulama i\u00e7inde <code>fetch<\/code> veya <code>HttpClient<\/code> kullanarak \u00f6nbelle\u011fi manuel olarak y\u00f6neterek yap\u0131l\u0131r.<\/p>\n<h4><code>unrecoverable<\/code> Durumu<\/h4>\n<p><code>SwUpdate.unrecoverable<\/code> ak\u0131\u015f\u0131, Service Worker&#8217;\u0131n ciddi bir hata nedeniyle kurtar\u0131lamaz bir duruma girdi\u011fini g\u00f6sterir. Bu, genellikle Service Worker&#8217;\u0131n kendisinin bozuldu\u011fu veya beklenmedik bir \u015fekilde devre d\u0131\u015f\u0131 kald\u0131\u011f\u0131 anlam\u0131na gelir. Bu durumda, en g\u00fcvenli yol kullan\u0131c\u0131dan sayfay\u0131 tamamen yeniden y\u00fcklemesini istemektir (<code>window.location.reload()<\/code>). Bu, Service Worker&#8217;\u0131n yeniden kaydedilmesini ve s\u0131f\u0131rdan ba\u015flamas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>G\u00fcncellemeleri Test Etme<\/h4>\n<p>G\u00fcncelleme mekanizmas\u0131n\u0131 do\u011fru bir \u015fekilde test etmek \u00f6nemlidir:<br \/>\n1.  <strong>\u00dcretim Derlemesi:<\/strong> Her zaman <code>ng build --configuration production<\/code> ile uygulaman\u0131z\u0131 derleyin. Geli\u015ftirme modunda Service Worker etkin de\u011fildir.<br \/>\n2.  <strong>Statik Sunucu:<\/strong> Derlenmi\u015f uygulamay\u0131 bir HTTP sunucusu ile servis edin (\u00f6rne\u011fin <code>http-server dist\/my-app<\/code>).<br \/>\n3.  <strong>Taray\u0131c\u0131 DevTools:<\/strong> Chrome DevTools&#8217;ta &#8220;Application&#8221; sekmesine gidin. &#8220;Service Workers&#8221; b\u00f6l\u00fcm\u00fcnde mevcut Service Worker&#8217;\u0131 g\u00f6rebilir, durumunu (activating, activated, waiting) izleyebilir ve &#8220;Update on reload&#8221; veya &#8220;skipWaiting&#8221; gibi se\u00e7enekleri kullanabilirsiniz. &#8220;Cache Storage&#8221; b\u00f6l\u00fcm\u00fcnde Service Worker&#8217;\u0131n \u00f6nbelle\u011fini de g\u00f6rebilirsiniz.<br \/>\n4.  <strong>Sim\u00fclasyon:<\/strong><br \/>\n    *   Uygulaman\u0131n ilk s\u00fcr\u00fcm\u00fcn\u00fc da\u011f\u0131t\u0131n ve taray\u0131c\u0131da a\u00e7\u0131n.<br \/>\n    *   Uygulaman\u0131zda k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik yap\u0131n (\u00f6rne\u011fin <code>app.component.html<\/code>&#8216;deki bir metni de\u011fi\u015ftirin).<br \/>\n    *   Uygulamay\u0131 tekrar derleyin ve sunucuya da\u011f\u0131t\u0131n (eski dosyalar\u0131n \u00fczerine yaz\u0131n).<br \/>\n    *   Taray\u0131c\u0131da, uygulaman\u0131z\u0131 a\u00e7\u0131k tutarken yeni bir sekmede veya ayn\u0131 sekmede sayfay\u0131 yenilemeden bir s\u00fcre bekleyin. Service Worker&#8217;\u0131n yeni s\u00fcr\u00fcm\u00fc tespit etmesini ve indirmesini izleyin.<br \/>\n    *   Uygulaman\u0131zdaki bildirim mekanizmas\u0131n\u0131n tetiklenip tetiklenmedi\u011fini kontrol edin.<br \/>\n    *   Kullan\u0131c\u0131 olarak g\u00fcncellemeyi kabul edin ve sayfan\u0131n yenilenerek yeni s\u00fcr\u00fcm\u00fc g\u00f6sterdi\u011finden emin olun.<br \/>\n5.  <strong>A\u011f Ko\u015fullar\u0131:<\/strong> DevTools&#8217;taki &#8220;Network&#8221; sekmesinden \u00e7evrimd\u0131\u015f\u0131 modu veya yava\u015f a\u011f ko\u015fullar\u0131n\u0131 sim\u00fcle ederek Service Worker&#8217;\u0131n davran\u0131\u015f\u0131n\u0131 test edin.<\/p>\n<h4>Da\u011f\u0131t\u0131m Stratejileri<\/h4>\n<p>*   <strong><code>ngsw.json<\/code>&#8216;\u0131n G\u00fcncelli\u011fi:<\/strong> Sunucunuzun, <code>ngsw.json<\/code> dosyas\u0131 i\u00e7in agresif \u00f6nbellekleme yapmad\u0131\u011f\u0131ndan emin olun. Taray\u0131c\u0131, bu dosyay\u0131 her uygulama ba\u015flang\u0131c\u0131nda kontrol etmelidir. Genellikle, bu dosya i\u00e7in <code>Cache-Control: no-cache<\/code> veya k\u0131sa bir <code>max-age<\/code> ayar\u0131 \u00f6nerilir.<br \/>\n*   <strong>Atomik Da\u011f\u0131t\u0131mlar:<\/strong> Yeni uygulama s\u00fcr\u00fcm\u00fcn\u00fc da\u011f\u0131t\u0131rken, eski ve yeni dosyalar\u0131n kar\u0131\u015fmad\u0131\u011f\u0131ndan emin olun. Genellikle, t\u00fcm yeni dosyalar ayn\u0131 anda sunucuya y\u00fcklenir veya bir <code>blue-green<\/code> da\u011f\u0131t\u0131m stratejisi kullan\u0131l\u0131r.<\/p>\n<h3>Yayg\u0131n Hatalar ve Sorun Giderme<\/h3>\n<p>Angular Service Worker g\u00fcncellemeleriyle ilgili kar\u015f\u0131la\u015f\u0131labilecek baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcm \u00f6nerileri:<\/p>\n<p>*   <strong>Service Worker Kaydedilmiyor:<\/strong><br \/>\n    *   <strong>Kontrol:<\/strong> <code>ng build --configuration production<\/code> ile derledi\u011finizden emin olun. Geli\u015ftirme modunda Service Worker etkin de\u011fildir.<br \/>\n    *   <strong>Kontrol:<\/strong> <code>angular.json<\/code> dosyas\u0131nda <code>projects.<your-app-name>.architect.build.options.serviceWorker<\/code> de\u011ferinin <code>true<\/code> oldu\u011fundan emin olun.<br \/>\n    *   <strong>Kontrol:<\/strong> <code>index.html<\/code> dosyas\u0131nda Service Worker&#8217;\u0131 kaydeden kodun (<code><script>if ('serviceWorker' in navigator) { ... }<\/script><\/code>) mevcut oldu\u011fundan emin olun.<br \/>\n    *   <strong>Kontrol:<\/strong> Taray\u0131c\u0131 DevTools&#8217;ta (Application -> Service Workers) Service Worker&#8217;\u0131n kaydedildi\u011fini g\u00f6r\u00fcn. Hata mesajlar\u0131 varsa inceleyin.<br \/>\n*   <strong>Yeni S\u00fcr\u00fcm Tespit Edilmiyor veya Etkinle\u015fmiyor:<\/strong><br \/>\n    *   <strong>Kontrol:<\/strong> <code>ngsw.json<\/code> dosyas\u0131n\u0131n sunucuda g\u00fcncel oldu\u011fundan ve do\u011fru yollarla eri\u015filebildi\u011finden emin olun.<br \/>\n    *   <strong>Kontrol:<\/strong> Taray\u0131c\u0131 DevTools&#8217;ta &#8220;Network&#8221; sekmesinde <code>ngsw.json<\/code> dosyas\u0131n\u0131n her uygulama ba\u015flang\u0131c\u0131nda veya manuel kontrolde tekrar indirildi\u011fini ve i\u00e7eri\u011finin de\u011fi\u015fti\u011fini g\u00f6r\u00fcn.<br \/>\n    *   <strong>Kontrol:<\/strong> <code>ngsw-config.json<\/code> dosyas\u0131ndaki <code>assetGroups<\/code> ve <code>dataGroups<\/code> ayarlar\u0131n\u0131n do\u011fru oldu\u011fundan, \u00f6zellikle <code>installMode<\/code> ve <code>updateMode<\/code> de\u011ferlerinin beklenen davran\u0131\u015f\u0131 sa\u011flad\u0131\u011f\u0131ndan emin olun.<br \/>\n    *   <strong>Kontrol:<\/strong> <code>ngsw.json<\/code> dosyas\u0131n\u0131n sunucuda <code>Cache-Control: no-cache<\/code> veya k\u0131sa bir <code>max-age<\/code> ile servis edildi\u011finden emin olun. Aksi takdirde, taray\u0131c\u0131 sunucudan yeni <code>ngsw.json<\/code>&#8216;\u0131 \u00e7ekmeyebilir.<br \/>\n    *   <strong>Kontrol:<\/strong> <code>SwUpdate<\/code> servisinin <code>versionUpdates<\/code> ak\u0131\u015f\u0131na do\u011fru \u015fekilde abone oldu\u011funuzdan ve <code>activateUpdate()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n*   <strong>Eski \u0130\u00e7erik G\u00f6steriliyor:<\/strong><br \/>\n    *   Bu genellikle Service Worker&#8217;\u0131n yeni s\u00fcr\u00fcm\u00fc indirmesine ra\u011fmen hen\u00fcz etkinle\u015fmedi\u011fi anlam\u0131na gelir. <code>activateUpdate()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 ve ard\u0131ndan <code>document.location.reload()<\/code>&#8216;\u0131 do\u011fru zamanda yapt\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n    *   Kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131nda birden fazla sekmede uygulaman\u0131z\u0131n a\u00e7\u0131k olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. T\u00fcm sekmeler kapat\u0131lana kadar Service Worker etkinle\u015fmeyebilir (manuel <code>activateUpdate()<\/code> \u00e7a\u011fr\u0131s\u0131 olmadan).<br \/>\n*   <strong><code>ngsw-config.json<\/code> Hatalar\u0131:<\/strong><br \/>\n    *   JSON format\u0131n\u0131n do\u011fru oldu\u011fundan emin olun.<br \/>\n    *   <code>assetGroups<\/code> ve <code>dataGroups<\/code> i\u00e7indeki <code>urls<\/code> ve <code>patterns<\/code> dizilerinin do\u011fru yollar\u0131 ve glob desenlerini i\u00e7erdi\u011finden emin olun.<br \/>\n    *   \u00d6zellikle <code>dataGroups<\/code> i\u00e7in <code>maxAge<\/code>, <code>maxEntries<\/code> gibi ayarlar\u0131n mant\u0131kl\u0131 de\u011ferlere sahip oldu\u011fundan emin olun.<br \/>\n*   <strong>Debugging:<\/strong><br \/>\n    *   Chrome DevTools (veya di\u011fer taray\u0131c\u0131lar\u0131n geli\u015ftirici ara\u00e7lar\u0131) &#8220;Application&#8221; sekmesi alt\u0131ndaki &#8220;Service Workers&#8221; ve &#8220;Cache Storage&#8221; b\u00f6l\u00fcmlerini kullanarak Service Worker&#8217;\u0131n durumunu, \u00f6nbelle\u011fini ve hatalar\u0131n\u0131 izleyin.<br \/>\n    *   &#8220;Console&#8221; sekmesindeki Service Worker ile ilgili loglar\u0131 ve hatalar\u0131 takip edin.<br \/>\n    *   <code>SwUpdate<\/code> servisinden gelen <code>versionUpdates<\/code> olaylar\u0131n\u0131 loglayarak Service Worker&#8217;\u0131n hangi a\u015famada oldu\u011funu anlay\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Angular Service Worker, modern web uygulamalar\u0131na g\u00fc\u00e7l\u00fc PWA yetenekleri kazand\u0131ran, \u00f6zellikle \u00e7evrimd\u0131\u015f\u0131 destek ve performans art\u0131\u015f\u0131 sa\u011flayan kritik bir ara\u00e7t\u0131r. Ancak, bu g\u00fcc\u00fcn beraberinde getirdi\u011fi en b\u00fcy\u00fck zorluklardan biri, uygulaman\u0131n yeni s\u00fcr\u00fcmlerinin kullan\u0131c\u0131lara sorunsuz ve tutarl\u0131 bir \u015fekilde ula\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r. Angular&#8217;\u0131n dahili g\u00fcncelleme mekanizmas\u0131, i\u00e7erik karmalar\u0131, <code>ngsw.json<\/code> manifest dosyas\u0131 ve <code>SwUpdate<\/code> servisi arac\u0131l\u0131\u011f\u0131yla bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde otomatikle\u015ftirir ve kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Ba\u015far\u0131l\u0131 bir g\u00fcncelleme stratejisi, sadece teknik entegrasyonu de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 deneyimini de dikkate almay\u0131 gerektirir. Kullan\u0131c\u0131lara yeni bir s\u00fcr\u00fcm\u00fcn varl\u0131\u011f\u0131n\u0131 bildirmek, onlara g\u00fcncellemeyi etkinle\u015ftirme se\u00e7ene\u011fi sunmak ve bu ge\u00e7i\u015fi m\u00fcmk\u00fcn oldu\u011funca \u015feffaf hale getirmek, uygulaman\u0131z\u0131n benimsenmesi ve kullan\u0131c\u0131 memnuniyeti i\u00e7in hayati \u00f6neme sahiptir. <code>SwUpdate<\/code> API&#8217;sini do\u011fru kullanarak, <code>versionUpdates<\/code> ak\u0131\u015f\u0131n\u0131 dinleyerek ve uygun bir kullan\u0131c\u0131 aray\u00fcz\u00fc bildirimi entegre ederek, Angular PWA&#8217;lar\u0131n\u0131z\u0131n her zaman g\u00fcncel kalmas\u0131n\u0131 ve kullan\u0131c\u0131lar\u0131n\u0131za en iyi deneyimi sunmas\u0131n\u0131 sa\u011flayabilirsiniz. Unutmay\u0131n ki, d\u00fczenli testler ve do\u011fru da\u011f\u0131t\u0131m uygulamalar\u0131, g\u00fcncelleme s\u00fcrecindeki potansiyel sorunlar\u0131 en aza indirmek i\u00e7in vazge\u00e7ilmezdir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak\nModern web uygulamalar\u0131, kullan\u0131c\u0131lara masa\u00fcst\u00fc uygulamalar\u0131na benzer bir deneyim sunma","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":[1488],"tags":[],"class_list":{"0":"post-31523","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","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>Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak - 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\/angular-service-worker-guncellemelerle-basa-cikmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak\" \/>\n<meta property=\"og:description\" content=\"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak Modern web uygulamalar\u0131, kullan\u0131c\u0131lara masa\u00fcst\u00fc uygulamalar\u0131na benzer bir deneyim sunma\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T19:41:04+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\/angular-service-worker-guncellemelerle-basa-cikmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak\",\"datePublished\":\"2025-10-10T19:41:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\"},\"wordCount\":2729,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\",\"name\":\"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T19:41:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak\"}]},{\"@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":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak - 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\/angular-service-worker-guncellemelerle-basa-cikmak\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak","og_description":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak Modern web uygulamalar\u0131, kullan\u0131c\u0131lara masa\u00fcst\u00fc uygulamalar\u0131na benzer bir deneyim sunma","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T19:41:04+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\/angular-service-worker-guncellemelerle-basa-cikmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak","datePublished":"2025-10-10T19:41:04+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/"},"wordCount":2729,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/","name":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T19:41:04+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-service-worker-guncellemelerle-basa-cikmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular Service Worker: G\u00fcncellemelerle Ba\u015fa \u00c7\u0131kmak"}]},{"@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\/31523","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=31523"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31523\/revisions"}],"predecessor-version":[{"id":31524,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31523\/revisions\/31524"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}