browser already do caching well, but you have to setup your server to sent correct headers and it's kind of difficult (unpractical) to set different caching policy for different kind of files if you're hosting many different sites, or you're on shared hosting. With service worker you can have more granular control over caching. But again, you really have to know, what are you doing. For regular website using service worker to improve caching is IMO overkill and also there is small chance, you'll make it unwillingly worse.
> it's kind of difficult (unpractical) to set different caching policy for different kind of files if you're hosting many different sites, or you're on shared hosting
No it's not. In Apache and Nginx (and I assume any other half decent web server) it is very easy to specify different cache times for each file extension. Same on shared hosting (.htaccess)
apache yes, but what about nginx? And there are many other ways, how to host your site (Amazon S3,...).
Also by unpractical I mean you have to have access to the server (ssh...). IMO it should be more concern of an app then server. But I'm not advocate for service worker for static resource caching (for websites).
Hmm, how does it do that? I don't see what advantages it may have over caching and HTTP/2 push...