Skip to main content

Що робить SharedWorker?

Що таке SharedWorker

SharedWorker - це потік JavaScript, який можуть використовувати кілька контекстів (вкладок, iframe, вікон) одночасно, якщо вони завантажені з одного origin (протокол + хост + порт).

На відміну від звичайного Worker, який "гине" при закритті вкладки, SharedWorker живе, поки хоча б одне вікно залишається підключеним.


Відмінність від звичайного Web Worker

ОсобливістьWorker (Dedicated)SharedWorker
ВикористовуєтьсяОднією сторінкоюКількома вкладками/вікнами
Створюєтьсяnew Worker('worker.js')new SharedWorker('worker.js')
Канал зв'язкуpostMessage напрямуЧерез об'єкт port
Час життяПоки відкрита вкладкаПоки підключений хоча б один контекст
Доступний з інших вкладокНіТак (якщо один origin)

Приклад роботи SharedWorker

1. Код у shared-worker.js

javascript
// shared-worker.js onconnect = (event) => { const port = event.ports[0]; console.log('Нове підключення'); port.postMessage('Привіт, вкладко!'); port.onmessage = (e) => { console.log('Повідомлення від вкладки:', e.data); // Надсилаємо відповідь назад port.postMessage(`Отримано: ${e.data}`); }; };

2. Код на кожній вкладці (main.js)

javascript
// main.js const shared = new SharedWorker('shared-worker.js'); const port = shared.port; // Активуємо канал port.start(); // Слухаємо відповіді від воркера port.onmessage = (e) => { console.log('Відповідь від SharedWorker:', e.data); }; // Надсилаємо повідомлення воркеру port.postMessage('Привіт від вкладки!');

Що станеться:

  • Усі вкладки підключаться до одного й того самого воркера;
  • Усі вони отримуватимуть повідомлення через свої port;
  • Воркер може координувати їх (наприклад, розсилати спільні дані всім).

Як працює onconnect

Коли нова вкладка створює new SharedWorker(), браузер не створює новий потік, якщо воркер уже існує.

Він просто викликає подію onconnect, передаючи туди об'єкт MessagePort, який представляє канал зв'язку.

Таким чином, один SharedWorker може керувати десятками портів (вкладок).


Приклад мовлення всім вкладкам

javascript
// shared-worker.js const ports = []; onconnect = (e) => { const port = e.ports[0]; ports.push(port); port.start(); port.onmessage = (event) => { // Розсилаємо повідомлення всім підключеним вкладкам for (const p of ports) { p.postMessage(`Від вкладки: ${event.data}`); } }; };

Тепер, якщо ти відкриєш дві вкладки:

  • вкладка 1 надішле port.postMessage("Привіт"),
  • обидві вкладки отримають "Від вкладки: Привіт".

Це вже реальний чат між вкладками!


Загальний приклад використання

СценарійЧому SharedWorker корисний
Спільний чат між вкладкамиможна синхронізувати повідомлення
Фонова обробка даниходна вкладка рахує - всі отримують результат
Спільна підписка на WebSocketодне підключення на всі вкладки (економія ресурсів)
Спільна кеш/IndexedDB логікаодин фон для всіх
Синхронізація станунаприклад, спільний токен авторизації між вкладками

Як взаємодіє SharedWorker

javascript
[ Вкладка 1 ] [ Вкладка 2 ] [ Iframe ] │ │ │ └─────▶ [ SharedWorker Thread ] ◀─────┘ ▲ │ │ (ports[]) ▼ обробка логіки

Усі вкладки підключаються до одного потоку воркера. Воркер обмінюється повідомленнями з кожною вкладкою через її port.


Що важливо пам'ятати

  • SharedWorker працює лише в межах одного origin (https://example.com ≠ http://example.com).
  • Не підтримується в Service Workers (це різні типи воркерів).
  • Не працює в деяких старих браузерах або в Safari iOS.
  • Спілкування відбувається через port.postMessage() і port.onmessage.

Безпека

  • Воркери ізольовані - не мають доступу до DOM, window, document.
  • Дані передаються за копією (structured clone).
  • Можна використовувати Transferable-об'єкти (ArrayBuffer) для швидкого обміну.

Проста аналогія

Уяви, що SharedWorker - це офісний сервер у компанії.

Кожен співробітник (вкладка) може підключитися до сервера. Сервер зберігає спільні дані і розсилає оновлення всім. Поки хоча б один співробітник працює - сервер живе.

Коли всі закрили вкладки → сервер автоматично вимикається.


Підсумок

ОсобливістьОпис
Що робитьДозволяє кільком сторінкам (вкладкам) одного сайту використовувати спільний потік JS
Головна перевагаПоділ логіки і даних між вкладками
КомунікаціяЧерез MessagePort (port.postMessage / port.onmessage)
Життєвий циклПоки відкритий хоча б один клієнт
Немає доступу до DOMЛише обмін повідомленнями
Типові сценаріїСпільний WebSocket, кеш, синхронізація стану, міжвкладковий чат

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.