@@ -287,25 +287,40 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
287
287
: 'classic'
288
288
: 'module'
289
289
const workerOptions = workerType === 'classic' ? '' : ',{type: "module"}'
290
+
290
291
if ( isBuild ) {
291
292
getDepsOptimizer ( config , ssr ) ?. registerWorkersSource ( id )
292
293
if ( query . inline != null ) {
293
294
const chunk = await bundleWorkerEntry ( config , id , query )
294
- // inline as blob data url
295
- return {
296
- code : `const encodedJs = "${ Buffer . from ( chunk . code ) . toString (
297
- 'base64' ,
298
- ) } ";
299
- const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
300
- export default function WorkerWrapper() {
301
- const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
302
- try {
303
- return objURL ? new ${ workerConstructor } (objURL) : new ${ workerConstructor } ("data:application/javascript;base64," + encodedJs${ workerOptions } );
304
- } finally {
305
- objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
306
- }
307
- }` ,
295
+ const encodedJs = `const encodedJs = "${ Buffer . from (
296
+ chunk . code ,
297
+ ) . toString ( 'base64' ) } ";`
298
+
299
+ const code =
300
+ // Using blob URL for SharedWorker results in multiple instances of a same worker
301
+ workerConstructor === 'Worker'
302
+ ? `${ encodedJs }
303
+ const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
304
+ export default function WorkerWrapper() {
305
+ let objURL;
306
+ try {
307
+ objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
308
+ if (!objURL) throw ''
309
+ return new ${ workerConstructor } (objURL)
310
+ } catch(e) {
311
+ return new ${ workerConstructor } ("data:application/javascript;base64," + encodedJs${ workerOptions } );
312
+ } finally {
313
+ objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
314
+ }
315
+ }`
316
+ : `${ encodedJs }
317
+ export default function WorkerWrapper() {
318
+ return new ${ workerConstructor } ("data:application/javascript;base64," + encodedJs${ workerOptions } );
319
+ }
320
+ `
308
321
322
+ return {
323
+ code,
309
324
// Empty sourcemap to suppress Rollup warning
310
325
map : { mappings : '' } ,
311
326
}
0 commit comments