Skip to content

Commit ea2d429

Browse files
authored
fix(browser): fix dynamic import inside worker (#6569)
1 parent f8ff76a commit ea2d429

File tree

6 files changed

+60
-0
lines changed

6 files changed

+60
-0
lines changed

packages/browser/src/node/plugin.ts

+14
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,20 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
368368
}
369369
},
370370
},
371+
{
372+
name: 'vitest:browser:worker',
373+
transform(code, id, _options) {
374+
// https://github.com/vitejs/vite/blob/ba56cf43b5480f8519349f7d7fe60718e9af5f1a/packages/vite/src/node/plugins/worker.ts#L46
375+
if (/(?:\?|&)worker_file&type=\w+(?:&|$)/.test(id)) {
376+
const s = new MagicString(code)
377+
s.prepend('globalThis.__vitest_browser_runner__ = { wrapDynamicImport: f => f() };\n')
378+
return {
379+
code: s.toString(),
380+
map: s.generateMap({ hires: 'boundary' }),
381+
}
382+
}
383+
},
384+
},
371385
// TODO: remove this when @testing-library/vue supports ESM
372386
{
373387
name: 'vitest:browser:support-testing-library',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { expect, test } from 'vitest'
2+
3+
test('worker dynamic dep', async () => {
4+
const worker = new Worker(new URL('./worker', import.meta.url), { type: 'module' });
5+
const data = await new Promise((resolve, reject) => {
6+
worker.addEventListener("message", (e) => resolve(e.data))
7+
worker.addEventListener("messageerror", (e) => reject(e))
8+
worker.postMessage("ping");
9+
});
10+
expect(data).toMatchInlineSnapshot(`"worker-dynamic-dep-ok"`);
11+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default "worker-dynamic-dep-ok"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
self.onmessage = async () => {
2+
const mod = await import("./worker-dynamic-dep");
3+
self.postMessage(mod.default);
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { fileURLToPath } from 'node:url'
2+
import { defineConfig } from 'vitest/config'
3+
4+
const provider = process.env.PROVIDER || 'playwright'
5+
const name =
6+
process.env.BROWSER || (provider === 'playwright' ? 'chromium' : 'chrome')
7+
8+
export default defineConfig({
9+
cacheDir: fileURLToPath(new URL("./node_modules/.vite", import.meta.url)),
10+
test: {
11+
browser: {
12+
enabled: true,
13+
provider,
14+
name,
15+
},
16+
},
17+
})

test/browser/specs/worker.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { expect, test } from 'vitest'
2+
import { runBrowserTests } from './utils'
3+
4+
test('worker', async () => {
5+
const { ctx } = await runBrowserTests({
6+
root: './fixtures/worker',
7+
})
8+
expect(Object.fromEntries(ctx.state.getFiles().map(f => [f.name, f.result.state]))).toMatchInlineSnapshot(`
9+
{
10+
"src/basic.test.ts": "pass",
11+
}
12+
`)
13+
})

0 commit comments

Comments
 (0)