Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Андрей Михайлов (2ГИС) — Service Workers. Стратегии применения

CodeFest
April 05, 2018

CodeFest 2018. Андрей Михайлов (2ГИС) — Service Workers. Стратегии применения

Посмотрите выступление Андрея: https://2018.codefest.ru/lecture/1280/

Количество выходов в интернет с мобильных устройств ежегодно растёт на 2-4% в год. Качество связи не успевает за такими темпами. Как итог, даже самое лучшее веб-приложение обеспечит ужасный опыт, если пользователь не сможет его загрузить. Проблема в том, что до сих пор нет хорошего механизма управления кэшем ресурсов и результатов сетевых запросов.

CodeFest

April 05, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. → пять лет в IT → три года в Backend-разработке

    → уже два года, как фронтенд-разработчик О себе
  2. → пять лет в IT → три года в Backend-разработке

    → уже два года, как фронтенд-разработчик → год в 2гис О себе
  3. PWA

  4. Service Worker → Проксирование запросов → Работа с кэшем →

    Пуш-уведомления → Фоновая синхронизация
  5. Service Worker → Проксирование запросов → Работа с кэшем →

    Пуш-уведомления → Фоновая синхронизация → Офлайн
  6. It’s Coding Time // Проверяем поддержку SW в браузере if

    ('serviceWorker' in navigator) { // Регистрируем, если есть поддержка navigator.serviceWorker.register('/sw.js') .then(function () { // SW установлен }) .catch(function () { // ¯\_(ツ)_/¯ }) }
  7. Что внутри sw.js self.addEventListener('install', event => { console.log('install', event); });

    self.addEventListener('activate', event => { console.log('activate', event); }); self.addEventListener('fetch', event => { console.log('fetch', event); });
  8. Пример sw.js self.addEventListener('install', event => { // Код будет работать

    ниже до тех пор, пока не вернётся Promise. event.waitUntil( caches.open('static-assets-' + VERSION) // Добавляем в кэш ресурсы, которые надо закэшировать в начале .then(cache => cache.addAll(baseAssetsList)) // Переходим к стадии активации. .then(() => self.skipWaiting()); ); });
  9. Пример sw.js self.addEventListener('activate', event => { // Активируем SW в

    контексте страницы и сразу включаем его. event.waitUntil(self.clients.claim()); });
  10. Пример sw.js self.addEventListener('fetch', event => { // Прерываем стандартный fetch

    event.respondWith( // Ищем запрос в нашем кэше... caches.match(event.request).then((response) => { // Если он есть - отдаем, иначе - запускаем fetch. return response || fetch(event.request); }); ); });
  11. → preferer cache → cache only → offline only →

    network only → race/fastest cache
  12. Фоновая синхронизация this.addEventListener('someEvent', () => { navigator.serviceWorker.ready .then(reg => {

    // Успех! reg.sync.register('getTopNews'); }) .catch(e => { // ¯\_(ツ)_/¯ }); });
  13. Фоновая синхронизация this.addEventListener('sync', event => { switch(event.tag) { case 'getImage':

    getImage(); break; case 'getTopNews': getTopNews(); break; default: // nothing } })
  14. Фоновая синхронизация function getTopNews() { // Код будет работать ниже

    до тех пор, пока не вернётся Promise. event.waitUntil(() = > { // some Code }); }
  15. Push-уведомления Bloomberg сообщил о... https://meduza.io/news/2018 Что-то не так с профилем!

    https://2018.codefest.ru/members/ Упрощаем работу с npm https://tproger.ru/translations/npm-tricks/
  16. Push-уведомления New Match! Let’s check it! https://tinder.com/newMatch Bloomberg сообщил о...

    https://meduza.io/news/2018 Что-то не так с профилем! https://2018.codefest.ru/members/ Упрощаем работу с npm https://tproger.ru/translations/npm-tricks/
  17. Push-уведомления New Match! Let’s check it! https://tinder.com/newMatch Bloomberg сообщил о...

    https://meduza.io/news/2018 Что-то не так с профилем! https://2018.codefest.ru/members/ Упрощаем работу с npm https://tproger.ru/translations/npm-tricks/ У вас 23 непрочитанных твита https://twitter.com/
  18. Офлайн по умолчанию Установка через App Store Offline-first по умолчанию

    Доступность через Интернет Web app + SW Native app
  19. Request sent Waiting (TTFB) Content Download 2.05 s 0.17 ms

    2.95 s Service Worker уменьшает TTFB
  20. «Effectively, we can skip compiling from scratch and execute app

    code much sooner. This means users can interact with your UI sooner than they otherwise would have if you were strictly relying on HTTP caching.» Addy Osmani