Progressiv Veb-Ilovalar Arxitekturasi: JavaScript Service Worker Patternlari | MLOG | MLOG

4. Network-Only (Faqat Tarmoqdan)

Network-only strategiyasi har doim aktivlarni tarmoqdan oladi va keshni butunlay chetlab o'tadi. Bu strategiya resursning eng so'nggi versiyasi mutlaqo zarur bo'lganda va kesh saqlash kerak bo'lmaganda qo'llaniladi.

Misol:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    fetch(event.request)
  );
});

            

5. Stale-While-Revalidate (Eskirganini Qayta Tekshirish)

Stale-while-revalidate strategiyasi keshdagi aktivni darhol taqdim etadi va bir vaqtning o'zida tarmoqdan eng so'nggi versiyasini oladi. Tarmoq so'rovi tugagach, kesh yangi versiya bilan yangilanadi. Bu strategiya foydalanuvchi oxir-oqibat eng dolzarb kontentni olishini ta'minlagan holda tezkor dastlabki javobni taqdim etadi. Bu mutlaq yangilikdan ko'ra tezlikdan foyda ko'radigan muhim bo'lmagan kontent uchun foydali strategiyadir.

Misol:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        const fetchPromise = fetch(event.request).then(networkResponse => {
          caches.open('my-cache').then(cache => {
            cache.put(event.request, networkResponse.clone());
            return networkResponse;
          });
        });
        return response || fetchPromise;
      })
  );
});

            

6. Kesh, Keyin Tarmoq

Stale-while-revalidate strategiyasiga o'xshaydi, lekin keshdagi aktivni darhol qaytarmaydi. Avval keshni tekshiradi va faqat aktiv mavjud bo'lsa, keshni yangilash uchun tarmoq so'rovi fonda davom etadi.

To'g'ri Kesh Saqlash Strategiyasini Tanlash

Optimal kesh saqlash strategiyasi ilovangizning o'ziga xos talablariga bog'liq. Quyidagi omillarni hisobga oling:

Tegishli kesh saqlash strategiyalarini ehtiyotkorlik bilan tanlab, siz hatto oflayn muhitlarda ham PWA'ning samaradorligi va foydalanuvchi tajribasini sezilarli darajada yaxshilashingiz mumkin. Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) kabi vositalar ushbu strategiyalarni amalga oshirishni soddalashtirishi mumkin.

Fon Sinxronizatsiyasi: Oflayn Mutatsiyalarni Boshqarish

Fon sinxronizatsiyasi sizning PWA'ngizga foydalanuvchi oflayn bo'lganda ham fonda vazifalarni bajarishga imkon beradi. Bu ayniqsa shakllarni yuborish, ma'lumotlarni yangilash va tarmoq ulanishini talab qiladigan boshqa operatsiyalarni boshqarish uchun foydalidir. `BackgroundSyncManager` API'si tarmoq mavjud bo'lganda bajariladigan vazifalarni ro'yxatdan o'tkazish imkonini beradi.

Fon Sinxronizatsiyasi Vazifasini Ro'yxatdan O'tkazish

Fon sinxronizatsiyasi vazifasini ro'yxatdan o'tkazish uchun `BackgroundSyncManager` ning `register` metodidan foydalanishingiz kerak. Bu metod argument sifatida noyob teg nomini oladi. Teg nomi bajarilishi kerak bo'lgan ma'lum bir vazifani aniqlaydi.

Misol:

            
self.addEventListener('sync', event => {
  if (event.tag === 'my-sync-task') {
    event.waitUntil(doSomeWork());
  }
});

            

Sync Hodisasiga Ishlov Berish

Brauzer tarmoq ulanishini aniqlaganida, u service workerga `sync` hodisasini yuboradi. Siz bu hodisani tinglashingiz va serverga ma'lumot yuborish kabi zarur amallarni bajarishingiz mumkin.

Misol:

            
async function doSomeWork() {
  // Retrieve data from IndexedDB
  const data = await getDataFromIndexedDB();

  // Send data to the server
  try {
    const response = await fetch('/api/sync', {
      method: 'POST',
      body: JSON.stringify(data),
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.ok) {
      // Clear the data from IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Handle errors
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Handle network errors
    console.error('Network error:', error);
    throw error;
  }
}

            

Misol: Oflayn Shaklni Yuborish

Foydalanuvchi oflayn rejimda shaklni to'ldirayotgan vaziyatni tasavvur qiling. Service worker shakl ma'lumotlarini IndexedDB'da saqlashi va fon sinxronizatsiyasi vazifasini ro'yxatdan o'tkazishi mumkin. Tarmoq mavjud bo'lganda, service worker shakl ma'lumotlarini IndexedDB'dan oladi va uni serverga yuboradi.

  1. Foydalanuvchi oflayn rejimda shaklni to'ldiradi va yuborish tugmasini bosadi.
  2. Shakl ma'lumotlari IndexedDB'da saqlanadi.
  3. Noyob teg (masalan, `form-submission`) bilan fon sinxronizatsiyasi vazifasi ro'yxatdan o'tkaziladi.
  4. Tarmoq mavjud bo'lganda, `sync` hodisasi ishga tushadi.
  5. Service worker shakl ma'lumotlarini IndexedDB'dan oladi va uni serverga yuboradi.
  6. Agar yuborish muvaffaqiyatli bo'lsa, shakl ma'lumotlari IndexedDB'dan o'chiriladi.

Push-Bildirishnomalar: Foydalanuvchilarni O'z Vaqtida Yangilanishlar bilan Jalb Qilish

Push-bildirishnomalar ilova brauzerda faol ishlamayotgan bo'lsa ham, PWA'ngizga foydalanuvchilarga o'z vaqtida yangilanishlar va xabarlar yuborish imkonini beradi. Bu foydalanuvchi jalb etilishi va saqlanib qolishini sezilarli darajada yaxshilashi mumkin. Push API va Notifications API push-bildirishnomalarni yetkazib berish uchun birgalikda ishlaydi.

Push-Bildirishnomalarga Obuna Bo'lish

Push-bildirishnomalarni olish uchun foydalanuvchilar avval PWA'ngizga ruxsat berishlari kerak. Siz foydalanuvchilarni push-bildirishnomalarga obuna qilish uchun `PushManager` API'sidan foydalanishingiz mumkin.

Misol:

            
navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY'
  })
  .then(subscription => {
    // Send subscription details to your server
    sendSubscriptionToServer(subscription);
  })
  .catch(error => {
    console.error('Failed to subscribe:', error);
  });
});

            

Muhim: `YOUR_PUBLIC_VAPID_KEY` ni o'zingizning haqiqiy VAPID (Voluntary Application Server Identification) kalitingiz bilan almashtiring. VAPID kalitlari ilova serveringizni aniqlash va push-bildirishnomalar xavfsiz yuborilishini ta'minlash uchun ishlatiladi.

Push-Bildirishnomalarga Ishlov Berish

Push-bildirishnoma qabul qilinganda, service worker `push` hodisasini yuboradi. Siz bu hodisani tinglashingiz va foydalanuvchiga bildirishnomani ko'rsatishingiz mumkin.

Misol:

            
self.addEventListener('push', event => {
  const payload = event.data ? event.data.text() : 'No payload';

  event.waitUntil(
    self.registration.showNotification('My PWA', {
      body: payload,
      icon: 'icon.png'
    })
  );
});

            

Push-Bildirishnomalarni Moslashtirish

Notifications API sizga push-bildirishnomalarning ko'rinishi va xatti-harakatini moslashtirishga imkon beradi. Siz sarlavha, matn, belgi, nishon va boshqa parametrlarni belgilashingiz mumkin.

Misol:

            
self.addEventListener('push', event => {
  const data = event.data.json();
  const title = data.title || 'My PWA';
  const options = {
    body: data.body || 'No message',
    icon: data.icon || 'icon.png',
    badge: data.badge || 'badge.png',
    vibrate: [200, 100, 200],
    data: { // Custom data that you can access when the user clicks the notification
      url: data.url || '/'
    },
    actions: [
      {action: 'explore', title: 'Explore this new world',
        icon: 'images/checkmark.png'},
      {action: 'close', title: 'Close',
        icon: 'images/xmark.png'},
    ]
  };

  event.waitUntil(self.registration.showNotification(title, options));
});


self.addEventListener('notificationclick', function(event) {
  event.notification.close();

  // Check if the user clicked on an action.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Default action: open the app.
    clients.openWindow('/');
  }
});

            

Misol: Yangiliklar Ogohlantirishi

Yangiliklar ilovasi foydalanuvchilarni eng so'nggi yangiliklar haqida ogohlantirish uchun push-bildirishnomalardan foydalanishi mumkin. Yangi maqola chop etilganda, server foydalanuvchi qurilmasiga maqolaning qisqacha mazmunini ko'rsatadigan push-bildirishnoma yuboradi. Keyin foydalanuvchi bildirishnomani bosib, PWA'da to'liq maqolani ochishi mumkin.

Ilg'or Service Worker Patternlari

1. Oflayn Analitika

Foydalanuvchilar oflayn bo'lganda ham ularning xatti-harakatlarini kuzatib boring, buning uchun analitika ma'lumotlarini mahalliy saqlang va tarmoq mavjud bo'lganda serverga yuboring. Bunga IndexedDB va Fon Sinxronizatsiyasi yordamida erishish mumkin.

2. Versiyalash va Yangilash

Foydalanuvchilar har doim o'z tajribalariga xalaqit bermasdan eng so'nggi yangilanishlarni olishlarini ta'minlash uchun service worker uchun mustahkam versiyalash strategiyasini amalga oshiring. Eski keshdagi aktivlarni bekor qilish uchun keshni bekor qilish usullaridan foydalaning.

3. Modulli Service Workerlar

O'qilishi va saqlanishi oson bo'lishi uchun service worker kodingizni modullarga ajrating. JavaScript modullaridan (ESM) yoki Webpack yoki Rollup kabi modul to'plovchilaridan foydalaning.

4. Dinamik Kesh Saqlash

Foydalanuvchi o'zaro ta'sirlari va foydalanish patternlariga asoslanib aktivlarni dinamik ravishda keshlang. Bu kesh hajmini optimallashtirishga va samaradorlikni oshirishga yordam beradi.

Service Worker Yaratish uchun Eng Yaxshi Amaliyotlar

Xulosa

JavaScript service workerlari mustahkam, samarali va qiziqarli PWAlar yaratish uchun kuchli vositalardir. Service worker hayot siklini tushunib, tegishli kesh saqlash strategiyalari, fon sinxronizatsiyasi va push-bildirishnomalarni amalga oshirib, siz hatto oflayn muhitlarda ham ajoyib foydalanuvchi tajribasini yaratishingiz mumkin. Ushbu maqolada global auditoriya uchun muvaffaqiyatli PWAlar yaratishda sizga yo'l-yo'riq ko'rsatish uchun asosiy service worker patternlari va eng yaxshi amaliyotlar ko'rib chiqildi. Veb rivojlanishda davom etar ekan, service workerlar veb-dasturlash kelajagini shakllantirishda tobora muhim rol o'ynaydi.

Ushbu patternlarni o'zingizning ilovangiz talablariga moslashtirishni unutmang va har doim foydalanuvchi tajribasiga ustuvorlik bering. Service workerlarning kuchini qabul qilib, siz nafaqat funksional, balki foydalanuvchining joylashuvi yoki tarmoq ulanishidan qat'i nazar, foydalanish uchun yoqimli bo'lgan PWAlarni yaratishingiz mumkin.

Qo'shimcha Manbalar: