From bede82cc22833aac4b320e8259cecce65bbefecb Mon Sep 17 00:00:00 2001 From: fi3ework Date: Wed, 15 Mar 2023 00:08:43 +0800 Subject: [PATCH] fix: try catch createObjectURL fail --- packages/vite/src/node/plugins/worker.ts | 18 ++++++++++++++---- .../worker/__tests__/es/es-worker.spec.ts | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index b5ee7e2a661e95..e2d8f0b0951d25 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -299,11 +299,21 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { const blobCode = `${encodedJs} const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" }); export default function WorkerWrapper() { - const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob); + let objURL; + let tryBase64 = true; try { - return objURL ? new ${workerConstructor}(objURL) : new ${workerConstructor}("data:application/javascript;base64," + encodedJs${workerOptions}); - } finally { + objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob); + if(objURL) { + const worker = new ${workerConstructor}(objURL); + tryBase64 = false; + return worker; + } + } catch(e) { objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL); + } finally { + if(tryBase64) { + return new ${workerConstructor}("data:application/javascript;base64," + encodedJs${workerOptions}); + } } }` @@ -314,7 +324,7 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { ` return { - // SharedWorker does not support blob URL + // Using blob URL for SharedWorker results in multiple instances of a same worker code: workerConstructor === 'Worker' ? blobCode : base64Code, // Empty sourcemap to suppress Rollup warning map: { mappings: '' }, diff --git a/playground/worker/__tests__/es/es-worker.spec.ts b/playground/worker/__tests__/es/es-worker.spec.ts index 58add957e522eb..4a6b3021fc8fea 100644 --- a/playground/worker/__tests__/es/es-worker.spec.ts +++ b/playground/worker/__tests__/es/es-worker.spec.ts @@ -80,7 +80,7 @@ describe.runIf(isBuild)('build', () => { expect(content).toMatch(`(window.URL||window.webkitURL).createObjectURL`) expect(content).toMatch(`window.Blob`) expect(content).toMatch( - /try\{return .*\?new Worker\(.+\):new Worker\("data:application\/javascript;base64,"\+/, + /try\{if\(\w+=\w+&&\(window\.URL\|\|window\.webkitURL\)\.createObjectURL\(\w+\),\w+\{const \w+=new Worker\(\w+\);/, ) // inlined shared worker expect(content).toMatch(