Браузер и фронтенд-рантайм
Воркеры: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает архитектурное решение под реальной нагрузкой — какой примитив подходит, чего он стоит и какой сбой он не способен решить — а не определение для заучивания.
Убедись, что выбираешь правильный воркер-примитив под задачу, рассуждаешь о стоимости передачи данных и распознаёшь ловушки жизненного цикла и изоляции, которые три примитива сами по себе не решают.
Коллега переносит медленный ре-рендер React-списка в web worker, чтобы убрать джанк при скролле, и ничего не меняется. Почему и что реально помогает?
Ты делаешь postMessage с Float32Array на 40 МБ в воркер, и отправляющий поток всё равно замирает на ~40 мс ещё до старта воркера. Лучший фикс?
Ты деплоишь новый service worker, перезагружаешь — и всё ещё старое поведение без ошибок. Новый воркер установился нормально. Что происходит?
Многопоточный WASM-модуль тихо работает однопоточно в проде. typeof SharedArrayBuffer равно 'undefined', а crossOriginIsolated равно false; COOP: same-origin выставлен, а COEP — нет. Точный фикс и его цена?
Кнопка запускает задачу обработки изображения на 400 мс. Пользователи жмут часто; вкладка спавнит по воркеру на клик, доходит до 400 МБ и убивается на мобиле. Какая правильная архитектура?
Service worker перехватывает навигацию и отдаёт app shell cache-first. Ты выкатываешь баг в shell; часть пользователей бьётся в сломанный кэшированный shell на каждой перезагрузке без кнопки восстановления. Какая архитектурная защита?
Сквозная линия юнита — одно дерево решений: выбери примитив под задачу — web worker для вычислений вне главного потока, service worker для сетевого прокси, SharedArrayBuffer для разделяемой памяти — потом заплати правильную стоимость транспорта (clone для мелких данных, transfer для крупного бинарного, SAB для конкурентного доступа за COOP+COEP). Вокруг этого повторяются три ловушки: воркер не может трогать DOM (поэтому мутацию DOM не вынести), service worker ждёт перед активацией и труден в восстановлении, когда ломает навигацию, а пулам нужен backpressure, иначе они текут. Ни один примитив не чинит DOM-боттлнек на главном потоке — эта работа остаётся там, где живёт DOM.