У меня есть PWA, у которого есть manifest.json
с start_url
.
У меня есть работник службы с событием fetch
, который кэширует только определенные запросы.
Это делается в сервисе работника путем переопределения ответа на прокси из кэша (для ясности TypeScript):
self.addEventListener('fetch', (event: FetchEvent) => {
// This MUST be synchronous until respondWith is called
const cache = isCachable(event.request);
if (!isCachable)
return; // Don't proxy, let the network request continue
// Kick off a promise to check the cache, and clone/cache the response otherwise
const proxy: Promise<Response> = cacheResponse(event);
event.respondWith(proxy);
}
Я хочу кешировать start_url
, что означает, что isCachable
выше должен быть в состоянии сказать, что значение start_url
является относительным запрашиваемым маршрутом.
Я могу загрузить manifest.json
в ПО, но это кажется неуклюжим. Я могу жестко запрограммировать значения в SW, но затем мне нужно обновить два места, если конфигурация изменится.
В обработчике fetch
event.request.url
является абсолютным, но start_url
относительно manifest.json
- так, например, я мог бы иметь:
manifest.json
: { "start_url": "appshell" ... }
- Веб-сайт развертывается на
www.example.com/folder/
(но может быть развернут на sub.example.com
или www.example.com/a/b
или где-либо еще)
- Онлайн пользователь посещает сайт, либо посещает все, либо устанавливает кеш скриптов напрямую.
- Позже, тот же пользователь посещает в автономном режиме.
- Вызов выше стреляет с
event.request.url === 'www.example.com/folder/appshell'
- Мне нужна функция
isCachable
, чтобы сказать, что ресурс должен кэшироваться синхронно. Необходимо определить, что www.example.com/folder/appshell
равно appshell
(разрешить относительную ссылку) и что appshell
установлено как start_url
(прочитайте манифест).
Очевидно, что все это может быть жестко закодировано. Тем не менее, каждый PWA должен отвечать из кэша на start_url
, так что это не может быть новой проблемой. Прежде, чем я изобрету колесо, есть ли лучший способ или что-то, чего мне не хватает?
Итак ...
- Учитывая, что работникам службы нужен манифест, есть ли хороший способ получить конфигурацию манифеста в работнике?
- Есть ли способ разрешить относительную ссылку для сравнения с манифестом?