Web Workers в экосистеме JavaScript представляют собой механизм выполнения кода в отдельном потоке, изолированном от основного потока браузера. В контексте сборщика Parcel поддержка Workers реализована как часть системы таргетов (targets), позволяющей формировать отдельные бандлы с собственными правилами компиляции, окружением и точками входа.
Parcel автоматически распознаёт использование Worker-кода и выделяет его в отдельную сборку, обеспечивая корректную работу изолированного контекста выполнения без дополнительной ручной конфигурации в большинстве сценариев.
Parcel рассматривает Web Worker как самостоятельную единицу сборки. При обнаружении создания воркера формируется отдельный граф зависимостей, который изолируется от основного приложения.
Ключевые особенности архитектуры:
Такое разделение позволяет Parcel выполнять tree-shaking и code-splitting отдельно для главного потока и фоновых потоков.
Parcel поддерживает несколько стандартных способов подключения Worker-кода.
Наиболее распространённый вариант:
const worker = new Worker(
new URL('./worker.js', import.meta.url),
{ type: 'module' }
);
Parcel анализирует new URL(..., import.meta.url) и
автоматически:
worker.js в отдельный бандл;Parcel также поддерживает более декларативный синтаксис:
import Worker from './worker.js';
const worker = new Worker();
При такой записи Parcel интерпретирует модуль как Worker entrypoint и создаёт отдельную сборку без необходимости ручного указания URL.
В некоторых конфигурациях используется явное указание:
const worker = new Worker('./worker.js?worker', { type: 'module' });
Parcel распознаёт ?worker как инструкцию для создания
отдельного worker-bundle.
Parcel использует систему targets, определяемую в
package.json. Для Web Worker применяется отдельный runtime
environment.
Пример конфигурации:
{
"targets": {
"default": {
"context": "browser"
},
"worker": {
"context": "web-worker"
}
}
}
web-workerКонтекст web-worker определяет:
self вместо
window;Parcel использует этот контекст для корректной трансформации кода, исключая несовместимые полифилы и оптимизации.
Worker-бандл в Parcel строится как независимый граф модулей. Это означает:
Пример структуры:
index.js → main bundle
worker.js → worker bundle
utils.js → может попасть в оба бандла при раздельном использовании
Parcel применяет отдельные пайплайны трансформации для Worker-кода:
Важно, что Worker код рассматривается как самостоятельное приложение внутри сборки.
Parcel не изменяет стандартное поведение Web Workers, но обеспечивает корректную упаковку сообщений:
// main.js
const worker = new Worker(
new URL('./worker.js', import.meta.url),
{ type: 'module' }
);
worker.postMessage({ value: 42 });
worker.onmess age = (event) => {
console.log(event.data);
};
// worker.js
self.onmess age = (event) => {
const result = event.data.value * 2;
self.postMessage(result);
};
Parcel гарантирует, что:
Worker автоматически становится кандидатом на lazy-loading, так как выделяется в отдельный файл.
При использовании динамического импорта:
const worker = new Worker(
new URL('./heavyWorker.js', import.meta.url),
{ type: 'module' }
);
поведение включает:
Worker в Parcel может импортировать:
Пример:
import config from './config.json';
import imageUrl from './image.png';
self.postMessage({ config, imageUrl });
Parcel трансформирует ресурсы в валидные URL внутри worker bundle.
При использовании TypeScript Worker код обрабатывается отдельным компиляторным пайплайном:
self.onmess age = (event: MessageEvent<number>) => {
self.postMessage(event.data * 2);
};
Особенности:
web-worker
контексте.Parcel применяет специфические оптимизации:
Удаляются неиспользуемые экспорты внутри worker-графа.
Модули объединяются в минимальное количество функций исполнения.
Если worker импортирует динамические модули, Parcel формирует дополнительные чанки.
Worker-бандлы минифицируются независимо от основного приложения.
При неправильной настройке Worker могут возникать типовые сценарии:
import.meta.url;type: "module" при ESModule Worker.Parcel в таких случаях:
В крупных проектах Worker target часто комбинируется с другими окружениями:
{
"targets": {
"main": {
"context": "browser",
"engines": {
"browsers": "> 0.25%"
}
},
"worker": {
"context": "web-worker"
}
}
}
Такой подход позволяет:
Web Workers в Parcel тесно интегрированы с:
Parcel отслеживает зависимости worker-графа так же, как и основного приложения, но с изоляцией исполнения.
Parcel различает два подхода:
import Worker from './worker.js';
const w = new Worker();
const w = new Worker(
new URL(`./workers/${name}.js`, import.meta.url),
{ type: 'module' }
);
В production режиме Parcel:
Worker становится полностью независимым артефактом сборки, подключаемым через URL, с сохранением всех трансформаций, применённых в процессе сборки.