$ npm install @vitest/web-workerWeb 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 should Worker clone message, when transferring data. Applies only to Worker communication. SharedWorker uses MessageChannel from Node's worker_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_CLONEenvironmental 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'
}
onmessage = () => {}. Please, use self.onmessage = () => {}.onconnect = () => {}. Please, use self.onconnect = () => {}.byteLength.DEBUG=vitest:web-worker environmental variable.