From 667b62abe970c4a6ff15151e8b5a852c027cb16b Mon Sep 17 00:00:00 2001 From: yoho Date: Sat, 26 Mar 2022 17:20:55 +0800 Subject: [PATCH 1/8] fix: import url worker two times --- .../src/node/plugins/workerImportMetaUrl.ts | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index 233d83d066bcb7..cc7a9eb93d15b1 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -75,6 +75,8 @@ function getWorkerType( return 'classic' } +const workerUrlMap = new Map() + export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const isBuild = config.command === 'build' let server: ViteDevServer @@ -152,18 +154,23 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const file = path.resolve(path.dirname(id), rawUrl.slice(1, -1)) let url: string if (isBuild) { - const content = await bundleWorkerEntry(this, config, file) - const basename = path.parse(cleanUrl(file)).name - const contentHash = getAssetHash(content) - const fileName = path.posix.join( - config.build.assetsDir, - `${basename}.${contentHash}.js` - ) - url = `__VITE_ASSET__${this.emitFile({ - fileName, - type: 'asset', - source: content - })}__` + if (workerUrlMap.has(file)) { + url = workerUrlMap.get(file)! + } else { + const content = await bundleWorkerEntry(this, config, file) + const basename = path.parse(cleanUrl(file)).name + const contentHash = getAssetHash(content) + const fileName = path.posix.join( + config.build.assetsDir, + `${basename}.${contentHash}.js` + ) + url = `__VITE_ASSET__${this.emitFile({ + fileName, + type: 'asset', + source: content + })}__` + workerUrlMap.set(file, url) + } } else { url = await fileToUrl(cleanUrl(file), config, this) url = injectQuery(url, WORKER_FILE_ID) From 3eb9e90d0c1e3ab6cc2d582ae8f77e867a1835a8 Mon Sep 17 00:00:00 2001 From: yoho Date: Sat, 26 Mar 2022 19:15:23 +0800 Subject: [PATCH 2/8] feat: emit worker to chunk or assets test --- .../worker/__tests__/es/es-worker.spec.ts | 4 ++-- .../worker/emit-chunk-nested-worker.js | 16 +++++++++++++++- .../playground/worker/emit-chunk-sub-worker.js | 14 ++++++++------ packages/playground/worker/module-and-worker.js | 5 +++++ .../playground/worker/worker/main-format-es.js | 4 +++- 5 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 packages/playground/worker/module-and-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 51497a0f5ebadd..14fe0c289086a9 100644 --- a/packages/playground/worker/__tests__/es/es-worker.spec.ts +++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts @@ -60,7 +60,7 @@ if (isBuild) { // assert correct files test('inlined code generation', async () => { const files = fs.readdirSync(assetsDir) - expect(files.length).toBe(20) + expect(files.length).toBe(22) const index = files.find((f) => f.includes('main-module')) const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8') const worker = files.find((f) => f.includes('my-worker')) @@ -94,7 +94,7 @@ test('classic worker', async () => { test('emit chunk', async () => { expect(await page.textContent('.emti-chunk-worker')).toMatch( - '{"msg1":"module1","msg2":"module2","msg3":"module3"}' + '[{"type":"module-and-worker","data":"A string"},{"type":"emit-chunk-sub-worker","data":"A string"},{"type":"emit-chunk-sub-worker","data":{"module":"module and worker","msg1":"module1","msg2":"module2","msg3":"module3"}}]' ) expect(await page.textContent('.emti-chunk-dynamic-import-worker')).toMatch( '"A string/es/"' diff --git a/packages/playground/worker/emit-chunk-nested-worker.js b/packages/playground/worker/emit-chunk-nested-worker.js index dff0f5bc64c5ad..7737815b51e6aa 100644 --- a/packages/playground/worker/emit-chunk-nested-worker.js +++ b/packages/playground/worker/emit-chunk-nested-worker.js @@ -3,5 +3,19 @@ import SubWorker from './emit-chunk-sub-worker?worker' const subWorker = new SubWorker() subWorker.onmessage = (event) => { - self.postMessage(event.data) + self.postMessage({ + type: 'emit-chunk-sub-worker', + data: event.data + }) +} + +const moduleWorker = new Worker( + new URL('./module-and-worker.js', import.meta.url) +) + +moduleWorker.onmessage = (event) => { + self.postMessage({ + type: 'module-and-worker', + data: event.data + }) } diff --git a/packages/playground/worker/emit-chunk-sub-worker.js b/packages/playground/worker/emit-chunk-sub-worker.js index bd6b1f6e4f7419..5d20becc781dd7 100644 --- a/packages/playground/worker/emit-chunk-sub-worker.js +++ b/packages/playground/worker/emit-chunk-sub-worker.js @@ -1,6 +1,8 @@ -Promise.all([import('./modules/module2'), import('./modules/module3')]).then( - (data) => { - const _data = { ...data[0], ...data[1] } - self.postMessage(_data) - } -) +Promise.all([ + import('./module-and-worker'), + import('./modules/module2'), + import('./modules/module3') +]).then((data) => { + const _data = { ...data[0], ...data[1], ...data[2] } + self.postMessage(_data) +}) diff --git a/packages/playground/worker/module-and-worker.js b/packages/playground/worker/module-and-worker.js new file mode 100644 index 00000000000000..659e556f08e4a6 --- /dev/null +++ b/packages/playground/worker/module-and-worker.js @@ -0,0 +1,5 @@ +import constant from './modules/module' + +self.postMessage(constant) + +export const module = 'module and worker' diff --git a/packages/playground/worker/worker/main-format-es.js b/packages/playground/worker/worker/main-format-es.js index aa16636c34c73a..7af3ee3d302762 100644 --- a/packages/playground/worker/worker/main-format-es.js +++ b/packages/playground/worker/worker/main-format-es.js @@ -8,8 +8,10 @@ function text(el, text) { text('.format-es', 'format es:') const nestedWorker = new NestedWorker() +const dataList = [] nestedWorker.addEventListener('message', (ev) => { - text('.emti-chunk-worker', JSON.stringify(ev.data)) + dataList.push(ev.data) + text('.emti-chunk-worker', JSON.stringify(dataList.sort())) }) const dynamicImportWorker = new Worker( From 533aabc64276632eb2647fca761ad82212e58a99 Mon Sep 17 00:00:00 2001 From: yoho Date: Sat, 26 Mar 2022 21:43:25 +0800 Subject: [PATCH 3/8] fix: rewrite file --- .../worker/__tests__/es/es-worker.spec.ts | 2 +- .../worker/emit-chunk-nested-worker.js | 13 +++-- packages/playground/worker/index.html | 10 +++- .../worker/worker/main-format-es.js | 18 ++++++- .../playground/worker/worker/main-module.js | 1 + packages/vite/src/node/plugins/asset.ts | 6 ++- packages/vite/src/node/plugins/worker.ts | 50 +++++++++++++++++-- .../src/node/plugins/workerImportMetaUrl.ts | 34 ++++++------- 8 files changed, 102 insertions(+), 32 deletions(-) diff --git a/packages/playground/worker/__tests__/es/es-worker.spec.ts b/packages/playground/worker/__tests__/es/es-worker.spec.ts index 14fe0c289086a9..c7fd0d6c19e4bc 100644 --- a/packages/playground/worker/__tests__/es/es-worker.spec.ts +++ b/packages/playground/worker/__tests__/es/es-worker.spec.ts @@ -94,7 +94,7 @@ test('classic worker', async () => { test('emit chunk', async () => { expect(await page.textContent('.emti-chunk-worker')).toMatch( - '[{"type":"module-and-worker","data":"A string"},{"type":"emit-chunk-sub-worker","data":"A string"},{"type":"emit-chunk-sub-worker","data":{"module":"module and worker","msg1":"module1","msg2":"module2","msg3":"module3"}}]' + '["A string",{"type":"emit-chunk-sub-worker","data":"A string"},{"type":"module-and-worker:worker","data":"A string"},{"type":"module-and-worker:module","data":"module and worker"},{"type":"emit-chunk-sub-worker","data":{"module":"module and worker","msg1":"module1","msg2":"module2","msg3":"module3"}}]' ) expect(await page.textContent('.emti-chunk-dynamic-import-worker')).toMatch( '"A string/es/"' diff --git a/packages/playground/worker/emit-chunk-nested-worker.js b/packages/playground/worker/emit-chunk-nested-worker.js index 7737815b51e6aa..6cb72b9488cfaf 100644 --- a/packages/playground/worker/emit-chunk-nested-worker.js +++ b/packages/playground/worker/emit-chunk-nested-worker.js @@ -1,5 +1,4 @@ import SubWorker from './emit-chunk-sub-worker?worker' - const subWorker = new SubWorker() subWorker.onmessage = (event) => { @@ -10,12 +9,20 @@ subWorker.onmessage = (event) => { } const moduleWorker = new Worker( - new URL('./module-and-worker.js', import.meta.url) + new URL('./module-and-worker.js', import.meta.url), + { type: 'module' } ) moduleWorker.onmessage = (event) => { self.postMessage({ - type: 'module-and-worker', + type: 'module-and-worker:worker', data: event.data }) } + +import('./module-and-worker').then((res) => { + self.postMessage({ + type: 'module-and-worker:module', + data: res.module + }) +}) diff --git a/packages/playground/worker/index.html b/packages/playground/worker/index.html index 60289ff84d6a06..a99930b59ea2be 100644 --- a/packages/playground/worker/index.html +++ b/packages/playground/worker/index.html @@ -57,7 +57,9 @@

format iife:

- worker emit chunk + worker emit chunk
+ module and worker:worker in worker file
+ module and worker:module in worker file
.emti-chunk-worker

@@ -68,6 +70,12 @@

+

+ module and worker:worker in simple file + .module-and-worker-worker +

+ +