Прогрессивные веб-приложения: переход в автономный режим

1. Добро пожаловать

В этой лабораторной работе вы возьмете существующее веб-приложение и настроите его на работу в автономном режиме. Это первая из серии дополнительных лабораторных работ к семинару по прогрессивным веб-приложениям . В этой серии еще семь лабораторных работ.

Что вы узнаете

  • Напишите от руки "Работник сферы услуг"
  • Добавьте Service Worker в существующее веб-приложение.
  • Используйте Service Worker и API кэширования, чтобы сделать ресурсы доступными в автономном режиме.

Что вам следует знать

  • Основы HTML и JavaScript

Что вам понадобится

2. Настройка

Для начала клонируйте или скачайте исходный код, необходимый для выполнения этого практического задания:

Если вы клонируете репозиторий, убедитесь, что вы находитесь в starter ветке. В zip-архиве также содержится код для этой ветки.

Для работы этого кода требуется Node.js версии 14 или выше. После загрузки кода запустите команду npm ci из командной строки в папке с кодом, чтобы установить все необходимые зависимости. Затем запустите npm start , чтобы запустить сервер разработки для этого проекта.

В файле README.md исходного кода содержится пояснение ко всем распространяемым файлам. Кроме того, в ходе этой практической работы вы будете работать со следующими ключевыми существующими файлами:

Ключевые файлы

  • js/main.js - Основной JavaScript-файл приложения
  • service-worker.js — файл сервис-воркера приложения

3. Тестирование в автономном режиме

Прежде чем вносить какие-либо изменения, давайте проверим, не работает ли веб-приложение в автономном режиме. Для этого либо отключите компьютер от сети и перезагрузите веб-приложение, либо, если вы используете Chrome:

  1. Откройте инструменты разработчика Chrome.
  2. Перейдите на вкладку «Приложение».
  3. Перейти в раздел «Работники сферы услуг»
  4. Установите флажок «Офлайн».
  5. Обновите страницу, не закрывая инструменты разработчика Chrome.

Вкладка «Приложения» в инструментах разработчика Chrome открыта для Service Workers, и установлен флажок «Автономный режим».

После тестирования сайта и подтверждения отсутствия загрузки в офлайн-режиме, пришло время добавить онлайн-функциональность! Снимите флажок «Офлайн» и перейдите к следующему шагу.

4. Переведите это в офлайн-режим.

Пришло время добавить базовый сервис-воркер! Это произойдет в два этапа: регистрация сервис-воркера и кэширование ресурсов.

Зарегистрируйте работника сферы услуг

Уже существует пустой файл сервис-воркера, поэтому, чтобы изменения отобразились, давайте зарегистрируем его в нашем приложении. Для этого добавьте следующий код в начало файла js/main.js :

// Register the service worker
if ('serviceWorker' in navigator) {
  // Wait for the 'load' event to not block other work
  window.addEventListener('load', async () => {
    // Try to register the service worker.
    try {
      // Capture the registration for later use, if needed
      let reg;

      // Use ES Module version of our Service Worker in development
      if (import.meta.env?.DEV) {
        reg = await navigator.serviceWorker.register('/service-worker.js', {
          type: 'module',
        });
      } else {
        // In production, use the normal service worker registration
        reg = await navigator.serviceWorker.register('/service-worker.js');
      }

      console.log('Service worker registered! 😎', reg);
    } catch (err) {
      console.log('😥 Service worker registration failed: ', err);
    }
  });
}

Объяснение

Этот код регистрирует пустой файл service-worker.js после загрузки страницы и только в том случае, если сайт поддерживает service workers.

Предварительное кэширование ресурсов

Для работы веб-приложения в автономном режиме браузер должен уметь отвечать на сетевые запросы и выбирать, куда их перенаправлять. Для этого добавьте следующий код в файл service-worker.js

// Choose a cache name
const cacheName = 'cache-v1';
// List the files to precache
const precacheResources = ['/', '/index.html', '/css/style.css', '/js/main.js', '/js/app/editor.js', '/js/lib/actions.js'];

// When the service worker is installing, open the cache and add the precache resources to it
self.addEventListener('install', (event) => {
  console.log('Service worker install event!');
  event.waitUntil(caches.open(cacheName).then((cache) => cache.addAll(precacheResources)));
});

self.addEventListener('activate', (event) => {
  console.log('Service worker activate event!');
});

// When there's an incoming fetch request, try and respond with a precached resource, otherwise fall back to the network
self.addEventListener('fetch', (event) => {
  console.log('Fetch intercepted for:', event.request.url);
  event.respondWith(
    caches.match(event.request).then((cachedResponse) => {
      if (cachedResponse) {
        return cachedResponse;
      }
      return fetch(event.request);
    }),
  );
});

Теперь вернитесь в браузер, закройте вкладку предварительного просмотра и откройте её снова. Вы должны увидеть console.log , соответствующие различным событиям в сервис-воркере!

Затем снова отключитесь от сети и обновите страницу. Вы должны увидеть, что сайт загружается, даже если вы не в сети!

Объяснение

Во время события установки сервис-воркера открывается именованный кэш с использованием API хранилища кэша. Затем файлы и маршруты, указанные в precacheResources , загружаются в кэш с помощью метода cache.addAll . Это называется предварительным кэшированием, потому что набор файлов кэшируется заранее во время установки, а не по мере необходимости или запроса.

Как только сервис-воркер начинает управлять сайтом, запрашиваемые ресурсы проходят через него как через прокси. Каждый запрос запускает событие fetch, которое в этом сервис-воркере ищет совпадение в кэше; если совпадение найдено, он отправляет кэшированный ресурс. Если совпадения нет, ресурс запрашивается обычным способом.

Кэширование ресурсов позволяет приложению работать в автономном режиме, избегая сетевых запросов. Теперь приложение может отвечать кодом состояния 200, находясь в автономном режиме!

5. Поздравляем!

Вы научились переводить веб-приложение в автономный режим с помощью сервис-воркеров и API кэширования.

Следующая практическая работа в этой серии посвящена работе с Workbox.