çalışma kutusu-arka plan-senkronizasyon

Bir web sunucusuna veri gönderdiğinizde bazen istekler başarısız olur. Google bunun nedeni kullanıcının bağlantısını kesmesi veya sunucu çalışmıyor; her iki durumda da isteklerinizi sık sık göndermeyi daha sonra tekrar deneyin.

Yeni BackgroundSync API bu sorun için ideal bir çözümdür. Bir hizmet çalışanı, ağ isteği başarısız olduysa sync etkinliği almak için kaydolabilir, Tarayıcı, bağlantının geri geldiğini düşündüğünde teslim edilir. Senkronizasyon etkinliğinin, kullanıcı geleneksel yöntemden çok daha etkili olmasını sağlayan yeniden deneniyor.

Workbox Arka Plan Senkronizasyonu, arka plan senkronizasyonu gibi backgroundSync API'sini etkinleştirmenize ve kullanımını diğer Workbox modülleriyle entegre etmenize olanak tanır. Google Ayrıca, BackgroundSync.

backgroundSync API'sini destekleyen tarayıcılar başarısız olanları otomatik olarak tekrar oynatır sizin adınıza talep edebileceği tarayıcı tarafından yönetilen aralık, arasında eksponansiyel geri yükleme olduğunu görebilirsiniz. Şu tarayıcılarda BackgroundSync API'yi yerel olarak desteklemediğinden, Workbox Arka Plan Senkronizasyonu Service Worker her başlatıldığında otomatik olarak tekrar oynatmayı dener.

Temel Kullanım

Arka Plan Senkronizasyonu'nu kullanmanın en kolay yolu,Plugin Başarısız istekleri otomatik olarak sıraya koyun ve sonraki sync tarihinde tekrar deneyin tetiklendiği anlamına gelir.

import {BackgroundSyncPlugin} from 'workbox-background-sync';
import {registerRoute} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';

const bgSyncPlugin = new BackgroundSyncPlugin('myQueueName', {
  maxRetentionTime: 24 * 60, // Retry for max of 24 Hours (specified in minutes)
});

registerRoute(
  /\/api\/.*\/*.json/,
  new NetworkOnly({
    plugins: [bgSyncPlugin],
  }),
  'POST'
);

BackgroundSyncPlugin fetchDidFail eklentisi geri çağırması ve fetchDidFail yalnızca büyük olasılıkla neden olabilir. Bu durumda, bir istek olması durumunda istekler yeniden alınan yanıt 4xx veya 5xx hata durumu. 5xx durumuyla sonuçlanan tüm istekleri yeniden denemek isterseniz bu işlemleri fetchDidSucceed eklentisi ekleyerek ekleyin:

const statusPlugin = {
  fetchDidSucceed: ({response}) => {
    if (response.status >= 500) {
      // Throwing anything here will trigger fetchDidFail.
      throw new Error('Server error.');
    }
    // If it's not 5xx, use the response as-is.
    return response;
  },
};

// Add statusPlugin to the plugins array in your strategy.

Gelişmiş Kullanım

Workbox Arka Plan Senkronizasyonu ayrıca bir Queue sınıfı da sağlar. Bunu başarısız istekleri örneklendirmek ve eklemek için kullanılır. Başarısız istekler depolanır IndexedDB dizininde ve tarayıcı, bağlantının geri yüklendiğini algıladığında (ör. .

Sıra Oluşturma

Workbox Arka Plan Senkronizasyon Sırası oluşturmak için, (benzersiz olmalıdır) kaynak):

import {Queue} from 'workbox-background-sync';

const queue = new Queue('myQueueName');

Sıra adı, girilen etiket adının bir parçası olarak register() sürüm tüm dünyadan SyncManager. İnsanların olarak da kullanılır Nesne Deposu adı: IndexedDB veritabanını kullanıyor.

Sıraya istek ekleme

Queue örneğinizi oluşturduktan sonra, başarısız istekleri bu örneğe ekleyebilirsiniz. Başarısız isteği, .pushRequest() yöntemini çağırarak eklersiniz. Örneğin, Aşağıdaki kod, başarısız olan istekleri yakalar ve sıraya ekler:

import {Queue} from 'workbox-background-sync';

const queue = new Queue('myQueueName');

self.addEventListener('fetch', event => {
  // Add in your own criteria here to return early if this
  // isn't a request that should use background sync.
  if (event.request.method !== 'POST') {
    return;
  }

  const bgSyncLogic = async () => {
    try {
      const response = await fetch(event.request.clone());
      return response;
    } catch (error) {
      await queue.pushRequest({request: event.request});
      return error;
    }
  };

  event.respondWith(bgSyncLogic());
});

Sıraya eklendikten sonra, istek otomatik olarak yeniden denenir. hizmet çalışanı, sync etkinliğini alır (bu etkinlik, tarayıcı bağlantının yeniden kurulduğunu düşünüyor). Şunu desteklemeyen tarayıcılar: BackgroundSync API, hizmet çalışanı her çalıştığında sırayı yeniden dener. yardımcı olabilir. Bu, hizmet çalışanını kontrol eden sayfanın o yüzden o kadar etkili olmayacaktır.

Çalışma Kutusu Arka Plan Senkronizasyonunu Test Etme

Ne yazık ki, Arka Plan Sync'i test etmek biraz pratiksiz ve zor. çeşitli nedenlerle kullanır.

Uygulamanızı test etmek için en iyi yaklaşım aşağıdakileri yapmaktır:

  1. Bir sayfa yükleyin ve hizmet çalışanınızı kaydedin.
  2. Bilgisayarınızın ağını veya web sunucunuzu kapatın.
    • CHROME DEVTOOLS'U ÇEVRİMDIŞI KULLANMAYIN. Çevrimdışı onay kutusu Geliştirici Araçları yalnızca sayfadaki istekleri etkiler. Hizmet çalışanı istekleri devam eder.
  3. Çalışma Kutusu Arka Plan Senkronizasyonu ile sıraya eklenmesi gereken ağ isteklerinde bulunun.
    • İsteklerin sıraya alınıp alınmadığını incelemek için Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests.
  4. Şimdi ağınızı veya web sunucunuzu etkinleştirin.
  5. Şu adrese giderek erken sync etkinliklerini zorunlu kılın Chrome DevTools > Application > Service Workers, <your queue name> olması gereken yerde workbox-background-sync:<your queue name> sıra adını tıklayın ve daha sonra 'Senkronize Et'i tıklayarak düğmesini tıklayın.

    Chrome Geliştirici Araçları&#39;ndaki Senkronize Et düğmesi örneği

  6. Ağ isteklerinin başarısız isteklerle işlendiğini ve İstekler sonlandırıldığı için IndexedDB verileri artık boş başarıyla tekrar oynatıldı.

Türler

BackgroundSyncPlugin

fetchDidFail yaşam döngüsü geri çağırmasını uygulayan bir sınıf. Bu da, başarısız istekleri arka plan senkronizasyon sırasına eklemek artık daha kolay.

Özellikler

Queue

Başarısız isteklerin IndexedDB'de depolanmasını ve yeniden denenmesini sağlayan bir sınıf daha sonra. Depolama ve tekrar oynatma işleminin tüm bölümleri daha fazla bilgi edindiniz.

Özellikler

  • oluşturucu

    geçersiz

    Verilen seçeneklerle bir Queue örneği oluşturur

    constructor işlevi aşağıdaki gibi görünür:

    (name: string, options?: QueueOptions) => {...}

    • ad

      dize

      Bu sıranın benzersiz adı. Bu ad şöyle olmalıdır: Senkronizasyon etkinliklerini ve mağaza isteklerini kaydetmek için kullanıldığı için benzersizdir. bu örneğe özel IndexedDB'dir. Şu durumda hata verilir: yinelenen bir ad algılandı.

    • seçenekler

      QueueOptions isteğe bağlı

  • ad

    dize

  • getAll

    geçersiz

    maxRetentionTime başına, süresi dolmamış tüm girişleri döndürür. Süresi dolan tüm girişler sıradan kaldırılır.

    getAll işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueEntry[]&gt;

  • popRequest

    geçersiz

    Sıradaki son isteği ( zaman damgası ve meta veriler) kullanabilirsiniz. Döndürülen nesne şu şekilde olur: {request, timestamp, metadata}

    popRequest işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueEntry&gt;

  • pushRequest

    geçersiz

    İletilen isteği IndexedDB'de depolar (zaman damgası ve meta verileri) ekleyin.

    pushRequest işlevi aşağıdaki gibi görünür:

    (entry: QueueEntry) => {...}

    • giriş

      QueueEntry

    • returns

      Taahhüt<void>

  • registerSync

    geçersiz

    Bu örneğe özgü bir etiketle bir senkronizasyon etkinliği kaydeder.

    registerSync işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Taahhüt<void>

  • replayRequests

    geçersiz

    Sıradaki her isteği döngüye alır ve isteği yeniden getirmeye çalışır. Herhangi bir istek yeniden getirilemezse, söz konusu istek sıra (bir sonraki senkronizasyon etkinliği için yeniden deneme kaydeder).

    replayRequests işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Taahhüt<void>

  • shiftRequest

    geçersiz

    Sıradaki ilk isteği ( zaman damgası ve meta veriler) kullanabilirsiniz. Döndürülen nesne şu şekilde olur: {request, timestamp, metadata}

    shiftRequest işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueEntry&gt;

  • beden

    geçersiz

    Sırada bulunan girişlerin sayısını döndürür. Süresi dolan girişlerin de (maxRetentionTime başına) bu sayıya dahil edildiğini unutmayın.

    size işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;number&gt;

  • unshiftRequest

    geçersiz

    İletilen isteği IndexedDB'de depolar (zaman damgası ve meta verileri) ekleyin.

    unshiftRequest işlevi aşağıdaki gibi görünür:

    (entry: QueueEntry) => {...}

    • giriş

      QueueEntry

    • returns

      Taahhüt<void>

QueueOptions

Özellikler

  • forceSyncFallback

    boole isteğe bağlı

  • maxRetentionTime

    sayı isteğe bağlı

  • onSync

    OnSyncCallback isteğe bağlı

QueueStore

IndexedDB'deki bir Sıradan gelen depolama isteklerini yöneten sınıf. daha kolay erişim için sıra adına göre dizine eklendi.

Çoğu geliştiricinin bu sınıfa doğrudan erişmesi gerekmez; ileri düzey kullanım alanları için gösterilir.

Özellikler

  • oluşturucu

    geçersiz

    Bu örneği bir Queue örneğiyle ilişkilendirir. Bu sayede, eklenen girişler sıra adlarıyla tanımlanır.

    constructor işlevi aşağıdaki gibi görünür:

    (queueName: string) => {...}

    • queueName

      dize

  • deleteEntry

    geçersiz

    Belirli bir kimlikle ilgili girişi siler.

    UYARI: Bu yöntem, silinen girişin sıra (queueName ile eşleşir). Ancak bu sınırlama, çünkü bu sınıf herkese açık değil. Ek bir kontrol, bu yöntemin gerekenden daha yavaş olması gerekir.

    deleteEntry işlevi aşağıdaki gibi görünür:

    (id: number) => {...}

    • id

      sayı

    • returns

      Taahhüt<void>

  • getAll

    geçersiz

    Mağazada queueName ile eşleşen tüm girişleri döndürür.

    getAll işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry[]&gt;

  • popEntry

    geçersiz

    Sıradaki queueName ile eşleşen son girişi kaldırır ve döndürür.

    popEntry işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry&gt;

  • pushEntry

    geçersiz

    Kuyruğun en sonuna bir giriş ekleyin.

    pushEntry işlevi aşağıdaki gibi görünür:

    (entry: UnidentifiedQueueStoreEntry) => {...}

    • giriş

      UnidentifiedQueueStoreEntry

    • returns

      Taahhüt<void>

  • shiftEntry

    geçersiz

    Sıradaki, queueName ile eşleşen ilk girişi kaldırır ve döndürür.

    shiftEntry işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry&gt;

  • beden

    geçersiz

    Mağazadaki queueName ile eşleşen giriş sayısını döndürür.

    size işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;number&gt;

  • unshiftEntry

    geçersiz

    Sıradakinin başına bir giriş ekleyin.

    unshiftEntry işlevi aşağıdaki gibi görünür:

    (entry: UnidentifiedQueueStoreEntry) => {...}

    • giriş

      UnidentifiedQueueStoreEntry

    • returns

      Taahhüt<void>

StorableRequest

İsteklerin seri durumdan çıkarılmasını ve seri durumdan çıkarılmasını kolaylaştıran bir sınıf IndexedDB'de depolanabilir.

Çoğu geliştiricinin bu sınıfa doğrudan erişmesi gerekmez; ileri düzey kullanım alanları için gösterilir.

Özellikler

  • oluşturucu

    geçersiz

    Oluşturmak için kullanılabilecek bir istek verisi nesnesini kabul eder Request ile aynıdır ancak IndexedDB'de de depolanabilir.

    constructor işlevi aşağıdaki gibi görünür:

    (requestData: RequestData) => {...}

    • requestData

      RequestData

      Aşağıdakini içeren istek verisi nesnesi url ve alakalı mülkler [requestInit]https://fetch.spec.whatwg.org/#requestinit.

  • clone

    geçersiz

    Örneğin derin bir klonunu oluşturur ve döndürür.

    clone işlevi aşağıdaki gibi görünür:

    () => {...}

  • toObject

    geçersiz

    Örnek _requestData nesnesinin derin klonunu döndürür.

    toObject işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      RequestData

  • toRequest

    geçersiz

    Bu örneği bir İstek'e dönüştürür.

    toRequest işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      İstek

  • fromRequest

    geçersiz

    İstek nesnesini, yapılandırılabilen düz bir nesneye dönüştürür klonlanmış veya JSON ile dizelenmiş.

    fromRequest işlevi aşağıdaki gibi görünür:

    (request: Request) => {...}

    • istek

      İstek