Web Workers
&& Service Workers && SharedWorker
Web Workers

const myWorker = new Worker('worker.js')// Відправити у воркер
myWorker.postMessage('Hello!');
// Отримати з воркера
myWorker.onmessage = (e) => {
console.log(e.data);
}
// Вбити(
worker.terminate()ресурси worker-а живуть в процесі створившої його сторінки
/* worker.js */
// Отримувати з головного файлу
self.onmessage = function(e) {
console.log(e.data);
// Надіслати до головного файлу
self.postMessage('some info');
}Фішечки
Воркери можна подружити через SharedWorker
worker.postMessage({ port: sharedWorker.port }, [sharedWorker.port]);* для цього використовується головний потік
SharedWorker
const worker = new SharedWorker("worker.js")
worker.port.start()
// -->
worker.port.postMessage({hello: 'world'});
// --<
worker.port.onmessage = (e) => { e.data... };
// підписка
self.onconnect = function(e) {
const port = e.ports[0];
port.onmessage = (e) => { e.data... };
};Kill shared worker
- коли він закриється сам (self.close())
- коли закриються всі сторінки, що його використовують
- коли користувач примусово завершить його (наприклад, в хромі з chrome: // inspect)
- коли впаде він, або процес сторінки, де він живе

Обмеження
-
не має DOM
-
не має window, є глобальний об'єкт self
-
не можна малювати в канвас (крім OffscreenCanvas)
-
не має підтримки CORS, завантаження тільки з поточного домену
-
має обмежений розмір стека (2-10x)
Service Workers
- Precaching
- Runtime caching (AppCache)
- Network (Proxy)
- Request routing
- Background sync
- Offline third-party analyst
- Працює тільки з HTTPS
- Реєстрація повинна бути з корня домена
- Можливість реалізовувати стратегії networkFirst, cacheFirst
- на відміну від workers мають доступ до IndexedDB
LifyCycle


navigator.serviceWorker.register('/service-worker.js').then(lolool)
// можна викликати ввесь час після завантаження,
// браузер сам вирішить чи воркер зареєстровано/* service-worker.js */
self.addEventListener('install', (event) => {
// ...
});
// ця подія спрацьовує після інсталяції воркера та видалення старого
self.addEventListener('activate', (event) => {
// ...
});
// якщо користувач змінив сторінку чи оновив поточну
self.addEventListener('fetch', (event) => {
// ...
});Оновлення
- для оновлення файли сервіс воркера повинні відрізнятись, браузер оновлює автоматично при завантаженні сайту
- якщо Service Worker новий, спрацьовує подія install.
- на цьому етапі старий Service Worker як і раніше контролює сторінку, тоді як новий переходить в стан waiting.
- коли поточні відкриті сторінки сайту будуть закриті, старий Service Worker буде убитий, а новий отримає контроль.

navigator.storage.estimate().then(estimate => {
console.log(`
Using: ${estimate.usage / 1024 / 1024} Mb;
Limit: ${estimate.quota / 1024 / 1024} Mb;
`);
})
Caches Api & IndexDB quotas
Service Worker
By Kolya Koval
Service Worker
- 403