From 9d3079a21ed318023f48fc0ae39444c85204d029 Mon Sep 17 00:00:00 2001 From: patr0nus Date: Wed, 15 Dec 2021 18:55:20 +0800 Subject: [PATCH 01/12] Add support for customizing worker options --- packages/vite/src/node/plugins/worker.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index 799233088d6b13..e34b7634680ea4 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -77,10 +77,13 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { // inline as blob data url return `const encodedJs = "${content.toString('base64')}"; const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" }); - export default function WorkerWrapper() { + export default function WorkerWrapper(workerOptions) { const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob); try { - return objURL ? new Worker(objURL) : new Worker("data:application/javascript;base64," + encodedJs, {type: "module"}); + return objURL ? new Worker(objURL) : new Worker( + "data:application/javascript;base64," + encodedJs, + Object.assign({ type: "module" }, workerOptions) + ); } finally { objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL); } @@ -105,12 +108,12 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { const workerConstructor = query.sharedworker != null ? 'SharedWorker' : 'Worker' - const workerOptions = { type: 'module' } - return `export default function WorkerWrapper() { - return new ${workerConstructor}(${JSON.stringify( - url - )}, ${JSON.stringify(workerOptions, null, 2)}) + return `export default function WorkerWrapper(workerOptions) { + return new ${workerConstructor}( + ${JSON.stringify(url)}, + Object.assign({ type: "module" }, workerOptions) + ) }` } } From 68363059400e9cc029de2088108b42aa27123b9f Mon Sep 17 00:00:00 2001 From: patr0nus Date: Thu, 16 Dec 2021 00:14:21 +0800 Subject: [PATCH 02/12] Handle env in classic worker (wip) --- packages/vite/src/node/plugins/worker.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index e34b7634680ea4..ff039e29881aef 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -1,3 +1,5 @@ + +import fs from 'fs' import { ResolvedConfig } from '../config' import { Plugin } from '../plugin' import { resolvePlugins } from '../plugins' @@ -5,10 +7,17 @@ import { parse as parseUrl, URLSearchParams } from 'url' import { fileToUrl, getAssetHash } from './asset' import { cleanUrl, injectQuery } from '../utils' import Rollup from 'rollup' -import { ENV_PUBLIC_PATH } from '../constants' +import { ENV_PUBLIC_PATH, ENV_ENTRY } from '../constants' import path from 'path' import { onRollupWarning } from '../build' +function loadEnvScript(): string { + const script = fs.readFileSync(ENV_ENTRY, 'utf-8'); + return script.replace(/\n\/\/# sourceMappingURL=.*\n/, '\n'); +} + +console.log(loadEnvScript()) + function parseWorkerRequest(id: string): Record | null { const { search } = parseUrl(id) if (!search) { @@ -80,8 +89,8 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { export default function WorkerWrapper(workerOptions) { const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob); try { - return objURL ? new Worker(objURL) : new Worker( - "data:application/javascript;base64," + encodedJs, + return new Worker( + objURL || ("data:application/javascript;base64," + encodedJs), Object.assign({ type: "module" }, workerOptions) ); } finally { From aaa26c6adeec3fef28cea9c2c3eb20009f32b78e Mon Sep 17 00:00:00 2001 From: patr0nus Date: Thu, 16 Dec 2021 00:14:41 +0800 Subject: [PATCH 03/12] Add tests --- packages/playground/worker/__tests__/worker.spec.ts | 5 +++++ packages/playground/worker/classic-worker.ts | 5 +++++ packages/playground/worker/index.html | 13 +++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 packages/playground/worker/classic-worker.ts diff --git a/packages/playground/worker/__tests__/worker.spec.ts b/packages/playground/worker/__tests__/worker.spec.ts index 46b136edd66d2a..1fde16117a033e 100644 --- a/packages/playground/worker/__tests__/worker.spec.ts +++ b/packages/playground/worker/__tests__/worker.spec.ts @@ -22,6 +22,11 @@ test('inlined', async () => { await untilUpdated(() => page.textContent('.pong-inline'), 'pong') }) +test('worker options', async () => { + await page.click('.ping-classic') + await untilUpdated(() => page.textContent('.pong-classic'), 'pong') +}) + const waitSharedWorkerTick = ( (resolvedSharedWorkerCount: number) => async (page: Page) => { await untilUpdated(async () => { diff --git a/packages/playground/worker/classic-worker.ts b/packages/playground/worker/classic-worker.ts new file mode 100644 index 00000000000000..7f7e55b1a9c542 --- /dev/null +++ b/packages/playground/worker/classic-worker.ts @@ -0,0 +1,5 @@ +self.onmessage = (e) => { + if (e.data === 'ping') { + self.postMessage('pong') + } +} diff --git a/packages/playground/worker/index.html b/packages/playground/worker/index.html index 1ce429eece42cc..c652e382308c2f 100644 --- a/packages/playground/worker/index.html +++ b/packages/playground/worker/index.html @@ -7,6 +7,9 @@
Response from inline worker:
+ +
Response from classic worker:
+
Response from worker imported from code that might be compiled TS: @@ -22,6 +25,7 @@