Как я могу настроить Polymer's platinum-sw-*, чтобы НЕ кэшировать один URL-путь?

Как я могу настроить Polymer для платины-sw-cache или platinum-sw-fetch для кэширования всех URL-путей, кроме /_api, который является URL-адресом для API Hoodie? Я настроил элемент platinum-sw-fetch для обработки пути /_api, а затем platinum-sw-cache для обработки остальных путей следующим образом:

<platinum-sw-register auto-register
                      clients-claim
                      skip-waiting
                      on-service-worker-installed="displayInstalledToast">
  <platinum-sw-import-script href="custom-fetch-handler.js"></platinum-sw-import-script>
  <platinum-sw-fetch handler="HoodieAPIFetchHandler"
                 path="/_api(.*)"></platinum-sw-fetch>
  <platinum-sw-cache default-cache-strategy="networkFirst"
                     precache-file="precache.json"/>
  </platinum-sw-cache>
</platinum-sw-register>

custom-fetch-handler.js содержит следующее. Его цель - просто вернуть результаты запроса так, как это сделал бы браузер, если бы работник службы не обрабатывал запрос.

var HoodieAPIFetchHandler = function(request, values, options){
  return fetch(request);
}

Кажется, что не работает правильно, что после того, как пользователь 1 вошел в систему, затем вышел из системы, затем пользователь 2 вошел в систему, а затем на вкладке "Сеть" в Chrome Dev Tools я вижу, что Hoodie регулярно продолжает делать запросы ОБА пользователям. Конечные точки API, такие как:

http://localhost:3000/_api/?hoodieId=uw9rl3p
http://localhost:3000/_api/?hoodieId=noaothq

Вместо этого он должен отправлять запросы только ОДНОЙ из этих конечных точек API. На вкладке "Сеть" каждый из этих URL-адресов появляется два раза подряд, а в столбце "Размер" первый запрос говорит "(из ServiceWorker)", а второй запрос указывает размер ответа в байтах, если это актуально.

Другая проблема, которая кажется связанной, заключается в том, что когда я вхожу в систему как пользователь 2 и отправляю форму, приложение записывает данные в базу данных пользователя 1 на стороне сервера. Это заставляет меня думать, что проблема в том, что приложение не может обойти кеш для маршрута / _api.

Разве я не должен был использовать платину-sw-cache и платину-sw-fetch в одном элементе platinum-sw-register, поскольку в документации указано, что они являются альтернативами друг другу?

1 ответ

Решение

В общем, то, что вы делаете, должно работать, и это законный подход.

Если есть HTTP-запрос, который соответствует пути, определенному в <platinum-sw-fetch>затем будет использован этот пользовательский обработчик и обработчик по умолчанию (в данном случае networkFirst реализация) не будет работать. На HTTP-запрос можно ответить только один раз, поэтому нет никакой вероятности, что несколько обработчиков вступят в силу.

Я проверил несколько местных образцов и подтвердил, что мой <platinum-sw-fetch> Обработчик правильно перехватывал запросы. При локальной отладке полезно добавить console.log() в вашем пользовательском обработчике и проверьте эти журналы через chrome://serviceworker-internals Проверьте интерфейс или используйте тот же интерфейс для установки некоторых точек останова в вашем обработчике.

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

Поэтому я бы порекомендовал подробнее изучить причину, по которой ваше приложение делает несколько запросов. Всегда сложно думать о кэшировании персонализированных ресурсов, и есть несколько способов, с помощью которых вы можете столкнуться с проблемами, если в конечном итоге вы кэшируете ресурсы, персонализированные для другого пользователя. Посмотрите на строку кода, которая запускает второй /_api/ запросите и посмотрите, поступает ли он из кэшированного ресурса, который необходимо очистить, когда ваши пользователи выходят из системы. <platinum-sw> использует sw-toolbox библиотека под капотом, и вы можете использовать его uncache() метод непосредственно в ваших пользовательских скриптах обработчика для выполнения обслуживания кеша.

Другие вопросы по тегам