Pwa — Это Просто. Привет Хабр

Продолжаем знакомство с Progressive Web Applications. После теоретического Последняя часть пора переходить к практике.

Сегодня мы построим простой, но полноценный PWA «Привет Хабр».



PWA — это просто.
</p><p>
 Привет Хабр

Приложение доступно по адресу https://altrusl.github.io/habr-pwa/hello-habr/ .

При открытии в браузере на мобильном устройстве вы можете добавить ярлык на главный экран и запускать его в полноэкранном режиме.

Если кто-то захочет опробовать рассматриваемый пример на своем компьютере, то Chrome позволяет локально работать с простыми PWA-приложениями без установки сторонних веб-серверов с SSL-сертификатами.

Инструкция по запуску «Привет Хабр» локально Необходимо установить из Интернет-магазина Chrome. этот или аналогичное расширение, являющееся локальным веб-сервером.

Без поддержки PHP, конечно.



PWA — это просто.
</p><p>
 Привет Хабр

Файлы «Привет Хабр» можно взять с GitHub — https://github.com/altrusl/habr-pwa/tree/master/hello-habr Поместите все в один каталог и укажите его на веб-сервере.

«Привет Хабр» состоит из одной страницы.

Он показывает картинку (логотип) и анимированную надпись на ней.

Код «Привет Хабр»



index.html

  
  
  
  
  
   

<html> <head> <title>Hello Habr</title> <script src="hh.js"></script> <link rel="stylesheet" href="hh.css" /> <script type="text/javascript"> if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .

then(function(registration) { console.log('Registration successful, scope is:', registration.scope); }) .

catch(function(error) { console.log('Service worker registration failed, error:', error); }); } </script> </head> <body> <div class="center"> <p id="text"></p> </div> <div id="logo"></div> </body> </html>



хч.

css



@font-face { font-family: Zaplyv-Heavy; src: url(Zaplyv-Heavy.otf); } body { display: flex; align-items: center; align-content: center; justify-content: center; overflow: auto; } .

center { font-family: Zaplyv-Heavy; font-size: 8vmax; } #logo { background-image: url(logo.jpg); background-size: 100%; width: 100px; height: 100px; position: absolute; top: 0; right: 0; margin: 10px; }



hh.js



window.onload = function() { fetch("hh.txtЭmode=nocache").

then(data => data.text()).

then(data => { animateText(data) }); } function animateText(data) { var ele = document.getElementById("text"), txt = data.split(""); var interval = setInterval(function(){ if(!txt[0]){ return clearInterval(interval); }; ele.innerHTML += txt.shift(); }, 150); }



хч.

txt



Hello Hubr

Также имеется собственный шрифт. Итого – минимальный полный набор ресурсов для среднестатистического сайта.

Если вы откроете index.html в браузере, отобразятся изображение и подпись.

Надпись загружается javascript через выборку из файла hh.txt — простейшая модель общего PWA-приложения.

Если открыть его без sw.js, это будет обычный сайт. Давайте добавим Service Worker в наши файлы.

sw.js

// Caches var CURRENT_CACHES = { font: 'font-cache-v1', css:'css-cache-v1', js:'js-cache-v1', site: 'site-cache-v1', image: 'image-cache-v1' }; self.addEventListener('install', (event) => { self.skipWaiting(); console.log('Service Worker has been installed'); }); self.addEventListener('activate', (event) => { var expectedCacheNames = Object.keys(CURRENT_CACHES).

map(function(key) { return CURRENT_CACHES[key]; }); // Delete out of date caches event.waitUntil( caches.keys().

then(function(cacheNames) { return Promise.all( cacheNames.map(function(cacheName) { if (expectedCacheNames.indexOf(cacheName) == -1) { console.log('Deleting out of date cache:', cacheName); return caches.delete(cacheName); } }) ); }) ); console.log('Service Worker has been activated'); }); self.addEventListener('fetch', function(event) { console.log('Fetching:', event.request.url); event.respondWith(async function() { const cachedResponse = await caches.match(event.request); if (cachedResponse) { console.log("\tCached version found: " + event.request.url); return cachedResponse; } else { console.log("\tGetting from the Internet:" + event.request.url); return await fetchAndCache(event.request); } }()); }); function fetchAndCache(request) { return fetch(request) .

then(function(response) { // Check if we received a valid response if (!response.ok) { return response; // throw Error(response.statusText); } var url = new URL(request.url); if (response.status < 400 && response.type === 'basic' && url.search.indexOf("mode=nocache") == -1 ) { var cur_cache; if (response.headers.get('content-type') && response.headers.get('content-type').

indexOf("application/javascript") >= 0) { cur_cache = CURRENT_CACHES.js; } else if (response.headers.get('content-type') && response.headers.get('content-type').

indexOf("text/css") >= 0) { cur_cache = CURRENT_CACHES.css; } else if (response.headers.get('content-type') && response.headers.get('content-type').

indexOf("font") >= 0) { cur_cache = CURRENT_CACHES.font; } else if (response.headers.get('content-type') && response.headers.get('content-type').

indexOf("image") >= 0) { cur_cache = CURRENT_CACHES.image; } else if (response.headers.get('content-type') && response.headers.get('content-type').

indexOf("text") >= 0) { cur_cache = CURRENT_CACHES.site; } if (cur_cache) { console.log('\tCaching the response to', request.url); return caches.open(cur_cache).

then(function(cache) { cache.put(request, response.clone()); return response; }); } } return response; }) .

catch(function(error) { console.log('Request failed for: ' + request.url, error); throw error; }); }

Как видите, мы создаем пять кэшей для каждого типа ресурсов.

Кэш сайта - для html файлов.

Все ресурсы кэшируются, за исключением тех, у которых GET-запрос содержит «mode=nocache» — а это запрос к файлу hh.txt со строкой для надписи.

Иногда можно увидеть, что ресурс берется из кэша диска.

Это распространенная проблема при разработке приложений с помощью Service Workers, поэтому лучше отключить дисковый кеш (кеш браузера).

И не в вашем браузере, а на сервере — например, в .

htaccess

# Cache-Control Headers <ifModule mod_headers.c> <FilesMatch (\.

css|\.

js|sprites\.

png)$>

Теги: #JavaScript #pwa #serviceworker #прогрессивные веб-приложения #Разработка веб-сайтов #JavaScript #Оптимизация клиента #Разработка мобильных приложений #дизайн и рефакторинг
Вместе с данным постом часто просматривают: