Skip to content

Commit 391bb49

Browse files
authoredAug 15, 2024··
fix(worker): handle self reference url worker in dependency for build (#17846)
1 parent e686d74 commit 391bb49

File tree

15 files changed

+68
-7
lines changed

15 files changed

+68
-7
lines changed
 

‎packages/vite/src/node/plugins/worker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
292292

293293
let urlCode: string
294294
if (isBuild) {
295-
if (isWorker && this.getModuleInfo(cleanUrl(id))?.isEntry) {
295+
if (isWorker && config.bundleChain.at(-1) === cleanUrl(id)) {
296296
urlCode = 'self.location.href'
297297
} else if (inlineRE.test(id)) {
298298
const chunk = await bundleWorkerEntry(config, id)

‎packages/vite/src/node/plugins/workerImportMetaUrl.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
171171
if (
172172
isBuild &&
173173
config.isWorker &&
174-
this.getModuleInfo(cleanUrl(file))?.isEntry
174+
config.bundleChain.at(-1) === cleanUrl(file)
175175
) {
176176
s.update(expStart, expEnd, 'self.location.href')
177177
} else {

‎playground/worker/__tests__/es/worker-es.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ describe.runIf(isBuild)('build', () => {
111111
test('inlined code generation', async () => {
112112
const assetsDir = path.resolve(testDir, 'dist/es/assets')
113113
const files = fs.readdirSync(assetsDir)
114-
expect(files.length).toBe(34)
114+
expect(files.length).toBe(35)
115115
const index = files.find((f) => f.includes('main-module'))
116116
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
117117
const worker = files.find((f) => f.includes('my-worker'))

‎playground/worker/__tests__/iife/worker-iife.spec.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ describe.runIf(isBuild)('build', () => {
7575
test('inlined code generation', async () => {
7676
const assetsDir = path.resolve(testDir, 'dist/iife/assets')
7777
const files = fs.readdirSync(assetsDir)
78-
expect(files.length).toBe(22)
78+
expect(files.length).toBe(23)
7979
const index = files.find((f) => f.includes('main-module'))
8080
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
8181
const worker = files.find((f) => f.includes('worker_entry-my-worker'))
@@ -173,6 +173,12 @@ test('self reference url worker', async () => {
173173
).toBe('pong: main\npong: nested\n')
174174
})
175175

176+
test('self reference url worker in dependency', async () => {
177+
await expectWithRetry(() =>
178+
page.textContent('.self-reference-url-worker-dep'),
179+
).toBe('pong: main\npong: nested\n')
180+
})
181+
176182
test.runIf(isServe)('sourcemap boundary', async () => {
177183
const response = page.waitForResponse(/my-worker.ts\?worker_file&type=module/)
178184
await page.goto(viteTestUrl)

‎playground/worker/__tests__/sourcemap-hidden/worker-sourcemap-hidden.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe.runIf(isBuild)('build', () => {
1010

1111
const files = fs.readdirSync(assetsDir)
1212
// should have 2 worker chunk
13-
expect(files.length).toBe(44)
13+
expect(files.length).toBe(46)
1414
const index = files.find((f) => f.includes('main-module'))
1515
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
1616
const indexSourcemap = getSourceMapUrl(content)

‎playground/worker/__tests__/sourcemap-inline/worker-sourcemap-inline.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe.runIf(isBuild)('build', () => {
1010

1111
const files = fs.readdirSync(assetsDir)
1212
// should have 2 worker chunk
13-
expect(files.length).toBe(22)
13+
expect(files.length).toBe(23)
1414
const index = files.find((f) => f.includes('main-module'))
1515
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
1616
const indexSourcemap = getSourceMapUrl(content)

‎playground/worker/__tests__/sourcemap/worker-sourcemap.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe.runIf(isBuild)('build', () => {
99
const assetsDir = path.resolve(testDir, 'dist/iife-sourcemap/assets')
1010
const files = fs.readdirSync(assetsDir)
1111
// should have 2 worker chunk
12-
expect(files.length).toBe(44)
12+
expect(files.length).toBe(46)
1313
const index = files.find((f) => f.includes('main-module'))
1414
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
1515
const indexSourcemap = getSourceMapUrl(content)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export function startWorker(handler) {
2+
const worker = new Worker(new URL('./worker.js', import.meta.url), {
3+
type: 'module',
4+
})
5+
worker.postMessage('main')
6+
worker.addEventListener('message', (e) => {
7+
handler(e)
8+
})
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "@vitejs/test-dep-self-reference-url-worker",
3+
"private": true,
4+
"version": "1.0.0",
5+
"type": "module",
6+
"main": "index.js"
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// copy of playground/worker/self-reference-url-worker.js
2+
self.addEventListener('message', (e) => {
3+
if (e.data === 'main') {
4+
const selfWorker = new Worker(new URL('./worker.js', import.meta.url), {
5+
type: 'module',
6+
})
7+
selfWorker.postMessage('nested')
8+
selfWorker.addEventListener('message', (e) => {
9+
self.postMessage(e.data)
10+
})
11+
}
12+
13+
self.postMessage(`pong: ${e.data}`)
14+
})

‎playground/worker/index.html

+5
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ <h2 class="format-iife">format iife:</h2>
164164
</p>
165165
<code class="self-reference-url-worker"></code>
166166

167+
<p>
168+
<span class="classname">.self-reference-url-worker-dep</span>
169+
</p>
170+
<code class="self-reference-url-worker-dep"></code>
171+
167172
<p>
168173
new Worker(new URL('../deeply-nested-worker.js', import.meta.url), { type:
169174
'module' })

‎playground/worker/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"debug": "node --inspect-brk ../../packages/vite/bin/vite"
2929
},
3030
"dependencies": {
31+
"@vitejs/test-dep-self-reference-url-worker": "file:./dep-self-reference-url-worker",
3132
"@vitejs/test-dep-to-optimize": "file:./dep-to-optimize"
3233
}
3334
}

‎playground/worker/vite.config-iife.js

+3
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ export default defineConfig({
5151
},
5252
],
5353
cacheDir: 'node_modules/.vite-iife',
54+
optimizeDeps: {
55+
exclude: ['@vitejs/test-dep-self-reference-url-worker'],
56+
},
5457
})

‎playground/worker/worker/main-module.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as depSelfReferenceUrlWorker from '@vitejs/test-dep-self-reference-url-worker'
12
import myWorker from '../my-worker.ts?worker'
23
import InlineWorker from '../my-worker.ts?worker&inline'
34
import InlineSharedWorker from '../my-inline-shared-worker?sharedworker&inline'
@@ -177,3 +178,8 @@ selfReferenceUrlWorker.addEventListener('message', (e) => {
177178
document.querySelector('.self-reference-url-worker').textContent +=
178179
`${e.data}\n`
179180
})
181+
182+
depSelfReferenceUrlWorker.startWorker((e) => {
183+
document.querySelector('.self-reference-url-worker-dep').textContent +=
184+
`${e.data}\n`
185+
})

‎pnpm-lock.yaml

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.