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