From f649f8ac844cf6051ff8a747f3bf74cd0f9dc945 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 10:37:00 +0800
Subject: [PATCH 01/17] fix: import.meta.*
---
.../worker/__tests__/es/es-worker.spec.ts | 19 ++++++++++--
.../worker/__tests__/iife/worker.spec.ts | 13 ++++++---
.../sourcemap-hidden-worker.spec.ts | 2 +-
.../sourcemap-inline-worker.spec.ts | 2 +-
.../sourcemap/sourcemap-worker.spec.ts | 2 +-
.../worker/importMetaGlob.worker.js | 5 ++++
.../worker/importMetaGlobEager.worker.js | 5 ++++
packages/playground/worker/index.html | 29 ++++++++++++++++++-
.../playground/worker/worker-nested-worker.js | 19 ++++++++++--
.../worker/worker/main-format-es.js | 9 ++++++
.../playground/worker/worker/main-module.js | 13 +++++++++
.../src/node/plugins/importAnalysisBuild.ts | 23 ++++++++++-----
packages/vite/src/node/plugins/index.ts | 3 +-
packages/vite/src/node/plugins/worker.ts | 22 ++++++++++----
14 files changed, 140 insertions(+), 26 deletions(-)
create mode 100644 packages/playground/worker/importMetaGlob.worker.js
create mode 100644 packages/playground/worker/importMetaGlobEager.worker.js
diff --git a/packages/playground/worker/__tests__/es/es-worker.spec.ts b/packages/playground/worker/__tests__/es/es-worker.spec.ts
index c7fd0d6c19e4bc..ac201ed21ef8dd 100644
--- a/packages/playground/worker/__tests__/es/es-worker.spec.ts
+++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts
@@ -51,8 +51,12 @@ test.concurrent.each([[true], [false]])('shared worker', async (doTick) => {
await waitSharedWorkerTick(page)
})
-test('worker emitted', async () => {
- await untilUpdated(() => page.textContent('.nested-worker'), 'pong')
+test('worker emitted and import.meta.url in nested worker', async () => {
+ expect(await page.textContent('.nested-worker')).toMatch('/worker-nested')
+ expect(await page.textContent('.nested-worker-module')).toMatch('/sub-worker')
+ expect(await page.textContent('.nested-worker-constructor')).toMatch(
+ '"type":"constructor"'
+ )
})
if (isBuild) {
@@ -60,7 +64,7 @@ if (isBuild) {
// assert correct files
test('inlined code generation', async () => {
const files = fs.readdirSync(assetsDir)
- expect(files.length).toBe(22)
+ expect(files.length).toBe(27)
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'))
@@ -100,3 +104,12 @@ test('emit chunk', async () => {
'"A string/es/"'
)
})
+
+test('import.meta.glob in worker', async () => {
+ expect(await page.textContent('.importMetaGlob-worker')).toMatch('["')
+})
+
+// FIXME after buildEsbuildPlugin renderChunk export default a() break token
+// test('import.meta.globEager in worker', async () => {
+// expect(await page.textContent('.importMetaGlobEager-worker')).toMatch('["')
+// })
diff --git a/packages/playground/worker/__tests__/iife/worker.spec.ts b/packages/playground/worker/__tests__/iife/worker.spec.ts
index fa9f72fe76131c..a03ecf105a1945 100644
--- a/packages/playground/worker/__tests__/iife/worker.spec.ts
+++ b/packages/playground/worker/__tests__/iife/worker.spec.ts
@@ -52,9 +52,10 @@ test.concurrent.each([[true], [false]])('shared worker', async (doTick) => {
})
test('worker emitted and import.meta.url in nested worker', async () => {
- await untilUpdated(
- () => page.textContent('.nested-worker'),
- 'pong http://localhost:3000/iife/sub-worker.js?worker_file'
+ expect(await page.textContent('.nested-worker')).toMatch('/worker-nested')
+ expect(await page.textContent('.nested-worker-module')).toMatch('/sub-worker')
+ expect(await page.textContent('.nested-worker-constructor')).toMatch(
+ '"type":"constructor"'
)
})
@@ -63,7 +64,7 @@ if (isBuild) {
// assert correct files
test('inlined code generation', async () => {
const files = fs.readdirSync(assetsDir)
- expect(files.length).toBe(13)
+ expect(files.length).toBe(14)
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'))
@@ -94,3 +95,7 @@ test('classic worker', async () => {
expect(await page.textContent('.classic-worker')).toMatch('A classic')
expect(await page.textContent('.classic-shared-worker')).toMatch('A classic')
})
+
+test('import.meta.globEager in worker', async () => {
+ expect(await page.textContent('.importMetaGlobEager-worker')).toMatch('["')
+})
diff --git a/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
index d846a5de2311d0..0ebe14ff672d65 100644
--- a/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(25)
+ expect(files.length).toBe(27)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
diff --git a/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
index ceda7dae1fec7c..8760e1f5d27ffc 100644
--- a/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(13)
+ expect(files.length).toBe(14)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
diff --git a/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
index 54e4f1cb9f2d58..74041d34fc3f61 100644
--- a/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(25)
+ expect(files.length).toBe(27)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
diff --git a/packages/playground/worker/importMetaGlob.worker.js b/packages/playground/worker/importMetaGlob.worker.js
new file mode 100644
index 00000000000000..1a9e536ce877f6
--- /dev/null
+++ b/packages/playground/worker/importMetaGlob.worker.js
@@ -0,0 +1,5 @@
+const modules = import.meta.glob('./modules/*js')
+
+self.onmessage = function (e) {
+ self.postMessage(Object.keys(modules))
+}
diff --git a/packages/playground/worker/importMetaGlobEager.worker.js b/packages/playground/worker/importMetaGlobEager.worker.js
new file mode 100644
index 00000000000000..485d6dec7bd152
--- /dev/null
+++ b/packages/playground/worker/importMetaGlobEager.worker.js
@@ -0,0 +1,5 @@
+const modules = import.meta.globEager('./modules/*js')
+
+self.onmessage = function (e) {
+ self.postMessage(Object.keys(modules))
+}
diff --git a/packages/playground/worker/index.html b/packages/playground/worker/index.html
index 602aa3d06bfcac..b0c524305fc33e 100644
--- a/packages/playground/worker/index.html
+++ b/packages/playground/worker/index.html
@@ -40,11 +40,25 @@
- import NestedWorker from './worker-nested-worker?worker' - nested worker
+ import NestedWorker from './worker-nested-worker?worker' - import.meta.url
.nested-worker
+
+ import NestedWorker from './worker-nested-worker?worker' - nested module
+ worker
+ .nested-worker-module
+
+
+
+
+ import NestedWorker from './worker-nested-worker?worker' - nested worker
+ constructor
+ .nested-worker-constructor
+
+
+
new Worker(new URL('./classic-worker.js', import.meta.url))
.classic-worker
@@ -58,9 +72,22 @@
+
+ use import.meta.globEager in iife worker
+ .importMetaGlobEager-worker
+
+
+
+
+
+ use import.meta.glob in es worker
+ .importMetaGlob-worker
+
+
+
worker emit chunk
module and worker:worker in worker file
diff --git a/packages/playground/worker/worker-nested-worker.js b/packages/playground/worker/worker-nested-worker.js
index 6d4d1e4969005f..460be65cdce57f 100644
--- a/packages/playground/worker/worker-nested-worker.js
+++ b/packages/playground/worker/worker-nested-worker.js
@@ -8,6 +8,21 @@ self.onmessage = (event) => {
}
}
-subWorker.onmessage = (event) => {
- self.postMessage(event.data)
+self.postMessage(import.meta.url)
+
+subWorker.onmessage = (ev) => {
+ self.postMessage({
+ type: 'module',
+ data: ev.data
+ })
}
+
+const classicWorker = new Worker(new URL('./url-worker.js', import.meta.url), {
+ type: 'module'
+})
+classicWorker.addEventListener('message', (ev) => {
+ self.postMessage({
+ type: 'constructor',
+ data: ev.data
+ })
+})
diff --git a/packages/playground/worker/worker/main-format-es.js b/packages/playground/worker/worker/main-format-es.js
index 801c13469151a3..e418c82a136927 100644
--- a/packages/playground/worker/worker/main-format-es.js
+++ b/packages/playground/worker/worker/main-format-es.js
@@ -1,5 +1,6 @@
// run when format es
import NestedWorker from '../emit-chunk-nested-worker?worker'
+import ImportMetaGlobWorker from '../importMetaGlob.worker?worker'
function text(el, text) {
document.querySelector(el).textContent = text
@@ -39,3 +40,11 @@ const moduleWorker = new Worker(
moduleWorker.addEventListener('message', (ev) => {
text('.module-and-worker-worker', JSON.stringify(ev.data))
})
+
+const importMetaGlobWorker = new ImportMetaGlobWorker()
+
+importMetaGlobWorker.postMessage('1')
+
+importMetaGlobWorker.addEventListener('message', (e) => {
+ text('.importMetaGlob-worker', JSON.stringify(e.data))
+})
diff --git a/packages/playground/worker/worker/main-module.js b/packages/playground/worker/worker/main-module.js
index 417cf1728c4b09..b8882ebdbd3038 100644
--- a/packages/playground/worker/worker/main-module.js
+++ b/packages/playground/worker/worker/main-module.js
@@ -3,6 +3,7 @@ import InlineWorker from '../my-worker?worker&inline'
import mySharedWorker from '../my-shared-worker?sharedworker&name=shared'
import TSOutputWorker from '../possible-ts-output-worker?worker'
import NestedWorker from '../worker-nested-worker?worker'
+import ImportMetaGlobEagerWorker from '../importMetaGlobEager.worker?worker'
import { mode } from '../modules/workerImport'
function text(el, text) {
@@ -56,6 +57,10 @@ const nestedWorker = new NestedWorker()
nestedWorker.addEventListener('message', (ev) => {
if (typeof ev.data === 'string') {
text('.nested-worker', JSON.stringify(ev.data))
+ } else if (ev.data.type === 'module') {
+ text('.nested-worker-module', JSON.stringify(ev.data))
+ } else if (ev.data.type === 'constructor') {
+ text('.nested-worker-constructor', JSON.stringify(ev.data))
}
})
nestedWorker.postMessage('ping')
@@ -83,3 +88,11 @@ w2.port.addEventListener('message', (ev) => {
text('.shared-worker-import-meta-url', JSON.stringify(ev.data))
})
w2.port.start()
+
+const importMetaGlobEagerWorker = new ImportMetaGlobEagerWorker()
+
+importMetaGlobEagerWorker.postMessage('1')
+
+importMetaGlobEagerWorker.addEventListener('message', (e) => {
+ text('.importMetaGlobEager-worker', JSON.stringify(e.data))
+})
diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts
index 91ce663b9f8111..d27fa19cdfb3ac 100644
--- a/packages/vite/src/node/plugins/importAnalysisBuild.ts
+++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts
@@ -85,8 +85,8 @@ function preload(baseModule: () => Promise<{}>, deps?: string[]) {
*/
export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
const ssr = !!config.build.ssr
- const insertPreload = !(ssr || !!config.build.lib)
const isWorker = config.isWorker
+ const insertPreload = !(ssr || !!config.build.lib || isWorker)
const scriptRel = config.build.polyfillModulePreload
? `'modulepreload'`
@@ -121,11 +121,6 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
return
}
- if (isWorker) {
- // preload method use `document` and can't run in the worker
- return
- }
-
await init
let imports: readonly ImportSpecifier[] = []
@@ -157,6 +152,18 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
source.slice(start, end) === 'import.meta' &&
source.slice(end, end + 5) === '.glob'
) {
+ // es worker allow globEager / glob
+ // iife worker just allow globEager
+ if (
+ isWorker &&
+ config.worker.format === 'iife' &&
+ source.slice(end, end + 10) !== '.globEager'
+ ) {
+ this.error(
+ 'can not use dynamic import(import.meta.glob) in iife worker. Just support import.meta.globEager in iife worker.',
+ end
+ )
+ }
const { importsString, exp, endIndex, isEager } =
await transformImportGlob(
source,
@@ -180,7 +187,9 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
if (dynamicIndex > -1 && insertPreload) {
needPreloadHelper = true
const original = source.slice(expStart, expEnd)
- const replacement = `${preloadMethod}(() => ${original},${isModernFlag}?"${preloadMarker}":void 0)`
+ const replacement = isWorker
+ ? `() => ${original}`
+ : `${preloadMethod}(() => ${original},${isModernFlag}?"${preloadMarker}":void 0)`
str().overwrite(expStart, expEnd, replacement, { contentOnly: true })
}
diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts
index 2d34b99aebf1c5..6547c48a738471 100644
--- a/packages/vite/src/node/plugins/index.ts
+++ b/packages/vite/src/node/plugins/index.ts
@@ -12,7 +12,7 @@ import { clientInjectionsPlugin } from './clientInjections'
import { buildHtmlPlugin, htmlInlineProxyPlugin } from './html'
import { wasmPlugin } from './wasm'
import { modulePreloadPolyfillPlugin } from './modulePreloadPolyfill'
-import { webWorkerPlugin } from './worker'
+import { webWorkerPlugin, webWorkerImportMetaUrlPlugin } from './worker'
import { preAliasPlugin } from './preAlias'
import { definePlugin } from './define'
import { ssrRequireHookPlugin } from './ssrRequireHook'
@@ -72,6 +72,7 @@ export async function resolvePlugins(
isBuild && buildHtmlPlugin(config),
workerImportMetaUrlPlugin(config),
...buildPlugins.pre,
+ isBuild && webWorkerImportMetaUrlPlugin(config),
...postPlugins,
...buildPlugins.post,
// internal server-only plugins are always applied after everything else
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 4113b7153f9b35..6be21564be88d0 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -194,7 +194,6 @@ export async function workerFileToUrl(
export function webWorkerPlugin(config: ResolvedConfig): Plugin {
const isBuild = config.command === 'build'
- const isWorker = config.isWorker
return {
name: 'vite:worker',
@@ -276,11 +275,24 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
}`,
map: { mappings: '' } // Empty sourcemap to supress Rolup warning
}
- },
+ }
+ }
+}
+
+// just run in build mode
+export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
+ const isWorker = config.isWorker
- renderChunk(code) {
- if (isWorker && code.includes('import.meta.url')) {
- return code.replace('import.meta.url', 'self.location.href')
+ return {
+ name: 'vite:workerImportMetaUrl',
+ transform(code) {
+ if (isWorker && config.worker.format !== 'es') {
+ // if build with iife it will polyfill with rollup will be used document in the worker
+ // else if build with es it will replace with `define plugin` will got a unexpected data.
+ // so replace import.meta.url break the default handle.
+ // And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
+ // Otherwise, the following regex will be incorrectly matched.
+ return code.replaceAll('import.meta.url', 'self.location.href')
}
}
}
From 7dc0a6bc1edc644d7f870f1e13226dbabc9b8998 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 10:53:26 +0800
Subject: [PATCH 02/17] fix: test error
---
packages/vite/src/node/plugins/worker.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 6be21564be88d0..3cfdd9e4bc4f35 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -292,7 +292,7 @@ export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
// so replace import.meta.url break the default handle.
// And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
// Otherwise, the following regex will be incorrectly matched.
- return code.replaceAll('import.meta.url', 'self.location.href')
+ return code.replace('import.meta.url', 'self.location.href')
}
}
}
From 86ee074efa44922fb5c6d63a6a97101acc5cd07c Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 13:06:16 +0800
Subject: [PATCH 03/17] fix: replace all
---
packages/vite/src/node/plugins/worker.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 3cfdd9e4bc4f35..339ac045aa2bf9 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -292,7 +292,7 @@ export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
// so replace import.meta.url break the default handle.
// And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
// Otherwise, the following regex will be incorrectly matched.
- return code.replace('import.meta.url', 'self.location.href')
+ return code.replace(/\bimport.meta.url\b/g, 'self.location.href')
}
}
}
From 3a91442e71ef4f9916aae056e14a8645ee3cd97a Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 14:15:46 +0800
Subject: [PATCH 04/17] fix: test
---
.../worker/__tests__/es/es-worker.spec.ts | 29 +++++++++++++---
.../worker/__tests__/iife/worker.spec.ts | 22 ++++++++++++-
.../playground/worker/worker/main-module.js | 11 ++++---
packages/vite/src/node/plugins/worker.ts | 33 ++++++++++++-------
4 files changed, 73 insertions(+), 22 deletions(-)
diff --git a/packages/playground/worker/__tests__/es/es-worker.spec.ts b/packages/playground/worker/__tests__/es/es-worker.spec.ts
index ac201ed21ef8dd..77e8f6394a0f09 100644
--- a/packages/playground/worker/__tests__/es/es-worker.spec.ts
+++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts
@@ -51,7 +51,7 @@ test.concurrent.each([[true], [false]])('shared worker', async (doTick) => {
await waitSharedWorkerTick(page)
})
-test('worker emitted and import.meta.url in nested worker', async () => {
+test('worker emitted and import.meta.url in nested worker (serve)', async () => {
expect(await page.textContent('.nested-worker')).toMatch('/worker-nested')
expect(await page.textContent('.nested-worker-module')).toMatch('/sub-worker')
expect(await page.textContent('.nested-worker-constructor')).toMatch(
@@ -83,6 +83,26 @@ if (isBuild) {
expect(content).toMatch(`(window.URL||window.webkitURL).createObjectURL`)
expect(content).toMatch(`window.Blob`)
})
+
+ test('worker emitted and import.meta.url in nested worker (build)', async () => {
+ // import.meta.url will minify in esbuild in build mode so can't use runtime result.
+ const files = fs.readdirSync(assetsDir)
+ const nestedWorkerFile = files.find((f) =>
+ f.includes('worker-nested-worker')
+ )
+ const content = fs.readFileSync(
+ path.resolve(assetsDir, nestedWorkerFile),
+ 'utf-8'
+ )
+ expect(content).toMatch('self.location.href')
+
+ expect(await page.textContent('.nested-worker-module')).toMatch(
+ '"type":"module"'
+ )
+ expect(await page.textContent('.nested-worker-constructor')).toMatch(
+ '"type":"constructor"'
+ )
+ })
}
test('module worker', async () => {
@@ -109,7 +129,6 @@ test('import.meta.glob in worker', async () => {
expect(await page.textContent('.importMetaGlob-worker')).toMatch('["')
})
-// FIXME after buildEsbuildPlugin renderChunk export default a() break token
-// test('import.meta.globEager in worker', async () => {
-// expect(await page.textContent('.importMetaGlobEager-worker')).toMatch('["')
-// })
+test('import.meta.globEager in worker', async () => {
+ expect(await page.textContent('.importMetaGlobEager-worker')).toMatch('["')
+})
diff --git a/packages/playground/worker/__tests__/iife/worker.spec.ts b/packages/playground/worker/__tests__/iife/worker.spec.ts
index a03ecf105a1945..0e5e09dbd04b19 100644
--- a/packages/playground/worker/__tests__/iife/worker.spec.ts
+++ b/packages/playground/worker/__tests__/iife/worker.spec.ts
@@ -51,7 +51,7 @@ test.concurrent.each([[true], [false]])('shared worker', async (doTick) => {
await waitSharedWorkerTick(page)
})
-test('worker emitted and import.meta.url in nested worker', async () => {
+test('worker emitted and import.meta.url in nested worker (serve)', async () => {
expect(await page.textContent('.nested-worker')).toMatch('/worker-nested')
expect(await page.textContent('.nested-worker-module')).toMatch('/sub-worker')
expect(await page.textContent('.nested-worker-constructor')).toMatch(
@@ -83,6 +83,26 @@ if (isBuild) {
expect(content).toMatch(`(window.URL||window.webkitURL).createObjectURL`)
expect(content).toMatch(`window.Blob`)
})
+
+ test('worker emitted and import.meta.url in nested worker (build)', async () => {
+ // import.meta.url will minify in esbuild in build mode so can't use runtime result.
+ const files = fs.readdirSync(assetsDir)
+ const nestedWorkerFile = files.find((f) =>
+ f.includes('worker-nested-worker')
+ )
+ const content = fs.readFileSync(
+ path.resolve(assetsDir, nestedWorkerFile),
+ 'utf-8'
+ )
+ expect(content).toMatch('self.location.href')
+
+ expect(await page.textContent('.nested-worker-module')).toMatch(
+ '"type":"module"'
+ )
+ expect(await page.textContent('.nested-worker-constructor')).toMatch(
+ '"type":"constructor"'
+ )
+ })
}
test('module worker', async () => {
diff --git a/packages/playground/worker/worker/main-module.js b/packages/playground/worker/worker/main-module.js
index b8882ebdbd3038..6284ca63686e99 100644
--- a/packages/playground/worker/worker/main-module.js
+++ b/packages/playground/worker/worker/main-module.js
@@ -57,10 +57,13 @@ const nestedWorker = new NestedWorker()
nestedWorker.addEventListener('message', (ev) => {
if (typeof ev.data === 'string') {
text('.nested-worker', JSON.stringify(ev.data))
- } else if (ev.data.type === 'module') {
- text('.nested-worker-module', JSON.stringify(ev.data))
- } else if (ev.data.type === 'constructor') {
- text('.nested-worker-constructor', JSON.stringify(ev.data))
+ } else if (typeof ev.data === 'object') {
+ const data = ev.data
+ if (data.type === 'module') {
+ text('.nested-worker-module', JSON.stringify(ev.data))
+ } else if (data.type === 'constructor') {
+ text('.nested-worker-constructor', JSON.stringify(ev.data))
+ }
}
})
nestedWorker.postMessage('ping')
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 339ac045aa2bf9..a634b63de18335 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -58,6 +58,14 @@ function emitWorkerAssets(
)
}
+function emitWorkerSourcemap(
+ ctx: Rollup.TransformPluginContext,
+ config: ResolvedConfig,
+ asset: EmittedFile
+) {
+ return emitWorkerFile(ctx, config, asset, 'assets')
+}
+
function emitWorkerChunks(
ctx: Rollup.TransformPluginContext,
config: ResolvedConfig,
@@ -138,14 +146,11 @@ function emitSourcemapForWorkerEntry(
const contentHash = getAssetHash(content)
const fileName = `${basename}.${contentHash}.js.map`
const filePath = path.posix.join(config.build.assetsDir, fileName)
- if (!context.cache.has(contentHash)) {
- context.cache.set(contentHash, true)
- context.emitFile({
- fileName: filePath,
- type: 'asset',
- source: data
- })
- }
+ emitWorkerSourcemap(context, config, {
+ fileName: filePath,
+ type: 'asset',
+ source: data
+ })
// Emit the comment that tells the JS debugger where it can find the
// sourcemap file.
@@ -286,13 +291,17 @@ export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
return {
name: 'vite:workerImportMetaUrl',
transform(code) {
- if (isWorker && config.worker.format !== 'es') {
- // if build with iife it will polyfill with rollup will be used document in the worker
- // else if build with es it will replace with `define plugin` will got a unexpected data.
+ if (isWorker) {
+ // if build with iife it will polyfill with `rollup` will be used document in the worker
+ // else if build with es it will replace with `esbuild` will got a unexpected data.
// so replace import.meta.url break the default handle.
// And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
// Otherwise, the following regex will be incorrectly matched.
- return code.replace(/\bimport.meta.url\b/g, 'self.location.href')
+ return {
+ code: code.replace(/\bimport.meta.url\b/g, 'self.location.href'),
+ // Empty sourcemap to supress Rollup warning
+ map: { mappings: '' }
+ }
}
}
}
From b2fc309dcd54e2fbfe40e212488a98744fa971aa Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 16:51:39 +0800
Subject: [PATCH 05/17] fix: esm file build
---
packages/playground/worker/emit-chunk-dynamic-import-worker.js | 2 +-
packages/playground/worker/module-and-worker.js | 2 +-
packages/playground/worker/modules/{module.js => module0.js} | 0
packages/playground/worker/modules/module2.js | 2 +-
packages/playground/worker/modules/module3.js | 2 +-
packages/playground/worker/url-shared-worker.js | 2 +-
6 files changed, 5 insertions(+), 5 deletions(-)
rename packages/playground/worker/modules/{module.js => module0.js} (100%)
diff --git a/packages/playground/worker/emit-chunk-dynamic-import-worker.js b/packages/playground/worker/emit-chunk-dynamic-import-worker.js
index f96e0b15d26497..ceeb92c0f76587 100644
--- a/packages/playground/worker/emit-chunk-dynamic-import-worker.js
+++ b/packages/playground/worker/emit-chunk-dynamic-import-worker.js
@@ -1,3 +1,3 @@
-import('./modules/module').then((module) => {
+import('./modules/module0').then((module) => {
self.postMessage(module.default + import.meta.env.BASE_URL)
})
diff --git a/packages/playground/worker/module-and-worker.js b/packages/playground/worker/module-and-worker.js
index 659e556f08e4a6..6f23ec0891a1f4 100644
--- a/packages/playground/worker/module-and-worker.js
+++ b/packages/playground/worker/module-and-worker.js
@@ -1,4 +1,4 @@
-import constant from './modules/module'
+import constant from './modules/module0'
self.postMessage(constant)
diff --git a/packages/playground/worker/modules/module.js b/packages/playground/worker/modules/module0.js
similarity index 100%
rename from packages/playground/worker/modules/module.js
rename to packages/playground/worker/modules/module0.js
diff --git a/packages/playground/worker/modules/module2.js b/packages/playground/worker/modules/module2.js
index 60447933b8b16e..70c0fc94586ffd 100644
--- a/packages/playground/worker/modules/module2.js
+++ b/packages/playground/worker/modules/module2.js
@@ -1,3 +1,3 @@
-export * from './module'
+export * from './module0'
export * from './module1'
export const msg2 = 'module2'
diff --git a/packages/playground/worker/modules/module3.js b/packages/playground/worker/modules/module3.js
index 33355423bc030e..65f7e274da3242 100644
--- a/packages/playground/worker/modules/module3.js
+++ b/packages/playground/worker/modules/module3.js
@@ -1,2 +1,2 @@
-export * from './module'
+export * from './module0'
export const msg3 = 'module3'
diff --git a/packages/playground/worker/url-shared-worker.js b/packages/playground/worker/url-shared-worker.js
index 3535d5c277ec84..98538d467a405c 100644
--- a/packages/playground/worker/url-shared-worker.js
+++ b/packages/playground/worker/url-shared-worker.js
@@ -1,4 +1,4 @@
-import constant from './modules/module'
+import constant from './modules/module0'
self.onconnect = (event) => {
const port = event.ports[0]
From 1ad475ef82ba37d1fd2918f7c2b1d2f5c2b89e2d Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 17:16:03 +0800
Subject: [PATCH 06/17] feat: log for sourcemap
---
packages/playground/worker/classic-shared-worker.js | 3 +++
packages/playground/worker/classic-worker.js | 3 +++
packages/playground/worker/emit-chunk-dynamic-import-worker.js | 3 +++
packages/playground/worker/emit-chunk-nested-worker.js | 3 +++
packages/playground/worker/emit-chunk-sub-worker.js | 3 +++
packages/playground/worker/importMetaGlob.worker.js | 3 +++
packages/playground/worker/importMetaGlobEager.worker.js | 3 +++
packages/playground/worker/module-and-worker.js | 3 +++
packages/playground/worker/my-shared-worker.ts | 3 +++
packages/playground/worker/my-worker.ts | 3 +++
packages/playground/worker/possible-ts-output-worker.mjs | 3 +++
packages/playground/worker/sub-worker.js | 3 +++
packages/playground/worker/url-shared-worker.js | 3 +++
packages/playground/worker/url-worker.js | 3 +++
packages/playground/worker/worker-nested-worker.js | 3 +++
15 files changed, 45 insertions(+)
diff --git a/packages/playground/worker/classic-shared-worker.js b/packages/playground/worker/classic-shared-worker.js
index 8bd39e194f0618..e629208f05cf0a 100644
--- a/packages/playground/worker/classic-shared-worker.js
+++ b/packages/playground/worker/classic-shared-worker.js
@@ -4,3 +4,6 @@ self.onconnect = (event) => {
const port = event.ports[0]
port.postMessage(self.constant)
}
+
+// for sourcemap
+console.log('classic-shared-worker.js')
diff --git a/packages/playground/worker/classic-worker.js b/packages/playground/worker/classic-worker.js
index 0700428ee0c80b..238857acf00a58 100644
--- a/packages/playground/worker/classic-worker.js
+++ b/packages/playground/worker/classic-worker.js
@@ -3,3 +3,6 @@ importScripts(`/${self.location.pathname.split("/")[1]}/classic.js`)
self.addEventListener('message', () => {
self.postMessage(self.constant)
})
+
+// for sourcemap
+console.log("classic-worker.js")
diff --git a/packages/playground/worker/emit-chunk-dynamic-import-worker.js b/packages/playground/worker/emit-chunk-dynamic-import-worker.js
index ceeb92c0f76587..9c3ede1faa2ed9 100644
--- a/packages/playground/worker/emit-chunk-dynamic-import-worker.js
+++ b/packages/playground/worker/emit-chunk-dynamic-import-worker.js
@@ -1,3 +1,6 @@
import('./modules/module0').then((module) => {
self.postMessage(module.default + import.meta.env.BASE_URL)
})
+
+// for sourcemap
+console.log('emit-chunk-dynamic-import-worker.js')
diff --git a/packages/playground/worker/emit-chunk-nested-worker.js b/packages/playground/worker/emit-chunk-nested-worker.js
index 6cb72b9488cfaf..629322033f3d9b 100644
--- a/packages/playground/worker/emit-chunk-nested-worker.js
+++ b/packages/playground/worker/emit-chunk-nested-worker.js
@@ -26,3 +26,6 @@ import('./module-and-worker').then((res) => {
data: res.module
})
})
+
+// for sourcemap
+console.log('emit-chunk-nested-worker.js')
diff --git a/packages/playground/worker/emit-chunk-sub-worker.js b/packages/playground/worker/emit-chunk-sub-worker.js
index 5d20becc781dd7..60d302e20bbb8a 100644
--- a/packages/playground/worker/emit-chunk-sub-worker.js
+++ b/packages/playground/worker/emit-chunk-sub-worker.js
@@ -6,3 +6,6 @@ Promise.all([
const _data = { ...data[0], ...data[1], ...data[2] }
self.postMessage(_data)
})
+
+// for sourcemap
+console.log('emit-chunk-sub-worker.js')
diff --git a/packages/playground/worker/importMetaGlob.worker.js b/packages/playground/worker/importMetaGlob.worker.js
index 1a9e536ce877f6..074a986c9bd808 100644
--- a/packages/playground/worker/importMetaGlob.worker.js
+++ b/packages/playground/worker/importMetaGlob.worker.js
@@ -3,3 +3,6 @@ const modules = import.meta.glob('./modules/*js')
self.onmessage = function (e) {
self.postMessage(Object.keys(modules))
}
+
+// for sourcemap
+console.log('importMetaGlob.worker.js')
diff --git a/packages/playground/worker/importMetaGlobEager.worker.js b/packages/playground/worker/importMetaGlobEager.worker.js
index 485d6dec7bd152..7947f65ab8c7f9 100644
--- a/packages/playground/worker/importMetaGlobEager.worker.js
+++ b/packages/playground/worker/importMetaGlobEager.worker.js
@@ -3,3 +3,6 @@ const modules = import.meta.globEager('./modules/*js')
self.onmessage = function (e) {
self.postMessage(Object.keys(modules))
}
+
+// for sourcemap
+console.log('importMetaGlobEager.worker.js')
diff --git a/packages/playground/worker/module-and-worker.js b/packages/playground/worker/module-and-worker.js
index 6f23ec0891a1f4..036dcdf4edf11d 100644
--- a/packages/playground/worker/module-and-worker.js
+++ b/packages/playground/worker/module-and-worker.js
@@ -3,3 +3,6 @@ import constant from './modules/module0'
self.postMessage(constant)
export const module = 'module and worker'
+
+// for sourcemap
+console.log('module-and-worker.js')
diff --git a/packages/playground/worker/my-shared-worker.ts b/packages/playground/worker/my-shared-worker.ts
index cd5b24f265b955..caab5257394266 100644
--- a/packages/playground/worker/my-shared-worker.ts
+++ b/packages/playground/worker/my-shared-worker.ts
@@ -14,3 +14,6 @@ onconnect = (event) => {
}
}
}
+
+// for sourcemap
+console.log('my-shared-worker.js')
diff --git a/packages/playground/worker/my-worker.ts b/packages/playground/worker/my-worker.ts
index dd6061885128c7..553754f4901030 100644
--- a/packages/playground/worker/my-worker.ts
+++ b/packages/playground/worker/my-worker.ts
@@ -6,3 +6,6 @@ self.onmessage = (e) => {
self.postMessage({ msg, mode, bundleWithPlugin })
}
}
+
+// for sourcemap
+console.log('my-worker.js')
diff --git a/packages/playground/worker/possible-ts-output-worker.mjs b/packages/playground/worker/possible-ts-output-worker.mjs
index 25f1a447617cd9..db76614bc78267 100644
--- a/packages/playground/worker/possible-ts-output-worker.mjs
+++ b/packages/playground/worker/possible-ts-output-worker.mjs
@@ -5,3 +5,6 @@ self.onmessage = (e) => {
self.postMessage({ msg, mode })
}
}
+
+// for sourcemap
+console.log('possible-ts-output-worker.mjs')
diff --git a/packages/playground/worker/sub-worker.js b/packages/playground/worker/sub-worker.js
index eff49dfbb46ba6..add7cf734b3503 100644
--- a/packages/playground/worker/sub-worker.js
+++ b/packages/playground/worker/sub-worker.js
@@ -3,3 +3,6 @@ self.onmessage = (event) => {
self.postMessage(`pong ${import.meta.url}`)
}
}
+
+// for sourcemap
+console.log('sub-worker.js')
diff --git a/packages/playground/worker/url-shared-worker.js b/packages/playground/worker/url-shared-worker.js
index 98538d467a405c..9ef32c58f6c64b 100644
--- a/packages/playground/worker/url-shared-worker.js
+++ b/packages/playground/worker/url-shared-worker.js
@@ -4,3 +4,6 @@ self.onconnect = (event) => {
const port = event.ports[0]
port.postMessage(constant)
}
+
+// for sourcemap
+console.log('url-shared-worker.js')
diff --git a/packages/playground/worker/url-worker.js b/packages/playground/worker/url-worker.js
index c25cbefdff89ec..d850a2190a75b7 100644
--- a/packages/playground/worker/url-worker.js
+++ b/packages/playground/worker/url-worker.js
@@ -1 +1,4 @@
self.postMessage('A string' + import.meta.env.BASE_URL + import.meta.url)
+
+// for sourcemap
+console.log('url-worker.js')
diff --git a/packages/playground/worker/worker-nested-worker.js b/packages/playground/worker/worker-nested-worker.js
index 460be65cdce57f..1fb851539f1090 100644
--- a/packages/playground/worker/worker-nested-worker.js
+++ b/packages/playground/worker/worker-nested-worker.js
@@ -26,3 +26,6 @@ classicWorker.addEventListener('message', (ev) => {
data: ev.data
})
})
+
+// for sourcemap
+console.log('worker-nested-worker.js')
From a36f4497343ac7d70baf994af85793a39aca3825 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 17:20:35 +0800
Subject: [PATCH 07/17] fix: sourcemap
---
packages/vite/src/node/plugins/worker.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index a634b63de18335..0c7781fd1b1631 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -299,8 +299,7 @@ export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
// Otherwise, the following regex will be incorrectly matched.
return {
code: code.replace(/\bimport.meta.url\b/g, 'self.location.href'),
- // Empty sourcemap to supress Rollup warning
- map: { mappings: '' }
+ map: this.getCombinedSourcemap()
}
}
}
From 055edc2373aafa0621ff9179ac5763a535ae3ba4 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 18:09:34 +0800
Subject: [PATCH 08/17] fix: sourecmap
---
packages/vite/src/node/build.ts | 2 ++
packages/vite/src/node/plugins/index.ts | 3 +--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts
index ff03352a20d7a7..4e86a571550ced 100644
--- a/packages/vite/src/node/build.ts
+++ b/packages/vite/src/node/build.ts
@@ -40,6 +40,7 @@ import { assetImportMetaUrlPlugin } from './plugins/assetImportMetaUrl'
import { loadFallbackPlugin } from './plugins/loadFallback'
import { watchPackageDataPlugin } from './packages'
import { ensureWatchPlugin } from './plugins/ensureWatch'
+import { webWorkerImportMetaUrlPlugin } from './plugins/worker'
export interface BuildOptions {
/**
@@ -309,6 +310,7 @@ export function resolveBuildPlugins(config: ResolvedConfig): {
return {
pre: [
+ webWorkerImportMetaUrlPlugin(config),
...(options.watch ? [ensureWatchPlugin()] : []),
watchPackageDataPlugin(config),
commonjsPlugin(options.commonjsOptions),
diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts
index 6547c48a738471..2d34b99aebf1c5 100644
--- a/packages/vite/src/node/plugins/index.ts
+++ b/packages/vite/src/node/plugins/index.ts
@@ -12,7 +12,7 @@ import { clientInjectionsPlugin } from './clientInjections'
import { buildHtmlPlugin, htmlInlineProxyPlugin } from './html'
import { wasmPlugin } from './wasm'
import { modulePreloadPolyfillPlugin } from './modulePreloadPolyfill'
-import { webWorkerPlugin, webWorkerImportMetaUrlPlugin } from './worker'
+import { webWorkerPlugin } from './worker'
import { preAliasPlugin } from './preAlias'
import { definePlugin } from './define'
import { ssrRequireHookPlugin } from './ssrRequireHook'
@@ -72,7 +72,6 @@ export async function resolvePlugins(
isBuild && buildHtmlPlugin(config),
workerImportMetaUrlPlugin(config),
...buildPlugins.pre,
- isBuild && webWorkerImportMetaUrlPlugin(config),
...postPlugins,
...buildPlugins.post,
// internal server-only plugins are always applied after everything else
From 96d13b75db4f4fd3c6d0669e165520b88f24938f Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 18:42:07 +0800
Subject: [PATCH 09/17] fix: inline sourcemap
---
packages/vite/src/node/plugins/worker.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 0c7781fd1b1631..9be9900612b2da 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -159,7 +159,10 @@ function emitSourcemapForWorkerEntry(
if (config.build.sourcemap === true) {
// inline web workers need to use the full sourcemap path
// non-inline web workers can use a relative path
- const sourceMapUrl = query?.inline != null ? filePath : fileName
+ const sourceMapUrl =
+ query?.inline != null
+ ? path.posix.join(config.base, filePath)
+ : fileName
code += `//# sourceMappingURL=${sourceMapUrl}`
}
}
From ba84aeee8705a4e77643efdc280c6bca0da9f51f Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 19:20:30 +0800
Subject: [PATCH 10/17] chore: magicstring
---
packages/vite/src/node/plugins/worker.ts | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 9be9900612b2da..771788c0662b78 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -7,6 +7,7 @@ import { ENV_PUBLIC_PATH } from '../constants'
import path from 'path'
import { onRollupWarning } from '../build'
import type { TransformPluginContext, EmittedFile } from 'rollup'
+import MagicString from 'magic-string'
interface WorkerCache {
// save worker bundle emitted files avoid overwrites the same file.
@@ -293,16 +294,18 @@ export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
return {
name: 'vite:workerImportMetaUrl',
- transform(code) {
+ transform(code, id) {
if (isWorker) {
// if build with iife it will polyfill with `rollup` will be used document in the worker
// else if build with es it will replace with `esbuild` will got a unexpected data.
// so replace import.meta.url break the default handle.
// And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
// Otherwise, the following regex will be incorrectly matched.
+ const s = new MagicString(code, {})
+ s.replace(/\bimport.meta.url\b/g, 'self.location.href')
return {
- code: code.replace(/\bimport.meta.url\b/g, 'self.location.href'),
- map: this.getCombinedSourcemap()
+ code: s.toString(),
+ map: s.generateMap({ source: id, hires: true })
}
}
}
From f6710c3e9b02496f53ce5d1145446693b4230bd5 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 13 Apr 2022 20:33:51 +0800
Subject: [PATCH 11/17] fix: move plugin at truth postion
---
packages/vite/src/node/build.ts | 4 ++--
packages/vite/src/node/plugins/worker.ts | 4 +++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts
index 4e86a571550ced..9ad8a640a12f7b 100644
--- a/packages/vite/src/node/build.ts
+++ b/packages/vite/src/node/build.ts
@@ -40,7 +40,7 @@ import { assetImportMetaUrlPlugin } from './plugins/assetImportMetaUrl'
import { loadFallbackPlugin } from './plugins/loadFallback'
import { watchPackageDataPlugin } from './packages'
import { ensureWatchPlugin } from './plugins/ensureWatch'
-import { webWorkerImportMetaUrlPlugin } from './plugins/worker'
+import { redirectWorkerImportMetaUrlPlugin } from './plugins/worker'
export interface BuildOptions {
/**
@@ -310,13 +310,13 @@ export function resolveBuildPlugins(config: ResolvedConfig): {
return {
pre: [
- webWorkerImportMetaUrlPlugin(config),
...(options.watch ? [ensureWatchPlugin()] : []),
watchPackageDataPlugin(config),
commonjsPlugin(options.commonjsOptions),
dataURIPlugin(),
dynamicImportVars(options.dynamicImportVarsOptions),
assetImportMetaUrlPlugin(config),
+ redirectWorkerImportMetaUrlPlugin(config),
...(options.rollupOptions.plugins
? (options.rollupOptions.plugins.filter(Boolean) as Plugin[])
: [])
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 771788c0662b78..14298b25928473 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -289,7 +289,9 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
}
// just run in build mode
-export function webWorkerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
+export function redirectWorkerImportMetaUrlPlugin(
+ config: ResolvedConfig
+): Plugin {
const isWorker = config.isWorker
return {
From 9e867450298b1adc851d6f89f361c39ebb05a738 Mon Sep 17 00:00:00 2001
From: yoho
Date: Thu, 14 Apr 2022 11:35:01 +0800
Subject: [PATCH 12/17] refactor: stop replace import.meta.url to
self.location.href
---
.../worker/__tests__/es/es-worker.spec.ts | 11 --------
.../worker/__tests__/iife/worker.spec.ts | 11 --------
packages/playground/worker/sub-worker.js | 2 +-
packages/playground/worker/url-worker.js | 2 +-
.../playground/worker/worker-nested-worker.js | 2 +-
packages/vite/src/node/build.ts | 2 --
packages/vite/src/node/plugins/worker.ts | 27 -------------------
7 files changed, 3 insertions(+), 54 deletions(-)
diff --git a/packages/playground/worker/__tests__/es/es-worker.spec.ts b/packages/playground/worker/__tests__/es/es-worker.spec.ts
index 77e8f6394a0f09..e68081c413471f 100644
--- a/packages/playground/worker/__tests__/es/es-worker.spec.ts
+++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts
@@ -85,17 +85,6 @@ if (isBuild) {
})
test('worker emitted and import.meta.url in nested worker (build)', async () => {
- // import.meta.url will minify in esbuild in build mode so can't use runtime result.
- const files = fs.readdirSync(assetsDir)
- const nestedWorkerFile = files.find((f) =>
- f.includes('worker-nested-worker')
- )
- const content = fs.readFileSync(
- path.resolve(assetsDir, nestedWorkerFile),
- 'utf-8'
- )
- expect(content).toMatch('self.location.href')
-
expect(await page.textContent('.nested-worker-module')).toMatch(
'"type":"module"'
)
diff --git a/packages/playground/worker/__tests__/iife/worker.spec.ts b/packages/playground/worker/__tests__/iife/worker.spec.ts
index 0e5e09dbd04b19..9e7bd6ca9ce79d 100644
--- a/packages/playground/worker/__tests__/iife/worker.spec.ts
+++ b/packages/playground/worker/__tests__/iife/worker.spec.ts
@@ -85,17 +85,6 @@ if (isBuild) {
})
test('worker emitted and import.meta.url in nested worker (build)', async () => {
- // import.meta.url will minify in esbuild in build mode so can't use runtime result.
- const files = fs.readdirSync(assetsDir)
- const nestedWorkerFile = files.find((f) =>
- f.includes('worker-nested-worker')
- )
- const content = fs.readFileSync(
- path.resolve(assetsDir, nestedWorkerFile),
- 'utf-8'
- )
- expect(content).toMatch('self.location.href')
-
expect(await page.textContent('.nested-worker-module')).toMatch(
'"type":"module"'
)
diff --git a/packages/playground/worker/sub-worker.js b/packages/playground/worker/sub-worker.js
index add7cf734b3503..37d5d4effabb27 100644
--- a/packages/playground/worker/sub-worker.js
+++ b/packages/playground/worker/sub-worker.js
@@ -1,6 +1,6 @@
self.onmessage = (event) => {
if (event.data === 'ping') {
- self.postMessage(`pong ${import.meta.url}`)
+ self.postMessage(`pong ${self.location.href}`)
}
}
diff --git a/packages/playground/worker/url-worker.js b/packages/playground/worker/url-worker.js
index d850a2190a75b7..1ba50225ee339d 100644
--- a/packages/playground/worker/url-worker.js
+++ b/packages/playground/worker/url-worker.js
@@ -1,4 +1,4 @@
-self.postMessage('A string' + import.meta.env.BASE_URL + import.meta.url)
+self.postMessage('A string' + import.meta.env.BASE_URL + self.location.url)
// for sourcemap
console.log('url-worker.js')
diff --git a/packages/playground/worker/worker-nested-worker.js b/packages/playground/worker/worker-nested-worker.js
index 1fb851539f1090..e74d1db760409b 100644
--- a/packages/playground/worker/worker-nested-worker.js
+++ b/packages/playground/worker/worker-nested-worker.js
@@ -8,7 +8,7 @@ self.onmessage = (event) => {
}
}
-self.postMessage(import.meta.url)
+self.postMessage(self.location.href)
subWorker.onmessage = (ev) => {
self.postMessage({
diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts
index 9ad8a640a12f7b..ff03352a20d7a7 100644
--- a/packages/vite/src/node/build.ts
+++ b/packages/vite/src/node/build.ts
@@ -40,7 +40,6 @@ import { assetImportMetaUrlPlugin } from './plugins/assetImportMetaUrl'
import { loadFallbackPlugin } from './plugins/loadFallback'
import { watchPackageDataPlugin } from './packages'
import { ensureWatchPlugin } from './plugins/ensureWatch'
-import { redirectWorkerImportMetaUrlPlugin } from './plugins/worker'
export interface BuildOptions {
/**
@@ -316,7 +315,6 @@ export function resolveBuildPlugins(config: ResolvedConfig): {
dataURIPlugin(),
dynamicImportVars(options.dynamicImportVarsOptions),
assetImportMetaUrlPlugin(config),
- redirectWorkerImportMetaUrlPlugin(config),
...(options.rollupOptions.plugins
? (options.rollupOptions.plugins.filter(Boolean) as Plugin[])
: [])
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 14298b25928473..40d76dd81d5fea 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -7,7 +7,6 @@ import { ENV_PUBLIC_PATH } from '../constants'
import path from 'path'
import { onRollupWarning } from '../build'
import type { TransformPluginContext, EmittedFile } from 'rollup'
-import MagicString from 'magic-string'
interface WorkerCache {
// save worker bundle emitted files avoid overwrites the same file.
@@ -287,29 +286,3 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
}
}
}
-
-// just run in build mode
-export function redirectWorkerImportMetaUrlPlugin(
- config: ResolvedConfig
-): Plugin {
- const isWorker = config.isWorker
-
- return {
- name: 'vite:workerImportMetaUrl',
- transform(code, id) {
- if (isWorker) {
- // if build with iife it will polyfill with `rollup` will be used document in the worker
- // else if build with es it will replace with `esbuild` will got a unexpected data.
- // so replace import.meta.url break the default handle.
- // And it must be done at this (after `(?new Worker)new URL('xxx', import.meta.url)` match),
- // Otherwise, the following regex will be incorrectly matched.
- const s = new MagicString(code, {})
- s.replace(/\bimport.meta.url\b/g, 'self.location.href')
- return {
- code: s.toString(),
- map: s.generateMap({ source: id, hires: true })
- }
- }
- }
- }
-}
From 46ce455d5fa12c40544d33b1e607788fc5283651 Mon Sep 17 00:00:00 2001
From: yoho
Date: Sat, 16 Apr 2022 12:34:41 +0800
Subject: [PATCH 13/17] chore: nice tips
---
packages/vite/src/node/plugins/importAnalysisBuild.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts
index d27fa19cdfb3ac..935cc28c68a027 100644
--- a/packages/vite/src/node/plugins/importAnalysisBuild.ts
+++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts
@@ -160,7 +160,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
source.slice(end, end + 10) !== '.globEager'
) {
this.error(
- 'can not use dynamic import(import.meta.glob) in iife worker. Just support import.meta.globEager in iife worker.',
+ 'can not use dynamic import(import.meta.glob) in iife worker. Just support import.meta.globEager in `format: iife` worker.',
end
)
}
From 6335620fb8e8b4baefa6e8d11c5353f60e73328f Mon Sep 17 00:00:00 2001
From: yoho <907415276@qq.com>
Date: Wed, 20 Apr 2022 18:53:57 +0800
Subject: [PATCH 14/17] chore: nit on error message.
Co-authored-by: Bjorn Lu
---
packages/vite/src/node/plugins/importAnalysisBuild.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts
index 935cc28c68a027..0a890a746db175 100644
--- a/packages/vite/src/node/plugins/importAnalysisBuild.ts
+++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts
@@ -160,7 +160,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
source.slice(end, end + 10) !== '.globEager'
) {
this.error(
- 'can not use dynamic import(import.meta.glob) in iife worker. Just support import.meta.globEager in `format: iife` worker.',
+ '`import.meta.glob` is not supported in workers with `iife` format, use `import.meta.globEager` instead.',
end
)
}
From 220322e62c9061e4076047b5640741726cd08f71 Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 20 Apr 2022 18:57:41 +0800
Subject: [PATCH 15/17] chore: clean code
---
packages/vite/src/node/plugins/importAnalysisBuild.ts | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts
index 0a890a746db175..16a72c71653902 100644
--- a/packages/vite/src/node/plugins/importAnalysisBuild.ts
+++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts
@@ -187,9 +187,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
if (dynamicIndex > -1 && insertPreload) {
needPreloadHelper = true
const original = source.slice(expStart, expEnd)
- const replacement = isWorker
- ? `() => ${original}`
- : `${preloadMethod}(() => ${original},${isModernFlag}?"${preloadMarker}":void 0)`
+ const replacement = `${preloadMethod}(() => ${original},${isModernFlag}?"${preloadMarker}":void 0)`
str().overwrite(expStart, expEnd, replacement, { contentOnly: true })
}
From dafa71cacd5d215d6ce367d4761b1b35d54179ce Mon Sep 17 00:00:00 2001
From: yoho
Date: Wed, 20 Apr 2022 18:58:58 +0800
Subject: [PATCH 16/17] chore: revert replaced
---
packages/vite/src/node/plugins/worker.ts | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts
index 40d76dd81d5fea..5826980f5b0f72 100644
--- a/packages/vite/src/node/plugins/worker.ts
+++ b/packages/vite/src/node/plugins/worker.ts
@@ -283,6 +283,12 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
}`,
map: { mappings: '' } // Empty sourcemap to supress Rolup warning
}
+ },
+
+ renderChunk(code) {
+ if (config.isWorker && code.includes('import.meta.url')) {
+ return code.replace('import.meta.url', 'self.location.href')
+ }
}
}
}
From 63686a35a09f6cebf0bfbb5e57193786e5282fcc Mon Sep 17 00:00:00 2001
From: yoho
Date: Sun, 24 Apr 2022 15:56:37 +0800
Subject: [PATCH 17/17] fix: test
---
packages/playground/worker/__tests__/es/es-worker.spec.ts | 2 +-
packages/playground/worker/__tests__/iife/worker.spec.ts | 2 +-
.../__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts | 2 +-
.../__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts | 2 +-
.../worker/__tests__/sourcemap/sourcemap-worker.spec.ts | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/packages/playground/worker/__tests__/es/es-worker.spec.ts b/packages/playground/worker/__tests__/es/es-worker.spec.ts
index e68081c413471f..27f81b010df74f 100644
--- a/packages/playground/worker/__tests__/es/es-worker.spec.ts
+++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts
@@ -64,7 +64,7 @@ if (isBuild) {
// assert correct files
test('inlined code generation', async () => {
const files = fs.readdirSync(assetsDir)
- expect(files.length).toBe(27)
+ expect(files.length).toBe(26)
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'))
diff --git a/packages/playground/worker/__tests__/iife/worker.spec.ts b/packages/playground/worker/__tests__/iife/worker.spec.ts
index 9e7bd6ca9ce79d..16750a893cb073 100644
--- a/packages/playground/worker/__tests__/iife/worker.spec.ts
+++ b/packages/playground/worker/__tests__/iife/worker.spec.ts
@@ -64,7 +64,7 @@ if (isBuild) {
// assert correct files
test('inlined code generation', async () => {
const files = fs.readdirSync(assetsDir)
- expect(files.length).toBe(14)
+ expect(files.length).toBe(13)
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'))
diff --git a/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
index 0ebe14ff672d65..e4cb3318ebd5f5 100644
--- a/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(27)
+ expect(files.length).toBe(26)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
diff --git a/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
index 8760e1f5d27ffc..ceda7dae1fec7c 100644
--- a/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(14)
+ expect(files.length).toBe(13)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)
diff --git a/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts b/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
index 74041d34fc3f61..04cc079b4bc289 100644
--- a/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
+++ b/packages/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts
@@ -9,7 +9,7 @@ if (isBuild) {
test('sourcemap generation for web workers', async () => {
const files = fs.readdirSync(assetsDir)
// should have 2 worker chunk
- expect(files.length).toBe(27)
+ expect(files.length).toBe(26)
const index = files.find((f) => f.includes('main-module'))
const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8')
const indexSourcemap = getSourceMapUrl(content)