Як інтегрувати Service Workers у програми Next.js

Сервіс-воркери – це спеціальні скрипти, що працюють у фоновому режимі, надаючи веб-застосункам розширені можливості, зокрема ефективне кешування та інші важливі функції.

Ці інструменти створюють у веб-браузерах враження безперервної та плавної роботи, наближаючи їх до нативних програм.

Сервіс-воркери є ключовим елементом у створенні прогресивних веб-застосунків (PWA).

Основи роботи сервіс-воркерів

Сервіс-воркер – це особливий вид JavaScript-воркера, що функціонує у фоновому режимі, незалежно від основного потоку JavaScript. Це гарантує відсутність блокувань, затримок або переривань у роботі інтерфейсу користувача та його взаємодії з програмою.

Сервіс-воркери діють як проксі-сервери, що розташовані між веб-застосунком та мережею. Вони можуть перехоплювати запити та відповіді, зберігати ресурси в кеші та забезпечувати підтримку в автономному режимі. Завдяки цьому веб-програми стають більш зручними та швидкими, навіть при відсутності інтернет-з’єднання.

Основні сфери застосування сервіс-воркерів

Сервіс-воркери знаходять застосування в багатьох сферах. Ось декілька з них:

  • PWA: Сервіс-воркери є потужним інструментом для прогресивних веб-застосунків. Вони забезпечують обробку мережевих запитів, push-повідомлення, підтримку роботи в офлайн-режимі та швидке завантаження сторінок.
  • Кешування: Сервіс-воркери здатні зберігати ресурси застосунку (зображення, JavaScript-код, CSS-файли) в кеш-пам’яті браузера. Це дозволяє браузеру отримувати їх з кешу, а не через мережу з віддаленого сервера. Це суттєво прискорює завантаження контенту, особливо для користувачів зі слабким або нестабільним інтернет-з’єднанням.
  • Фонова синхронізація: Сервіс-воркери можуть синхронізувати дані та запускати фонові процеси, навіть якщо користувач не взаємодіє активно з програмою, або коли вона не відкрита у браузері.

Інтеграція сервіс-воркерів у Next.js-застосунки

Перед тим, як перейти до коду, важливо розуміти, як функціонують сервіс-воркери. Основних етапів два: реєстрація та активація.

На етапі реєстрації браузер реєструє сервіс-воркер. Нижче наведено простий приклад:

 const registerServiceWorker = async () => {
  if ("serviceWorker" in navigator) {
    registration = await navigator.serviceWorker.register("/sw.js");
  }
};

registerServiceWorker();

Цей код спочатку перевіряє, чи підтримує браузер сервіс-воркери (що є стандартом для всіх сучасних веб-переглядачів). Якщо підтримка є, код продовжує реєстрацію сервіс-воркера, який знаходиться за вказаним шляхом до файлу.

На етапі активації потрібно встановити та активувати сервіс-воркер, обробляючи події встановлення та активації за допомогою слухачів подій JavaScript. Ось приклад реалізації:

 registration.addEventListener("install", () => {
    console.log("Service worker installed");
});

registration.addEventListener("activate", () => {
    console.log("Service worker activated");
});

Цей код можна додати безпосередньо після процесу реєстрації. Він повинен виконуватися одразу після успішної реєстрації сервіс-воркера.

Код цього проекту можна знайти у його GitHub репозиторії.

Створення Next.js проєкту

Для початку роботи, виконайте цю команду, щоб створити Next.js проєкт локально:

 npx create-next-app next-project 

Додавання сервіс-воркера до Next.js застосунку включає наступні кроки:

  • Зареєструвати сервіс-воркер у глобальному середовищі.
  • Створити JavaScript-файл сервіс-воркера у публічному каталозі.

Додавання сервіс-воркера

Спочатку зареєструємо сервіс-воркера. Оновіть файл `src/pages/_app.js` наступним чином. Розміщення коду у цьому файлі гарантує, що сервіс-воркер реєструється при завантаженні програми та має доступ до всіх її ресурсів.

 import { useEffect } from 'react';

export default function App({ Component, pageProps }) {
  useEffect(() => {
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker
        .register('/service-worker.js', { scope: "https://www.makeuseof.com/" })
        .then((registration) => {
          console.log(
            'Service worker registered successfully. Scope:',
            registration.scope
          );
        })
        .catch((error) => {
          console.error('Service worker registration failed:', error);
        });
    }
  }, []);

  return <Component {...pageProps} />;
}

Хук `useEffect` спрацьовує при монтуванні компонента. Як і в попередньому прикладі, цей код спочатку перевіряє підтримку сервіс-воркерів браузером користувача.

Якщо підтримка є, реєструється скрипт сервіс-воркера, що знаходиться за вказаним шляхом, і його область визначається як “/”. Це означає, що сервіс-воркер контролює всі ресурси в застосунку. За потреби можна задати конкретнішу область, наприклад “/products”.

У разі успішної реєстрації, код виводить повідомлення про успіх разом з областю дії. Якщо при реєстрації виникає помилка, код її оброблює та виводить відповідне повідомлення.

Встановлення та активація сервіс-воркера

Додайте наступний код у новий файл `public/service-worker.js`.

 const installEvent = () => {
  self.addEventListener('install', () => {
    console.log('service worker installed!!!!');
  });
};

installEvent();
  
const activateEvent = () => {
  self.addEventListener('activate', () => {
    console.log('service worker activated!!!');
  });
};

activateEvent();

Щоб перевірити успішність реєстрації, встановлення та активації сервіс-воркера, запустіть сервер розробки та відкрийте програму у браузері.

 npm run dev 

Відкрийте інструменти розробника Chrome (або аналог вашого браузера) і перейдіть на вкладку “Application”. У розділі “Service Workers” має відображатися ваш зареєстрований сервіс-воркер.

Після успішної реєстрації, встановлення та активації сервіс-воркера, ви можете реалізовувати різні функції, наприклад, кешування, фонову синхронізацію або надсилання push-повідомлень.

Кешування ресурсів за допомогою сервіс-воркерів

Кешування ресурсів програми на пристрої користувача може суттєво підвищити продуктивність, забезпечуючи швидший доступ, особливо в умовах нестабільного інтернет-з’єднання.

Щоб налаштувати кешування ресурсів, додайте наступний код у файл `service-worker.js`:

 const cacheName="test-cache";

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then((cachedResponse) => {
      return cachedResponse || fetch(event.request).then((response) => {
        return caches.open(cacheName).then((cache) => {
          cache.put(event.request, response.clone());
          return response;
        });
      });
    })
  );
});

Коли користувач вперше відкриває головну сторінку, цей код перевіряє наявність кешованої відповіді на запит. Якщо така відповідь є, сервіс-воркер повертає її клієнту.

Якщо кешованої відповіді немає, сервіс-воркер отримує ресурс з сервера через мережу, потім віддає відповідь клієнту і одночасно кешує її для майбутніх запитів.

Щоб переглянути кешовані ресурси, відкрийте вкладку “Application” в інструментах розробника. У розділі “Cache Storage” має відображатися список закешованих ресурсів. Ви також можете активувати опцію “Offline” у розділі “Service Worker” і оновити сторінку, щоб імітувати роботу в автономному режимі.

Тепер, при відвідуванні головної сторінки, браузер обслуговуватиме ресурси, що зберігаються в кеші, замість спроб робити мережеві запити.

Використання сервіс-воркерів для покращення продуктивності

Сервіс-воркери є потужним інструментом для оптимізації продуктивності Next.js програм. Вони дозволяють кешувати ресурси, перехоплювати запити та забезпечувати підтримку в автономному режимі, що значно покращує користувацький досвід.

Проте, варто зазначити, що сервіс-воркери можуть бути складними у впровадженні та керуванні. Важливо ретельно зважити потенційні переваги та недоліки, перш ніж приймати рішення про їх використання.