Справочник
SSR / Nuxt
useWorker/useWorkerComputed/useWorkerPool безопасно вызывать в setup() на сервере — конструктор передаётся как фабрика (() => new Worker(...)) и вызывается только внутри run(), то есть в обычном сценарии только на клиенте. Если run() всё же вызван во время SSR, вы получите WorkerUnavailableError с понятным сообщением, а не падение. Защищайте клиентский код через <ClientOnly> в Nuxt:
<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.4 | 135мс |
| Один поток воркера | 5.8 | 173мс |
| Пул из 4 потоков воркеров | 9.1 | 111мс |
Одиночный воркер здесь медленнее основного потока — ожидаемо: оверхед 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-workers | Comlink | vue-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