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 @@

format iife:

- 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 @@

format iife:

+

+ 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)