Skip to content

Справочник

SSR / Nuxt

useWorker/useWorkerComputed/useWorkerPool безопасно вызывать в setup() на сервере — конструктор передаётся как фабрика (() => new Worker(...)) и вызывается только внутри run(), то есть в обычном сценарии только на клиенте. Если run() всё же вызван во время SSR, вы получите WorkerUnavailableError с понятным сообщением, а не падение. Защищайте клиентский код через <ClientOnly> в Nuxt:

vue
<ClientOnly>
  <ProgressBar v-if="isRunning" :value="progress" />
</ClientOnly>

Поддержка бандлеров

Не нужны worker-loader/worker-plugin или другие обходные пути эпохи webpack — используется нативный ESM-импорт воркера (new URL('./x.worker.ts', import.meta.url) + { type: 'module' }), который Vite (и Nuxt 3/4) подхватывает и автоматически собирает в отдельный чанк. Если вы на классическом Webpack (Vue CLI), понадобится worker-plugin или аналог — это ограничение бандлера, а не этого пакета.

Набор бенчмарков

npm run benchmark (benchmark/heavy-computation.bench.ts, через tinybench) сравнивает CPU-ограниченную задачу (наивный рекурсивный fib(30..34)), выполненную на основном потоке, в одном воркере и в пуле из 4 потоков — через node:worker_threads, поскольку это выполняется под Node (tsx), а не в браузере. Это проверка здравого смысла реального параллельного ускорения пула, а не бенчмарк собственных composables этого пакета (они добавляют пренебрежимо малый оверхед поверх сырого postMessage, который здесь фактически и измеряется).

Пример запуска на этой машине (результаты зависят от железа/нагрузки — запустите сами, чтобы получить цифры, значимые для вашей машины):

ЗадачаОп/секСреднее время
Основной поток7.4135мс
Один поток воркера5.8173мс
Пул из 4 потоков воркеров9.1111мс

Одиночный воркер здесь медленнее основного потока — ожидаемо: оверхед postMessage/запуска потока на задаче, которая не распараллелена. Пул быстрее, потому что 8 задач по-настоящему выполняются на 4 потоках одновременно, а не потому что какой-то один воркер быстрее основного потока.

Сравнение

vue-worker (последняя версия 1.2.1, опубликована в 2017) и vue-web-workers (последняя версия 0.2.0, опубликована в 2020, напрямую зависит от vue@^2.6.11) — оба фактически неподдерживаемые плагины Vue 2 — проверено по реестру npm, а не по памяти. Comlink (4.4.2, всё ещё активно поддерживается, без зависимостей) — надёжный, Vue-агностичный RPC-слой.

vue-worker / vue-web-workersComlinkvue-worker-kit
Composition API— (не специфичен для Vue)
Типизированные вход/выходвручную wrap<T>()выводится из файла воркера
Пул воркеров✓ (createWorkerPool, pool.map с передачей по элементу)
Реактивный computed-в-воркере✓ (useWorkerComputed)
SharedWorker (мультивкладочный)✓ (useSharedWorker)
Потоковые результаты✓ (ctx.reportChunk, chunks.value)
Отмена✓ (AbortSignal, на задачу + глобально для пула)
Transferables✓ (вручную, в обе стороны)✓ (RunOptions.transfer внутрь, ctx.transfer() наружу, по элементу для pool.map)
Прогрев воркера✓ (warmup() для одиночного воркера и пула)
Повторы с backoff✓ (настраиваемая функция задержки)
Кэширование результатов (LRU)✓ (cache: 'lru', maxCacheSize)
Безопасен для SSR
Зависимостинетнет, кроме vue

Лицензия

MIT