Web Worker support for Vitest testing. Doesn't require JSDom.
Simulates Web Worker, but in the same thread.
Supported:
new Worker(path)
new SharedWorker(path)
import MyWorker from './worker?worker'
import MySharedWorker from './worker?sharedworker'
# with npm
npm install -D @vitest/web-worker
# with pnpm
pnpm install -D @vitest/web-worker
# with yarn
yarn add --dev @vitest/web-worker
Just import @vitest/web-worker
in your test file to test only in current suite.
Or add @vitest/web-worker
in your setupFiles
, if you want to have a global support.
import { defineConfig } from 'vitest/node'
export default defineConfig({
test: {
setupFiles: ['@vitest/web-worker'],
},
})
You can also import defineWebWorkers
from @vitest/web-worker/pure
to define workers, whenever you need:
import { defineWebWorkers } from '@vitest/web-worker/pure'
if (process.env.SUPPORT_WORKERS) {
defineWebWorkers({ clone: 'none' })
}
It accepts options:
-
clone
:'native' | 'ponyfill' | 'none'
. Defines how shouldWorker
clone message, when transferring data. Applies only toWorker
communication.SharedWorker
usesMessageChannel
from Node'sworker_threads
module, and is not configurable.
Note Requires Node 17, if you want to use native
structuredClone
. Otherwise, it fallbacks to polyfill, if not specified asnone
. You can also configure this option withVITEST_WEB_WORKER_CLONE
environmental variable.
// worker.ts
self.onmessage = (e) => {
self.postMessage(`${e.data} world`)
}
// worker.test.ts
import '@vitest/web-worker'
import MyWorker from '../worker?worker'
let worker = new MyWorker()
// new Worker is also supported
worker = new Worker(new URL('../src/worker.ts', import.meta.url))
worker.postMessage('hello')
worker.onmessage = (e) => {
// e.data equals to 'hello world'
}
- Worker does not support
onmessage = () => {}
. Please, useself.onmessage = () => {}
. - Shared worker does not support
onconnect = () => {}
. Please, useself.onconnect = () => {}
. - Transferring Buffer will not change its
byteLength
. - You have access to shared global space as your tests.
- You can debug your worker, using
DEBUG=vitest:web-worker
environmental variable.