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

Lines changed: 14 additions & 0 deletions
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',
Lines changed: 11 additions & 0 deletions
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+
})
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default "worker-dynamic-dep-ok"
Lines changed: 4 additions & 0 deletions
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+
}
Lines changed: 17 additions & 0 deletions
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

Lines changed: 13 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy