Skip to content

Commit

Permalink
feat(worker): support self reference (new URL)
Browse files Browse the repository at this point in the history
  • Loading branch information
sapphi-red committed Mar 6, 2024
1 parent 5f1b77e commit b779f40
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 18 deletions.
34 changes: 21 additions & 13 deletions packages/vite/src/node/plugins/workerImportMetaUrl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,22 +165,30 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
: slash(path.resolve(path.dirname(id), url))
}

let builtUrl: string
if (isBuild) {
builtUrl = await workerFileToUrl(config, file)
if (
isBuild &&
config.isWorker &&
this.getModuleInfo(cleanUrl(file))?.isEntry
) {
s.update(expStart, expEnd, 'self.location.href')
} else {
builtUrl = await fileToUrl(cleanUrl(file), config, this)
builtUrl = injectQuery(
builtUrl,
`${WORKER_FILE_ID}&type=${workerType}`,
let builtUrl: string
if (isBuild) {
builtUrl = await workerFileToUrl(config, file)
} else {
builtUrl = await fileToUrl(cleanUrl(file), config, this)
builtUrl = injectQuery(
builtUrl,
`${WORKER_FILE_ID}&type=${workerType}`,
)
}
s.update(
expStart,
expEnd,
// add `'' +` to skip vite:asset-import-meta-url plugin
`new URL('' + ${JSON.stringify(builtUrl)}, import.meta.url)`,
)
}
s.update(
expStart,
expEnd,
// add `'' +` to skip vite:asset-import-meta-url plugin
`new URL('' + ${JSON.stringify(builtUrl)}, import.meta.url)`,
)
}

if (s) {
Expand Down
8 changes: 7 additions & 1 deletion playground/worker/__tests__/es/worker-es.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ describe.runIf(isBuild)('build', () => {
test('inlined code generation', async () => {
const assetsDir = path.resolve(testDir, 'dist/es/assets')
const files = fs.readdirSync(assetsDir)
expect(files.length).toBe(33)
expect(files.length).toBe(34)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const worker = files.find((f) => f.includes('my-worker'))
Expand Down Expand Up @@ -234,3 +234,9 @@ test('self reference worker', async () => {
'pong: main\npong: nested\n',
)
})

test('self reference url worker', async () => {
expectWithRetry(() => page.textContent('.self-reference-url-worker')).toBe(
'pong: main\npong: nested\n',
)
})
8 changes: 7 additions & 1 deletion playground/worker/__tests__/iife/worker-iife.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ describe.runIf(isBuild)('build', () => {
test('inlined code generation', async () => {
const assetsDir = path.resolve(testDir, 'dist/iife/assets')
const files = fs.readdirSync(assetsDir)
expect(files.length).toBe(21)
expect(files.length).toBe(22)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const worker = files.find((f) => f.includes('worker_entry-my-worker'))
Expand Down Expand Up @@ -167,6 +167,12 @@ test('self reference worker', async () => {
)
})

test('self reference url worker', async () => {
expectWithRetry(() => page.textContent('.self-reference-url-worker')).toBe(
'pong: main\npong: nested\n',
)
})

test.runIf(isServe)('sourcemap boundary', async () => {
const response = page.waitForResponse(/my-worker.ts\?worker_file&type=module/)
await page.goto(viteTestUrl)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,9 @@ test('self reference worker', async () => {
'pong: main\npong: nested\n',
)
})

test('self reference url worker', async () => {
expectWithRetry(() => page.textContent('.self-reference-url-worker')).toBe(
'pong: main\npong: nested\n',
)
})
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe.runIf(isBuild)('build', () => {

const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
expect(files.length).toBe(42)
expect(files.length).toBe(44)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe.runIf(isBuild)('build', () => {

const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
expect(files.length).toBe(21)
expect(files.length).toBe(22)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ describe.runIf(isBuild)('build', () => {
const assetsDir = path.resolve(testDir, 'dist/iife-sourcemap/assets')
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
expect(files.length).toBe(42)
expect(files.length).toBe(44)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
Expand Down
6 changes: 6 additions & 0 deletions playground/worker/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ <h2 class="format-iife">format iife:</h2>
</p>
<code class="self-reference-worker"></code>

<p>
new Worker(new URL('../self-reference-url-worker.js', import.meta.url))
<span class="classname">.self-reference-url-worker</span>
</p>
<code class="self-reference-url-worker"></code>

<p>
new Worker(new URL('../deeply-nested-worker.js', import.meta.url), { type:
'module' })
Expand Down
13 changes: 13 additions & 0 deletions playground/worker/self-reference-url-worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
self.addEventListener('message', (e) => {
if (e.data === 'main') {
const selfWorker = new Worker(
new URL('./self-reference-url-worker.js', import.meta.url),
)
selfWorker.postMessage('nested')
selfWorker.addEventListener('message', (e) => {
self.postMessage(e.data)
})
}

self.postMessage(`pong: ${e.data}`)
})
9 changes: 9 additions & 0 deletions playground/worker/worker/main-module.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,12 @@ selfReferenceWorker.postMessage('main')
selfReferenceWorker.addEventListener('message', (e) => {
document.querySelector('.self-reference-worker').textContent += `${e.data}\n`
})

const selfReferenceUrlWorker = new Worker(
new URL('../self-reference-url-worker.js', import.meta.url),
)
selfReferenceUrlWorker.postMessage('main')
selfReferenceUrlWorker.addEventListener('message', (e) => {
document.querySelector('.self-reference-url-worker').textContent +=
`${e.data}\n`
})

0 comments on commit b779f40

Please sign in to comment.