Українська

Дізнайтеся, як використовувати service workers для створення швидких, надійних та захопливих веб-додатків, що працюють в першу чергу офлайн, для користувачів у всьому світі.

Service Workers: Створення веб-додатків, що працюють в першу чергу офлайн

У сучасному світі користувачі очікують, що веб-додатки будуть швидкими, надійними та доступними, навіть коли підключення до мережі обмежене або відсутнє. Саме тут на допомогу приходить концепція дизайну "offline-first" (пріоритет офлайну). Service workers — це потужна технологія, яка дозволяє розробникам створювати веб-додатки, що бездоганно працюють в офлайн-режимі, забезпечуючи кращий користувацький досвід.

Що таке Service Workers?

Service worker — це JavaScript-файл, який працює у фоновому режимі, окремо від основного потоку браузера. Він діє як проксі-сервер між веб-додатком та мережею, перехоплюючи мережеві запити та керуючи кешуванням. Service workers можуть виконувати такі завдання:

Важливо, що service workers контролюються браузером, а не веб-сторінкою. Це дозволяє їм функціонувати, навіть коли користувач закрив вкладку або вікно браузера.

Чому саме Offline-First?

Створення веб-додатку за принципом offline-first надає численні переваги:

Як працюють Service Workers

Життєвий цикл service worker складається з кількох етапів:

  1. Реєстрація: Service worker реєструється в браузері, вказуючи область дії додатка, яким він буде керувати.
  2. Встановлення: Service worker встановлюється, під час чого він зазвичай кешує статичні ресурси.
  3. Активація: Service worker активується і бере під контроль веб-додаток. Це може включати скасування реєстрації старих service workers та очищення старих кешів.
  4. Очікування: Service worker залишається в режимі очікування, чекаючи на мережеві запити або інші події.
  5. Перехоплення (Fetch): Коли надходить мережевий запит, service worker перехоплює його і може або надати кешований вміст, або отримати ресурс з мережі.

Впровадження Offline-First за допомогою Service Workers: Покрокова інструкція

Ось базовий приклад того, як реалізувати функціональність offline-first за допомогою service workers:

Крок 1: Реєстрація Service Worker

У вашому основному файлі JavaScript (наприклад, `app.js`):


if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(function(registration) {
      console.log('Service Worker зареєстровано з областю видимості:', registration.scope);
    })
    .catch(function(error) {
      console.log('Реєстрація Service Worker не вдалася:', error);
    });
}

Цей код перевіряє, чи підтримує браузер service workers, і реєструє файл `service-worker.js`. Область видимості визначає, якими URL-адресами буде керувати service worker.

Крок 2: Створення файлу Service Worker (service-worker.js)

Створіть файл з назвою `service-worker.js` з наступним кодом:


const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/style.css',
  '/app.js',
  '/images/logo.png'
];

self.addEventListener('install', function(event) {
  // Виконуємо кроки встановлення
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('Кеш відкрито');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Кеш знайдено - повертаємо відповідь
        if (response) {
          return response;
        }

        // ВАЖЛИВО: Клонуйте запит.
        // Запит - це потік, і його можна використати лише один раз. Оскільки ми використовуємо його
        // один раз для кешу і ще раз для браузерного запиту, нам потрібно клонувати відповідь.
        var fetchRequest = event.request.clone();

        return fetch(fetchRequest).then(
          function(response) {
            // Перевіряємо, чи ми отримали дійсну відповідь
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

            // ВАЖЛИВО: Клонуйте відповідь.
            // Відповідь - це потік, і її потрібно використати лише один раз.
            var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
    );
});

self.addEventListener('activate', function(event) {

  var cacheWhitelist = [CACHE_NAME];

  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

Цей код робить наступне:

Крок 3: Тестування вашої офлайн-функціональності

Щоб протестувати вашу офлайн-функціональність, ви можете використовувати інструменти розробника в браузері. У Chrome відкрийте DevTools, перейдіть на вкладку "Application" і виберіть "Service Workers". Потім ви можете симулювати офлайн-режим, встановивши прапорець "Offline".

Просунуті техніки Service Worker

Коли ви отримаєте базове розуміння service workers, ви зможете дослідити більш просунуті техніки для покращення вашого додатку з підходом offline-first:

Стратегії кешування

Існує кілька стратегій кешування, які ви можете використовувати, залежно від типу ресурсу та вимог вашого додатку:

Вибір правильної стратегії кешування залежить від конкретного ресурсу та вимог вашого додатку. Наприклад, статичні ресурси, такі як зображення та CSS-файли, часто найкраще обслуговувати за допомогою стратегії "Спочатку кеш", тоді як динамічний вміст може виграти від стратегії "Спочатку мережа" або "Кеш, потім мережа".

Фонова синхронізація

Фонова синхронізація дозволяє відкладати завдання доти, доки у користувача не з'явиться стабільне мережеве з'єднання. Це корисно для таких завдань, як відправка форм або завантаження файлів. Наприклад, користувач у віддаленому районі Індонезії може заповнити форму в офлайн-режимі. Потім service worker може почекати, поки з'явиться з'єднання, перш ніж надсилати дані.

Push-сповіщення

Service workers можна використовувати для надсилання push-сповіщень користувачам, навіть коли додаток не відкрито. Це можна використовувати для повторного залучення користувачів та надання своєчасних оновлень. Уявіть собі новинний додаток, який надсилає сповіщення про останні новини користувачам у режимі реального часу, незалежно від того, чи додаток активно працює.

Workbox

Workbox — це набір бібліотек JavaScript, які спрощують створення service workers. Він надає абстракції для поширених завдань, таких як кешування, маршрутизація та фонова синхронізація. Використання Workbox може спростити ваш код service worker та зробити його більш підтримуваним. Багато компаній зараз використовують Workbox як стандартний компонент при розробці PWA та додатків з підходом offline-first.

Що врахувати для глобальної аудиторії

При створенні веб-додатків з підходом offline-first для глобальної аудиторії важливо враховувати наступні фактори:

Приклади додатків з підходом Offline-First

Кілька популярних веб-додатків успішно реалізували функціональність offline-first за допомогою service workers:

Висновок

Service workers — це потужний інструмент для створення швидких, надійних та захопливих веб-додатків з підходом offline-first. Кешуючи ресурси, перехоплюючи мережеві запити та обробляючи фонові завдання, service workers можуть забезпечити чудовий користувацький досвід, навіть коли підключення до мережі обмежене або відсутнє. Оскільки доступ до мережі залишається нестабільним у всьому світі, зосередження на дизайні offline-first має вирішальне значення для забезпечення рівного доступу до інформації та послуг в Інтернеті.

Дотримуючись кроків, викладених у цьому посібнику, та враховуючи згадані фактори, ви можете створювати веб-додатки, які бездоганно працюють в офлайн-режимі та забезпечують чудовий досвід для користувачів у всьому світі. Використовуйте потужність service workers і будуйте майбутнє вебу — майбутнє, де веб доступний для всіх, скрізь, незалежно від їхнього мережевого з'єднання.