sincronización-en segundo plano-de-la-caja de trabajo

Cuando envías datos a un servidor web, a veces las solicitudes fallarán. Integra puede deberse a que el usuario perdió la conectividad el servidor está inactivo; en cualquier caso, con frecuencia, intentas enviar las solicitudes de nuevo más tarde.

La nueva API de BackgroundSync es una solución ideal a este problema. Cuando un service worker detecta que hay falló la solicitud de red, se puede registrar para recibir un evento sync, que se entrega cuando el navegador considera que se recuperó la conectividad. Ten en cuenta que el evento de sincronización puede publicarse incluso si el usuario salió del , lo que lo hace mucho más eficaz que el método tradicional de reintentar las solicitudes fallidas.

La sincronización en segundo plano de la caja de trabajo está diseñada para facilitar el uso de la BackgroundSync y, luego, integrar su uso con otros módulos de Workbox. Integra también implementa una estrategia de resguardo para los navegadores Sincronización en segundo plano.

Los navegadores compatibles con la API de BackgroundSync no podrán volver a reproducir el contenido de forma automática. solicitudes en tu nombre en una intervalo administrado por el navegador, probablemente con una retirada exponencial entre los intentos de repetición. En los navegadores que no es compatible de forma nativa con la API de BackgroundSync, la sincronización en segundo plano de Workbox automáticamente una repetición cada vez que se inicia tu service worker.

Uso básico

La forma más fácil de usar la sincronización en segundo plano es usar la Plugin que poner en cola automáticamente las solicitudes fallidas y volver a intentarlo cuando sync se activan los eventos correspondientes.

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 hooks en devolución de llamada del complemento fetchDidFail fetchDidFail solo se invoca si se arroja una excepción, probablemente debido a a una falla de red. Esto significa que las solicitudes no se reintentarán si hay respuesta recibida con un Estado de error 4xx o 5xx. Si deseas reintentar todas las solicitudes que generen, p.ej., un estado 5xx, puedes hacerlo agregar un complemento fetchDidSucceed a tu estrategia:

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.

Uso avanzado

La sincronización en segundo plano de la caja de trabajo también proporciona una clase Queue, que puedes crear instancias y agregarles solicitudes erróneas. Las solicitudes fallidas se almacenan en IndexedDB. y se vuelve a intentar cuando el navegador considera que se restableció la conectividad (es decir, cuando recibe el evento de sincronización).

Cómo crear una cola

Para crear una cola de sincronización en segundo plano de Workbox, debes crearla con un nombre de cola (que debe ser único para tu origen):

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

const queue = new Queue('myQueueName');

El nombre de la cola se usa como parte del nombre de la etiqueta que se register() por el SyncManager Es también se usa como el Object Store para la base de datos IndexedDB.

Agrega una solicitud a la cola

Una vez creada tu instancia de cola, puedes agregarle solicitudes con errores. Puedes invocar el método .pushRequest() para agregar solicitudes con errores. Por ejemplo: el siguiente código detecta todas las solicitudes que fallan y las agrega a la cola:

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());
});

Una vez agregada a la cola, la solicitud se reintenta automáticamente cuando service worker recibe el evento sync (que ocurre cuando el navegador considera que se restablece la conectividad). Los navegadores que no admiten la La API de BackgroundSync volverá a intentar la cola cada vez que se active iniciar. Esto requiere que la página que controla el service worker en ejecución, por lo que no será tan eficaz.

Prueba la sincronización en segundo plano de la caja de trabajo

Lamentablemente, probar BackgroundSync es algo poco intuitivo y difícil por varias razones.

El mejor enfoque para probar tu implementación es el siguiente:

  1. Carga una página y registra tu service worker.
  2. Desactiva la red de la computadora o el servidor web.
    • NO UTILICE LAS HERRAMIENTAS PARA PROGRAMADORES CHROME SIN CONEXIÓN. La casilla de verificación Sin conexión en Las Herramientas para desarrolladores solo afectan las solicitudes de la página. Solicitudes de service worker seguirán funcionando.
  3. Realiza solicitudes de red que deben estar en cola con la sincronización en segundo plano de la caja de trabajo.
    • Para verificar si las solicitudes se agregaron a la cola, consulta Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests
  4. Ahora, activa tu red o servidor web.
  5. Para forzar un evento anticipado de sync, accede a Chrome DevTools > Application > Service Workers, ingresando el nombre de la etiqueta de workbox-background-sync:<your queue name>, donde debe estar <your queue name> nombre de la cola que estableciste y, a continuación, haz clic en el botón .

    Ejemplo del botón de sincronización en las Herramientas para desarrolladores de Chrome

  6. Deberías ver que las solicitudes de red se procesan para las solicitudes con errores y los datos de IndexedDB deberían estar vacíos, ya que las solicitudes se se volvió a reproducir correctamente.

Tipos

BackgroundSyncPlugin

Una clase que implementa la devolución de llamada del ciclo de vida de fetchDidFail. Esto hace que es más fácil agregar solicitudes erróneas a una cola de sincronización en segundo plano.

Propiedades

Queue

Una clase para administrar el almacenamiento de solicitudes fallidas en IndexedDB y reintentarlas más adelante. Todas las partes del proceso de almacenamiento y repetición son observables a través de devoluciones de llamada.

Propiedades

  • constructor

    void

    Crea una instancia de una cola con las opciones determinadas.

    La función constructor se ve de la siguiente manera:

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

    • nombre

      string

      El nombre único de esta cola. Este nombre debe tener único, ya que se usa para registrar eventos de sincronización y almacenar solicitudes en IndexedDB específica para esta instancia. Se mostrará un error si si se detecta un nombre duplicado.

    • opciones

      QueueOptions opcional

  • nombre

    string

  • getAll

    void

    Muestra todas las entradas que no vencieron (según maxRetentionTime). Se quitan de la cola las entradas vencidas.

    La función getAll se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueEntry[]&gt;

  • popRequest

    void

    Quita y muestra la última solicitud de la cola (junto con su la marca de tiempo y los metadatos). El objeto que se muestra toma la siguiente forma: {request, timestamp, metadata}

    La función popRequest se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueEntry&gt;

  • pushRequest

    void

    Almacena la solicitud pasada en IndexedDB (con su marca de tiempo y cualquier metadatos) al final de la cola.

    La función pushRequest se ve de la siguiente manera:

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

    • entry.

      QueueEntry

    • muestra

      Promesa<void>

  • registerSync

    void

    Registra un evento de sincronización con una etiqueta única para esta instancia.

    La función registerSync se ve de la siguiente manera:

    () => {...}

    • muestra

      Promesa<void>

  • replayRequests

    void

    Repite cada solicitud en la cola y trata de recuperarla. Si cualquier solicitud no se puede volver a recuperar, se vuelve a colocar en la misma posición la cola (lo que registra un reintento para el siguiente evento de sincronización).

    La función replayRequests se ve de la siguiente manera:

    () => {...}

    • muestra

      Promesa<void>

  • shiftRequest

    void

    Quita y muestra la primera solicitud de la cola (junto con su la marca de tiempo y los metadatos). El objeto que se muestra toma la siguiente forma: {request, timestamp, metadata}

    La función shiftRequest se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueEntry&gt;

  • tamaño

    void

    Muestra la cantidad de entradas presentes en la cola. Ten en cuenta que las entradas vencidas (por maxRetentionTime) también se incluyen en este recuento.

    La función size se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;number&gt;

  • unshiftRequest

    void

    Almacena la solicitud pasada en IndexedDB (con su marca de tiempo y cualquier metadatos) al principio de la cola.

    La función unshiftRequest se ve de la siguiente manera:

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

    • entry.

      QueueEntry

    • muestra

      Promesa<void>

QueueOptions

Propiedades

  • forceSyncFallback

    booleano opcional

  • maxRetentionTime

    número opcional

  • onSync

    OnSyncCallback opcional

QueueStore

Una clase para administrar las solicitudes de almacenamiento de una cola en IndexedDB. por su nombre de cola para un acceso más fácil.

La mayoría de los desarrolladores no necesitarán acceder a esta clase directamente. se expone para casos de uso avanzados.

Propiedades

  • constructor

    void

    Asocia esta instancia con una instancia de cola, de modo que las entradas agregadas se pueden identificados por su nombre de cola.

    La función constructor se ve de la siguiente manera:

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

    • queueName

      string

  • deleteEntry

    void

    Borra la entrada del ID determinado.

    ADVERTENCIA: Este método no garantiza que la entrada eliminada pertenezca a esta (es decir, coincide con queueName). Pero esta limitación es aceptable ya que esta clase no está expuesta públicamente. Una comprobación adicional haría que este método sea más lento de lo necesario.

    La función deleteEntry se ve de la siguiente manera:

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

    • id

      número

    • muestra

      Promesa<void>

  • getAll

    void

    Muestra todas las entradas de la tienda que coincidan con queueName.

    La función getAll se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueStoreEntry[]&gt;

  • popEntry

    void

    Quita y muestra la última entrada de la cola que coincide con el queueName.

    La función popEntry se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueStoreEntry&gt;

  • pushEntry

    void

    Agrega una entrada en el último lugar de la cola.

    La función pushEntry se ve de la siguiente manera:

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

    • entry.

      UnidentifiedQueueStoreEntry

    • muestra

      Promesa<void>

  • shiftEntry

    void

    Quita y muestra la primera entrada de la cola que coincide con el queueName.

    La función shiftEntry se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;QueueStoreEntry&gt;

  • tamaño

    void

    Muestra la cantidad de entradas en la tienda que coinciden con queueName.

    La función size se ve de la siguiente manera:

    () => {...}

    • muestra

      Promise&lt;number&gt;

  • unshiftEntry

    void

    Antepón una entrada primero en la cola.

    La función unshiftEntry se ve de la siguiente manera:

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

    • entry.

      UnidentifiedQueueStoreEntry

    • muestra

      Promesa<void>

StorableRequest

Una clase para facilitar la serialización y deserialización de solicitudes para que puede almacenarse en IndexedDB.

La mayoría de los desarrolladores no necesitarán acceder a esta clase directamente. se expone para casos de uso avanzados.

Propiedades

  • constructor

    void

    Acepta un objeto de datos de solicitud que se puede usar para construir un Request, pero también se puede almacenar en IndexedDB.

    La función constructor se ve de la siguiente manera:

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

    • requestData

      RequestData

      Un objeto de datos de solicitud que incluye la url y las propiedades relevantes de [requestInit]https://fetch.spec.whatwg.org/#requestinit

  • clone

    void

    Crea y muestra una clonación profunda de la instancia.

    La función clone se ve de la siguiente manera:

    () => {...}

  • toObject

    void

    Muestra una clonación directa del objeto _requestData de las instancias.

    La función toObject se ve de la siguiente manera:

    () => {...}

    • muestra

      RequestData

  • toRequest

    void

    Convierte esta instancia en una solicitud.

    La función toRequest se ve de la siguiente manera:

    () => {...}

    • muestra

      Solicitud

  • fromRequest

    void

    Convierte un objeto Request en un objeto sin formato que se puede estructurar. se clona o se convierte en cadenas JSON.

    La función fromRequest se ve de la siguiente manera:

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

    • request

      Solicitud