HTML Web Workers
Ранее Drag and Drop перемещал или помечал DOM-нагрузки событиями указателя. Этот урок уходит от жестов указателя и знакомит с Web Workers: JavaScript в фоновом потоке, чтобы длинный цикл не замораживал UI. Практика — создать, обменяться сообщениями, без DOM в worker — не флоты SharedWorker.
Зачем web workers в курсе HTML
Новички видят замороженную страницу при busy loop на главном потоке. Workers — первая обычная API для фоновых вычислений. После DnD разделение иное: скрипт страницы владеет DOM/UI; worker владеет тяжёлым расчётом и говорит только сообщениями.
Прямой ответ
1) new Worker("worker.js") или Blob. 2) postMessage со страницы. 3) В worker onmessage, считать, postMessage обратно. 4) Обновляйте DOM только на странице. 5) Нет прямого доступа к DOM. 6) Предпочитайте http(s) или Blob.
📊 main thread vs worker
| Topic | Main page script | Dedicated worker |
|---|---|---|
| Typical role | UI, DOM, create Worker | Heavy compute off UI thread |
| Talks via | postMessage / onmessage | postMessage / onmessage |
| Can touch DOM? | Yes | No — return data instead |
| Beginner entry | new Worker(url or Blob) | onmessage + compute + postMessage |
| This course depth | Required | Required (simple round-trip) |
| Not this lesson | Drag-and-drop gestures | SharedWorker / Service Worker products |
Крошечный round-trip Blob Worker
Один HTML строит worker из Blob без отдельного worker.js. Страница шлёт число; worker возвращает сумму цикла.
<button id="go" type="button">Run in worker</button>
<pre id="out"></pre>
<script>
const out = document.getElementById("out");
const src =
"onmessage=function(e){" +
"var n=e.data,s=0,i;" +
"for(i=1;i<=n;i++){s+=i;}" +
"postMessage(s);" +
"};";
const blob = new Blob([src], { type: "application/javascript" });
const w = new Worker(URL.createObjectURL(blob));
w.onmessage = function (e) {
out.textContent = "Sum 1..40 = " + e.data;
};
document.getElementById("go").onclick = function () {
out.textContent = "Working…";
w.postMessage(40);
};
</script>
Читаем вызовы round-trip
- Blob + createObjectURL без второго файла
- new Worker запускает фоновый скрипт
- postMessage шлёт число
- Worker считает и отвечает
- Страница пишет в pre — DOM на главном потоке
- В отличие от DnD: нет draggable
- Держите демо маленьким
UI остаётся на главном потоке
Worker возвращает данные; скрипт страницы решает, что видит пользователь. Это демо просит строку; onmessage страницы обновляет абзац.
<button id="ask" type="button">Ask worker</button>
<p id="msg">Waiting…</p>
<script>
const msg = document.getElementById("msg");
const src =
"onmessage=function(e){" +
"postMessage('Worker got: ' + e.data);" +
"};";
const w = new Worker(
URL.createObjectURL(new Blob([src], { type: "application/javascript" }))
);
w.onmessage = function (e) {
msg.textContent = e.data;
};
document.getElementById("ask").onclick = function () {
w.postMessage("hello");
};
</script>
Читаем идею владения UI
- Worker только эхо строки — без document
- Страница задаёт textContent
- Тот же мост сообщений
- Не DnD
- Не курс Service Worker
- Используйте worker когда работа рискует заморозить UI
- Дальше: SSE
Когда использовать worker
- Длинный CPU-цикл: хороший intro
- Крошечная правка строки: часто главный поток
- Карточка в зону: был DnD
- GPS: был Geolocation
- Продукты SharedWorker/Service Worker: за пределами интро
- Обновлять кнопки из worker: нельзя
Практика — создайте, пошлите сообщение, отрисуйте
- Проверьте демо суммы.
- Измените 40.
- Проверьте демо эха.
- Опционально: worker.js по http(s).
- Предложение: DnD указателем; workers off-thread сообщениями.
- Предпочитайте http(s)/Blob.
- Впереди: SSE.
Лёгкие ошибки
- Ждать querySelector внутри worker
- Worker для крошечных задач
- Путать с DnD
- Хрупкие пути file://
- Забыть onmessage на странице
- Считать Blob единственным prod-паттерном
- Считать интро полным курсом SharedWorker
Итог
- Workers выполняют JS вне UI-потока
- postMessage/onmessage; DOM только на странице
- Классические workers без document/window
- Blob для демо; http(s) для worker.js
- DnD был перенос/метка указателем; этот урок — фоновый расчёт + сообщения
- Далее: SSE
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху