Как заставить PWA работать в автономном режиме
Опубликовано: 2020-01-10Оглавление
Вы, вероятно, знаете, что такое Progressive Web App — наряду с его функциями, меняющими отрасль, — но ради итерации давайте еще раз повторим удивительные, уникальные функции PWA, которые потенциально могут революционизировать работу в Интернете, а именно его автономные возможности . .
Рекомендуемая литература: что такое PWA?
В отличие от обычного Интернета, в котором просмотр контента возможен только при подключении, Progressive Web App отличается тем, что после того, как сервис-воркеры — встроенный механизм, отвечающий за многие прогрессивные функции PWA — загрузили необходимые файлы, офлайн-просмотр станет возможным, и пользователи смогут взаимодействовать с приложением даже в автономном режиме.
Прогрессивные веб-приложения и автономная доступность
Чтобы узнать, из-за чего вся эта суета с PWA — особенно с ее офлайн-возможностями, возможно, пришло время, чтобы вы сами испытали автономный просмотр нашего основного веб-сайта, который также является PWA по определению.
С прогрессивными веб-приложениями весь офлайн-опыт ничем не отличается от вашего обычного опыта с подключением — и в этом его прелесть. Эта функция особенно полезна для магазинов электронной коммерции, которым необходим непрерывный просмотр, даже если соединение отсутствует.
Примечания . Каждому сайту PWA требуется начальное кэширование основных ресурсов, прежде чем пользователю станет доступен просмотр в автономном режиме.
Как заставить PWA работать в автономном режиме
Было бы сложно вдаваться во все детали создания полнофункционального прогрессивного веб-приложения с поддержкой автономного режима, поэтому сегодня мы начнем с основ. Наша цель — создать базовое прогрессивное веб-приложение, которое работает в автономном режиме .
Предпосылки
- Простой веб-сайт/веб-приложение. Подойдет все, что имеет один
index.html
, одинindex.js
и одинstyle.css
.
После того, как у вас есть все необходимые условия, пришло время заставить ваш базовый PWA работать в автономном режиме!
Создание базового сервис-воркера
Прежде всего, вам нужно создать свой sw.js
, который содержит весь необходимый код для функционального работника службы.
// sw.js self.addEventListener ("выборка", событие => { console.log("Вы получили " + event.url); });
После того, как вы создали свой сервис-воркер, давайте проверим, поддерживает ли его ваш браузер, и сошлемся на него в вашем index.js
:
// index.js если ("serviceWorker" в навигаторе) { навигатор.serviceWorker .регистр("sw.js") .then(() => console.log("зарегистрированный сервис-воркер!")); } // остальной код вашей страницы...
Приведенный выше код должен быть достаточно простым. Он проверяет, поддерживает ли ваш браузер сервис-воркеров, и если да, возвращает « зарегистрированный сервис-воркер! ». Регистрируя сервис-воркеры, вы, по сути, говорите браузеру использовать sw.js
в качестве инструкций для ваших сервис-воркеров и, в свою очередь, связываете новых сервис-воркеров с вашим сайтом.
Теперь вернемся к sw.js
и добавим следующий код:
// sw.js self.addEventListener ("выборка", событие => { console.log("Вы получили " + event.url); });
Код добавляет EventListener
, необходимый для нашей дальнейшей работы. Фактически, многие браузеры, включая Chrome, не позволят установить PWA, если не зарегистрирован прослушиватель fetch
.
У addEventListener
в приведенном выше коде есть два аргумента: события, которые необходимо прослушать, и обратный вызов, который принимает объект события. Как только это событие произойдет, ваш сервисный работник начнет прослушивать события fetch
, которые включают запросы на HTML, CSS, JS вашего веб-сайта, аудио, изображения и любые другие запросы к API/другим веб-сайтам.

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

Чтобы кэшировать ресурсы вашей страницы, сначала вам нужно спланировать размер вашего кэш-хранилища, поскольку оно ограничено.
Лимит хранения кэша
Каждый браузер по-своему обрабатывает кэш-память. Однако почти все они имеют ограничение на размер кэш-хранилища — часто именно из-за этого ограничения вы не увидите больших и толстых сайтов, таких как Amazon, которые кэшируют весь свой магазин с помощью сервис-воркеров.
Теперь этот предел варьируется, поскольку он зависит от устройства конечного пользователя; но обычно это должно быть около 20% от максимального дискового пространства вашего пользователя. Для получения дополнительной информации вы можете обратиться к нашей таблице ниже или к официальному руководству Google по автономному хранилищу для прогрессивных веб-приложений.

Теперь, когда мы убрали этот лимит хранилища кэша, давайте перейдем к фактическому кэшированию ваших ресурсов .
Чтобы кэшировать ресурсы вашей страницы, нам нужен глобальный массив, содержащий все активы, которые мы хотим сохранить:
/* Это все, что мы хотим сохранить в кеше. Чтобы приложение работало в автономном режиме/было доступно для установки, мы должны сохранять не только изображения, но и наш HTML, JS и CSS а также - все, что мы хотим использовать в автономном режиме. */ константные АКТИВЫ = [ "https://i.imgur.com/Kbkqr2n.png", "https://i.imgur.com/lgLaG0x.png", "https://i.imgur.com/0iL8mxP.png", "https://i.imgur.com/KDsdYeS.png", "https://i.imgur.com/mK50fqL.png", "https://i.imgur.com/KYGH2Qa.png", "/style.css", "/index.html", "/offline.html", "/" ];
Здесь хранится все, что вы хотите использовать в автономном режиме. В приведенном выше примере первые несколько изображений — это пути к Imgur, где хранятся различные логотипы SimiCart.
На этом этапе наш список необходимых ресурсов для автономного использования готов. Кэшируем их с помощью сервис-воркеров.
Добавьте этот топ вверху вашего sw.js:
// sw.js пусть cache_name = "SimiCart"; // Строка, используемая для идентификации нашего кеша self.addEventListener ("установить", событие => { console.log("установка..."); событие.waitUntil( тайники .open(имя_кэша) .тогда(кэш => { вернуть cache.addAll (активы); }) .catch(ошибка => console.log(ошибка)) ); });
По сути, этот код указывает браузеру ожидать (используя waitUntil()
) нашего кэширования.
С помощью API кеша, в частности, addAll()
, наш массив активов может быть легко добавлен в кеш, готовый к обслуживанию сервисными работниками. Ну, если подумать, это не так уж и готово. Нам все еще нужно немного изменить наш обработчик событий fetch
.
Вот как это будет выглядеть сейчас:
self.addEventListener ("выборка", событие => { если (event.request.url === "https://www.simicart.com/") { // или любой другой адрес вашего приложения событие.ответить( fetch(event.request).catch(ошибка => self.cache.open(cache_name).then(cache => cache.match("/offline.html")) ) ); } еще { событие.ответить( fetch(event.request).catch(ошибка => caches.match(event.request).then(ответ => ответ) ) ); } });
Теперь в приведенном выше коде должно быть ясно, что мы пытаемся кэшировать ресурсы, даже когда приложение находится в автономном режиме. Логика следующая:
- Во-первых, приложение пытается получить ресурсы в сети и отвечает кэшированными ресурсами, если эта выборка не удалась (используя
respondWith()
). - Внутри
respondWith()
мы вызываемfetch(event.request)
, чтобы попытаться получить ресурсы из сети, и, поскольку выборка основана наPromise
,Promise
отклонится, если ему не удастся подключиться к сети, и, в свою очередь, вызоветcatch()
заявление. - В операторе
catch()
вы хотите вызвать свои кэшированные ресурсы.
Вот и все. Теперь ваш PWA должен работать в автономном режиме! Довольно легко, не так ли?
Вывод
В технологическом мире все развивается довольно быстро, и чем дольше вы откладываете переход на PWA или интегрируете жизненно важную функцию, такую как автономные возможности, в PWA, тем больше упущенная выгода для вас и вашего бизнеса.
Тем не менее, всегда есть легкодоступные поставщики решений, такие как SimiCart, которые могут позаботиться обо всех ваших потребностях. Если вы случайно являетесь онлайн-продавцом и ищете универсальное идеальное решение Magento PWA , вы попали по адресу. Мы являемся известным поставщиком решений для веб-сайтов электронной коммерции Magento с более чем 5-летним опытом работы с PWA и нативными приложениями.