Обычно всякий раз, когда я читаю сообщение в блоге о PWA, учебное пособие, кажется, просто предварительно кеширует каждый отдельный ресурс. Но это, кажется, идет вразрез с шаблоном оболочки приложения, который, как я понимаю, заключается в следующем: кешируйте все необходимое (только оболочка приложения) и кеш-память во время работы. (Пожалуйста, исправьте меня, если я понял это неправильно)
Представьте, что у меня есть это одностраничное приложение, это простой index.html с веб-компонентом: <my-app>
. Этот компонент <my-app>
устанавливает некоторые маршруты, которые выглядят примерно так: я использую маршрутизатор Vaadin и веб-компоненты, но я думаю, что проблема будет та же, если использовать React с React Router или что-то подобное.
router.setRoutes([
{
path: '/',
component: 'app-main', // statically loaded
},
{
path: '/posts',
component: 'app-posts',
action: () => { import('./app-posts.js');} // dynamically loaded
},
/* many, many, many more routes */
{
path: '/offline', // redirect here when a resource is not cached and failed to get from network
component: 'app-offline', // also statically loaded
}
]);
Мое приложение может иметь множество маршрутов и может стать очень большим. Я не хочу сразу кешировать все эти ресурсы, а только кеширую то, что мне абсолютно необходимо, поэтому в этом случае: мои index.html
, my-app.js
, app-main.js
и app-offline.js
. Я хочу кэшировать app-posts.js
во время выполнения, когда это требуется.
Настройка кэширования во время выполнения достаточно проста, но моя проблема возникает, когда мой пользователь посещает один из потенциально многих маршрутов, которые еще не кэшированы (потому чтовозможно, пользователь ранее не посещал этот маршрут, поэтому файл js
, возможно, еще не загружен / не кэширован), и у пользователя нет подключения к Интернету.
Что я хочу, чтобы произошло в этом случае (когда маршрут еще не кэширован и сети нет), пользователь перенаправляется на маршрут /offline
, который обрабатывается моим клиентским маршрутизатором. Я мог бы легко сделать что-то вроде: import('./app-posts.js').catch(() => /* redirect user to /offline */)
, но мне интересно, есть ли способ добиться этого с самого рабочего ящика.
Итак, в двух словах: когда файл js
не был кэшированпока, и у пользователя нет сети, и поэтому запрос файла не выполняется: пусть рабочий ящик перенаправляет страницу на маршрут /offline
.