Идея
Вынести CPU-тяжёлую работу с main thread, чтобы UI не подвисал. Worker общается через postMessage.
main.js
const worker = new Worker("heavy.js");
worker.postMessage({ n: 40 });
worker.onmessage = (e) => {
console.log("fib =", e.data);
};
worker.onerror = (err) => console.error(err);
heavy.js
function fib(n) {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
self.onmessage = (e) => {
const result = fib(e.data.n);
self.postMessage(result);
};
Замечания
- нет DOM в worker;
- скрипт worker загружается отдельным файлом (или
URL.createObjectURL);
- для библиотек — аккуратно с зависимостями; module worker:
new Worker(url, { type: "module" }).
На собеседовании: показать обмен сообщениями и зачем отдельный поток.