Skip to content

Commit

Permalink
fix(worker): worker import.meta.url should not depends on document in…
Browse files Browse the repository at this point in the history
… iife mode (#12629)

Co-authored-by: 翠 / green <[email protected]>
  • Loading branch information
sun0day and sapphi-red authored Apr 2, 2023
1 parent 81e44dd commit 65f5ed2
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 6 deletions.
2 changes: 2 additions & 0 deletions packages/vite/src/node/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import { ESBUILD_MODULES_TARGET, VERSION } from './constants'
import { resolveChokidarOptions } from './watch'
import { completeSystemWrapPlugin } from './plugins/completeSystemWrap'
import { mergeConfig } from './publicUtils'
import { webWorkerPostPlugin } from './plugins/worker'

export interface BuildOptions {
/**
Expand Down Expand Up @@ -445,6 +446,7 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{
: [rollupOptionsPlugins],
)
).filter(Boolean) as Plugin[]),
...(config.isWorker ? [webWorkerPostPlugin()] : []),
],
post: [
buildImportAnalysisPlugin(config),
Expand Down
14 changes: 14 additions & 0 deletions packages/vite/src/node/plugins/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,20 @@ export async function workerFileToUrl(
return encodeWorkerAssetFileName(fileName, workerMap)
}

export function webWorkerPostPlugin(): Plugin {
return {
name: 'vite:worker-post',
resolveImportMeta(property, { chunkId, format }) {
// document is undefined in the worker, so we need to avoid it in iife
if (property === 'url' && format === 'iife') {
return 'self.location.href'
}

return null
},
}
}

export function webWorkerPlugin(config: ResolvedConfig): Plugin {
const isBuild = config.command === 'build'
let server: ViteDevServer
Expand Down
9 changes: 7 additions & 2 deletions playground/test-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,19 @@ export function readManifest(base = ''): Manifest {
*/
export async function untilUpdated(
poll: () => string | Promise<string>,
expected: string,
expected: string | RegExp,
runInBuild = false,
): Promise<void> {
if (isBuild && !runInBuild) return
const maxTries = process.env.CI ? 200 : 50
for (let tries = 0; tries < maxTries; tries++) {
const actual = (await poll()) ?? ''
if (actual.indexOf(expected) > -1 || tries === maxTries - 1) {
if (
(typeof expected === 'string'
? actual.indexOf(expected) > -1
: actual.match(expected)) ||
tries === maxTries - 1
) {
expect(actual).toMatch(expected)
break
} else {
Expand Down
9 changes: 6 additions & 3 deletions playground/worker/__tests__/iife/iife-worker.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,19 @@ describe.runIf(isBuild)('build', () => {

test('module worker', async () => {
await untilUpdated(
() => page.textContent('.worker-import-meta-url'),
'A string',
async () => page.textContent('.worker-import-meta-url'),
/A\sstring.*\/iife\/.+url-worker\.js/,
true,
)
await untilUpdated(
() => page.textContent('.worker-import-meta-url-resolve'),
'A string',
/A\sstring.*\/iife\/.+url-worker\.js/,
true,
)
await untilUpdated(
() => page.textContent('.shared-worker-import-meta-url'),
'A string',
true,
)
})

Expand Down
9 changes: 8 additions & 1 deletion playground/worker/url-worker.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
self.postMessage('A string' + import.meta.env.BASE_URL + self.location.url)
self.postMessage(
[
'A string',
import.meta.env.BASE_URL,
self.location.url,
import.meta.url,
].join(' '),
)

// for sourcemap
console.log('url-worker.js')

0 comments on commit 65f5ed2

Please sign in to comment.