Web Worker - JavaScript, що виконується в окремому потоці. Важкі обчислення у воркері не блокують головний потік, тож інтерфейс лишається чутливим до кліків і прокрутки.
// main.js - синтаксис, який розуміє Vite
const worker = new Worker(new URL('./csv-worker.js', import.meta.url), { type: 'module' });
worker.postMessage({ file });
worker.onmessage = (event) => renderTable(event.data.rows);
worker.onerror = (event) => showError(event.message);
// csv-worker.js
self.onmessage = async (event) => {
const text = await event.data.file.text();
const rows = parseCsv(text); // секунди роботи - але не в головному потоці
self.postMessage({ rows });
};
Обмеження воркерів:
- немає доступу до DOM,
window,document. Лише обчислення й мережа (fetch, WebSocket),IndexedDB, таймери; - спілкування лише повідомленнями. Дані копіюються (алгоритм structured clone): передати мегабайтний масив туди й назад - теж робота. Функції й класи з методами не передаються;
- запуск коштує - завантаження скрипта й ініціалізація. Для обчислень на кілька мілісекунд воркер повільніший за звичайний виклик.
Передача без копіювання - transferable objects:
const buffer = new ArrayBuffer(50_000_000);
worker.postMessage(buffer, [buffer]); // власність переходить до воркера
buffer.byteLength; // 0 - у головному потоці буфер більше недоступний
Працює для ArrayBuffer, MessagePort, ImageBitmap, OffscreenCanvas, потоків.
Коли воркер доречний:
- розбір великих файлів (CSV, Excel, JSON на десятки мегабайтів);
- обробка зображень, стиснення перед завантаженням на сервер;
- криптографія, хешування файлів;
- пошук і фільтрація по великому локальному набору даних;
- рендер у
OffscreenCanvas(графіки, візуалізації).
Коли не допоможе:
- повільний рендер великого списку - проблема в DOM, а DOM недоступний воркеру. Тут допомагає віртуалізація;
- очікування мережі - воно й так не блокує потік.
Різновиди:
- dedicated worker - належить одній сторінці (приклад вище);
- SharedWorker - один на кілька вкладок того самого сайту: одне спільне WebSocket-з'єднання на всі вкладки;
- Service Worker - зовсім інша роль: проксі між сторінкою й мережею.
Зручність: бібліотека Comlink перетворює обмін повідомленнями на виклик звичайних async-функцій, приховуючи postMessage.