Общий воркер
useSharedWorker() (vue-worker-kit/shared) — переиспользует один SharedWorker для всех вкладок/окон одного источника, которые к нему подключаются, вместо одного воркера на вкладку.
import { useSharedWorker } from 'vue-worker-kit/shared'
const { run, connect, disconnect, portCount } = useSharedWorker<typeof import('./shared.worker')>(
() => new SharedWorker(new URL('./shared.worker.ts', import.meta.url), { type: 'module' }),
)
// Опционально — run() подключается лениво сам; вызовите это, чтобы подключиться заранее.
connect()
const result = await run(data)
// Закрывает порт этой вкладки. НЕ завершает воркер — остальные вкладки остаются подключены.
disconnect()Файл на стороне воркера — обычный модуль defineWorkerHandler(): тот же самый файл работает и с new Worker(...) (через useWorker()), и с new SharedWorker(...) (через useSharedWorker()); ему не нужно знать, под каким из них он выполняется.
// shared.worker.ts
import { defineWorkerHandler } from 'vue-worker-kit/worker'
export default defineWorkerHandler(async (data: In, ctx) => {
return processData(data)
})Поддержка браузеров: Chrome, Firefox, Edge Desktop. ❌ Не поддерживается в Safari iOS или Chrome Android — там конструктор SharedWorker вообще не существует. connect()/run() в этом случае бросают WorkerUnavailableError, так же как useWorker() при SSR.
Опции
Как у useWorker(): retries, retryDelay, cache, streaming. Нет idleTimeout/hardCancelOnAbort: время жизни общего воркера не принадлежит какой-то одной вкладке, поэтому connect()/disconnect() — это весь жизненный цикл целиком, а не таймер простоя.
Возвращаемое значение
connect()
() => void
Устанавливает соединение этой вкладки. Идемпотентно; run() тоже вызывает его лениво, если вы пропустили этот шаг.
disconnect()
() => void
Закрывает только порт этой вкладки; общий воркер продолжает работать для всех остальных подключённых вкладок. Вызывается автоматически при onScopeDispose, если используется внутри setup().
portCount
Ref<number>
Количество вкладок, чьё подключение видел воркер, по последней рассылке от самого воркера. Best-effort: у MessagePort нет уведомления уровня платформы о том, что «другая сторона пропала», поэтому значение уменьшается только по кооперативному вызову disconnect() — упавшая или принудительно закрытая вкладка никогда не вычитается.
run, isRunning, progress, error, cancel()
Та же семантика, что и у useWorker().