From f2dcd6e24606d47e902c582fd5dd4e7b87e15f45 Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Wed, 12 Aug 2020 18:18:22 -0400 Subject: [PATCH] Service Worker and Web Worker workarounds --- src/index.ts | 13 +++++++++---- src/lib/sw-bridge.ts | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8872f0e8..b5bd172d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,23 @@ declare module '@webcomponents/custom-elements'; +// Patch Worker to ignore `importScripts("x.css")` generated by Parcel: +const W = self.Worker; +self.Worker = function (url: string | URL, options?: WorkerOptions) { + const code = `importScripts = (function(){return this.apply(self,[].slice.call(arguments).filter(function(x){return !/\\.css$/i.test(x)}))}).bind(importScripts)\nimportScripts(${JSON.stringify(url)})`; + return new W(URL.createObjectURL(new Blob([code], { type: 'text/javascript' })), options); +} as any as (typeof Worker); + function init() { require('./init-app.tsx'); } if (!('customElements' in self)) { - import( - /* webpackChunkName: "wc-polyfill" */ - '@webcomponents/custom-elements').then(init); + import('@webcomponents/custom-elements').then(init); } else { init(); } -if (typeof PRERENDER === 'undefined') { +if (typeof process.env.PRERENDER === 'undefined') { // Determine the current display mode. let displayMode = 'browser'; const mqStandAlone = '(display-mode: standalone)'; diff --git a/src/lib/sw-bridge.ts b/src/lib/sw-bridge.ts index 9fba54b7..0b1f104f 100644 --- a/src/lib/sw-bridge.ts +++ b/src/lib/sw-bridge.ts @@ -60,12 +60,14 @@ export function getSharedImage(): Promise { /** Set up the service worker and monitor changes */ export async function offliner(showSnack: SnackBarElement['showSnackbar']) { // This needs to be a typeof because Webpack. - if (typeof PRERENDER === 'boolean') return; + if (process.env.PRERENDER) return; if (process.env.NODE_ENV === 'production') { navigator.serviceWorker.register('../sw'); } + if (!navigator.serviceWorker) return; + const hasController = !!navigator.serviceWorker.controller; // Look for changes in the controller