Реалізація Background Service Worker у браузерному розширенні

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

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація Background Service Worker у браузерному розширенні
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація Background Service Worker у браузерному розширенні

У Manifest V3 фоновий скрипт став service worker. Це не просто перейменування — змінилась модель життєвого циклу. Service worker може бути завершений браузером в будь-який момент, коли немає активних задач, і це ламає паттерни, які працювали у MV2 з persistent background page.

Реєстрація у маніфесті

{
  "manifest_version": 3,
  "background": {
    "service_worker": "background/sw.js",
    "type": "module"
  }
}

type: "module" дозволяє використовувати ES-модулі та import всередині service worker. Підтримується у Chrome 93+.

Життєвий цикл: що реально відбувається

Браузер запускає service worker при:

  • встановленні/оновленні розширення
  • отриманні повідомлення з content script або popup
  • спрацьовуванні alarm (chrome.alarms)
  • наступленні мережевої події (якщо підписаний)

Після завершення всіх обробників браузер може убити процес після ~30 секунд неактивності. Наступна подія поднімаме його знову — вже з чистим станом.

Це означає: ніякого глобального стану у пам'яті. Змінні не переживають перезапуск.

// ПОГАНО — стан втрачається при перезапуску SW
let requestCount = 0;

chrome.runtime.onMessage.addListener(() => {
  requestCount++; // повернеться до 0 після перезапуску
});

// ДОБРЕ — зберігаємо у chrome.storage
chrome.runtime.onMessage.addListener(async () => {
  const { requestCount = 0 } = await chrome.storage.local.get('requestCount');
  await chrome.storage.local.set({ requestCount: requestCount + 1 });
});

Обробка подій: синхронна реєстрація обов'язкова

Обробники подій мають бути зареєстровані синхронно на верхньому рівні. Якщо реєструєте їх всередині async-функції або після await — браузер може не «побачити» їх при запуску SW для обробки події:

// background/sw.js

// ПРАВИЛЬНО — синхронна реєстрація на верхньому рівні
chrome.runtime.onInstalled.addListener(onInstalled);
chrome.runtime.onMessage.addListener(onMessage);
chrome.alarms.onAlarm.addListener(onAlarm);

// Реалізації можуть бути async
async function onInstalled(details) {
  if (details.reason === 'install') {
    await chrome.storage.sync.set({ settings: defaultSettings });
  }
}

function onMessage(message, sender, sendResponse) {
  handleMessage(message, sender).then(sendResponse);
  return true; // мусить повернути true для async-ответів
}

Довгоживучі з'єднання через Port

Для задач, які займають більше кількох секунд (streaming, polling), використовуйте chrome.runtime.connect(). Активне з'єднання утримує SW живим:

chrome.runtime.onConnect.addListener((port) => {
  if (port.name === 'long-running-task') {
    handleLongRunningTask(port);
  }
});

Терміни

Прості обробники подій: 1–2 дні. Складна з alarms, синхронізацією, довгоживучими задачами: 3–5 днів.