Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update "service-worker.js" on Single Page App when changing routes

I have a create react app SPA, and I have deployed it with a registered service-worker.js (Cache-Control: max-age=0)

Everything works totally fine: When I update my code, and redeploy, navigate away from my site (or close the page), and return to my site, the service-worker.js file is downloaded again. It caches my index.html file which contains the url for my app.HASH.js file. It notifies me that new content is available, I refresh the browser page, and now I am running my latest app version.

What doesn't work is: When I navigate to different parts inside my SPA, I use react-router to change the URL. The "url-changes" don't trigger a reload of my service-worker.js file (it's cached with max-age=0 - and I have confirmed this with curl -I). Therefore a new worker is never downloaded to eventually inform me that new content is available and that I need to do a refresh.

I am not sure what the expected behaviour is supposed to be. If react-router changes the URL - should this not trigger a reload of service-woker.js when it's set to not cache itself?

like image 270
Joerg Avatar asked Apr 02 '18 12:04

Joerg


1 Answers

In order to be able to get a new version of the SW.js file while the user is using your app, you have to manually call ServiceWorkerRegistration.update().

You could do for instance:

navigator.serviceWorker.getRegistrations()
  .then(registrationsArray => {
    registrationsArray[0].update();
  })

This code would then be called whenever you like! This forces the browser to check for updates to the SW.js file and then handle the situation in whatever way you've configured your script to do.

This update() call should be made in any place you want to check for updates. You could call it after every URL change / new route visit or once a minute or whatever. You decide.

Checkout the MDN documentation. They also show reference code for storing a reference to the registered SW which gives you the possibility of directly calling update.

https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/update

like image 134
pate Avatar answered Oct 23 '22 17:10

pate