Start here. This is the direct spoken answer to practice first.
Overview
A service worker can keep a client on a coherent older version, but careless activation can mix application code and chunks from different releases.
I listen to SwUpdate.versionUpdates and, when a new version is ready, prompt the user to reload at a safe point. Reloading lets the new application shell and its assets start together. I avoid calling activateUpdate blindly because switching versions in a live tab can leave lazy chunks and runtime code incompatible.