кэшируемый-ответ рабочего ящика

При кэшировании ресурсов во время выполнения не существует единого правила, определяющего, является ли данный ответ «действительным» и может ли он быть сохранен и повторно использован.

Модуль workbox-cacheable-response предоставляет стандартный способ определения того, следует ли кэшировать ответ, на основе его числового кода состояния , наличия заголовка с определенным значением или их комбинации.

Кэширование на основе кодов состояния

Вы можете настроить стратегию Workbox так, чтобы набор кодов состояния рассматривался как подходящий для кэширования, добавив экземпляр CacheableResponsePlugin в параметр plugins стратегии:

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';

registerRoute(
  ({url}) =>
    url.origin === 'https://third-party.example.com' &&
    url.pathname.startsWith('/images/'),
  new CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new CacheableResponsePlugin({
        statuses: [0, 200],
      }),
    ],
  })
);

Эта конфигурация сообщает Workbox, что при обработке ответов на запросы к https://third-party.example.com/images/ кэшировать все запросы с кодом состояния 0 или 200 .

Кэширование на основе заголовков

Вы можете настроить стратегию Workbox для проверки наличия определенных значений заголовков в качестве критериев для добавления в кеш, установив объект headers при создании плагина:

import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';

registerRoute(
  ({url}) => url.pathname.startsWith('/path/to/api/'),
  new StaleWhileRevalidate({
    cacheName: 'api-cache',
    plugins: [
      new CacheableResponsePlugin({
        headers: {
          'X-Is-Cacheable': 'true',
        },
      }),
    ],
  })
);

При обработке ответов на URL-адреса запроса, содержащие /path/to/api/ , обратите внимание на заголовок с именем X-Is-Cacheable (который будет добавлен к ответу сервером). Если этот заголовок присутствует и для него установлено значение «истина», то ответ можно кэшировать.

Если указано несколько заголовков, то только один из заголовков должен соответствовать связанным значениям.

Кэширование на основе заголовков и кодов состояния

Вы можете комбинировать статус и конфигурацию заголовка. Оба условия должны быть выполнены, чтобы ответ считался кэшируемым; другими словами, ответ должен иметь один из настроенных кодов состояния и хотя бы один из предоставленных заголовков.

import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';

registerRoute(
  ({url}) => url.pathname.startsWith('/path/to/api/'),
  new StaleWhileRevalidate({
    cacheName: 'api-cache',
    plugins: [
      new CacheableResponsePlugin({
        statuses: [200, 404],
        headers: {
          'X-Is-Cacheable': 'true',
        },
      }),
    ],
  })
);

Каковы значения по умолчанию?

Если вы используете одну из встроенных стратегий Workbox без явной настройки cacheableResponse.CacheableResponsePlugin , для определения того, следует ли кэшировать ответ, полученный из сети, используются следующие критерии по умолчанию:

  • staleWhileRevalidate и networkFirst: ответы со статусом 0 (т. е. непрозрачные ответы ) или 200 считаются кэшируемыми.
  • cacheFirst: ответы со статусом 200 считаются кэшируемыми.

По умолчанию заголовки ответов не используются для определения возможности кэширования.

Почему существуют разные значения по умолчанию?

Значения по умолчанию различаются в зависимости от того, будут ли кэшироваться ответы со статусом 0 (т. е. непрозрачные ответы ). Из-за того, что непрозрачные ответы представляют собой «черный ящик», работник службы не может узнать, является ли ответ действительным или отражает ли он ответ об ошибке, возвращенный с сервера перекрестного происхождения.

Для стратегий, которые включают в себя некоторые средства обновления кэшированного ответа, такие как staleWhileRevalidate и networkFirst, риск кэширования ответа о временной ошибке снижается за счет того, что при следующем обновлении кэша, мы надеемся, будет использован правильный успешный ответ.

Для стратегий, которые включают кэширование первого полученного ответа и повторное использование этого кэшированного ответа на неопределенный срок, последствия кэширования и повторного использования временной ошибки являются более серьезными. Чтобы перестраховаться, по умолчанию, cacheFirst откажется сохранять ответ, если у него нет кода состояния 200 .

Расширенное использование

Если вы хотите использовать ту же логику кэширования вне стратегии Workbox, вы можете напрямую использовать класс CacheableResponse .

import {CacheableResponse} from 'workbox-cacheable-response';

const cacheable = new CacheableResponse({
  statuses: [0, 200],
  headers: {
    'X-Is-Cacheable': 'true',
  },
});

const response = await fetch('/path/to/api');

if (cacheable.isResponseCacheable(response)) {
  const cache = await caches.open('api-cache');
  cache.put(response.url, response);
} else {
  // Do something when the response can't be cached.
}

Типы

CacheableResponse

Этот класс позволяет вам устанавливать правила, определяющие, какие коды состояния и/или заголовки должны присутствовать, чтобы Response считался кэшируемым.

Характеристики

  • конструктор

    пустота

    Чтобы создать новый экземпляр CacheableResponse, вы должны указать хотя бы одно из свойств config .

    Если указаны и statuses , и headers , то оба условия должны быть выполнены, чтобы Response считался кэшируемым.

    Функция constructor выглядит так:

    (config?: CacheableResponseOptions) => {...}

  • isResponseCacheable

    пустота

    Проверяет ответ, чтобы определить, кэшируется он или нет, в зависимости от конфигурации этого объекта.

    Функция isResponseCacheable выглядит так:

    (response: Response) => {...}

    • ответ

      Ответ

      Ответ, кэшируемость которого проверяется.

    • возвращает

      логическое значение

      true если Response кэшируется, и false в противном случае.

CacheableResponseOptions

Характеристики

  • заголовки

    объект необязательный

  • статусы

    номер[] необязательно

CacheableResponsePlugin

Класс, реализующий обратный вызов жизненного цикла cacheWillUpdate . Это упрощает добавление проверок кэшируемости к запросам, сделанным с помощью встроенных стратегий Workbox.

Характеристики

  • конструктор

    пустота

    Чтобы создать новый экземпляр CacheableResponsePlugin, вы должны указать хотя бы одно из свойств config .

    Если указаны и statuses , и headers , то оба условия должны быть выполнены, чтобы Response считался кэшируемым.

    Функция constructor выглядит так:

    (config: CacheableResponseOptions) => {...}