Справочник
Архитектура
vue-worker-kit
│
├── defineWorkerHandler() (vue-worker-kit/worker)
│ Подключает протокол сообщений run/cancel; запускает цикл обработки
│ только внутри Dedicated-/SharedWorkerGlobalScope, иначе — no-op
│ Фантомно типизированный маркер __input/__output — считывается
│ useWorker/createWorkerPool/useWorkerComputed через условный тип
│
├── useWorker() (основная точка входа)
│ Лениво создаёт один воркер через переданную фабрику
│ idleTimeout / retries / retryDelay / hardCancelOnAbort / cache / streaming
│ Автозавершение через onScopeDispose внутри setup(), плюс публичный terminate()
│
├── createWorkerPool() / useWorkerPool() (vue-worker-kit/pool)
│ Лениво создаёт до `size` воркеров по мере поступления задач
│ pool.run() / pool.map() с ограниченным параллелизмом + передачей по элементу
│ Callback'и onProgress / onChunk на run()/map() для прогресса и стриминга по задаче
│
├── useWorkerComputed() (vue-worker-kit/computed)
│ computed(), перезапускающий воркер при изменении реактивного источника
│ Обработка гонок через номера поколений — устаревшие результаты отбрасываются молча
│
├── useSharedWorker() (vue-worker-kit/shared)
│ Оборачивает одно соединение SharedWorker, общее для всех вкладок/окон
│ connect() / disconnect() — весь жизненный цикл целиком (нет idleTimeout)
│
└── Devtools (vue-worker-kit/devtools)
createWorkerActivityMonitor() + <WorkerActivityPanel> — реактивно,
на основе подписки (без опроса), без зависимости от @vue/devtools-apiПоддержка бандлеров. Не нужны 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 или аналог — это ограничение бандлера, а не этого пакета.
Совместимость с SSR
useWorker/useWorkerComputed/useWorkerPool безопасно вызывать в setup() на сервере — конструктор передаётся как фабрика (() => new Worker(...)) и вызывается только внутри run(), то есть в обычном сценарии только на клиенте. Если run() всё же вызван во время SSR, вы получите WorkerUnavailableError с понятным сообщением, а не падение. Защищайте клиентский код через <ClientOnly> в Nuxt:
<ClientOnly>
<ProgressBar v-if="isRunning" :value="progress" />
</ClientOnly>Размер бандла и peer-зависимости
| Точка входа | Peer-зависимости | Заметки |
|---|---|---|
vue-worker-kit | vue ^3.4 (обязательна) | Основная точка входа — useWorker() |
vue-worker-kit/worker | vue ^3.4 (обязательна) | defineWorkerHandler() — сторона воркера |
vue-worker-kit/pool | vue ^3.4 (обязательна) | createWorkerPool()/useWorkerPool() |
vue-worker-kit/computed | vue ^3.4 (обязательна) | useWorkerComputed() |
vue-worker-kit/shared | vue ^3.4 (обязательна) | useSharedWorker() |
vue-worker-kit/devtools | vue ^3.4 (обязательна) | Отладочная панель, без зависимости @vue/devtools-api |
Никаких зависимостей, кроме peer-зависимости vue — ни на одной точке входа нет других runtime-зависимостей. sideEffects: false; каждая точка входа — свой чанк, импорт одной не тянет за собой остальные.
Сравнение
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