PWA 何时以及如何更新自身?

据我所知,一旦你在 PWA 的网站上点击“添加到主屏幕”,浏览器就会生成一个。Apk 使用提供的清单文件和源代码,并像普通应用程序一样安装它。

我注意到,当我更新网站,应用程序也显示更新的内容,这表明应用程序只是一个访问网站的包装。我还注意到,网站的更新不会立即显示,我认为这是由于内部缓存。

我的问题是,我的假设正确吗?或者更一般地说,什么时候以及如何更新 PWA,是否有一种方法可以强制在客户端机器上进行更新?

72067 次浏览

No cache scenario (No Service worker): Your PWA app will be cached only when you use Service worker. Manifest.json will help adding your web app to home screen with a icon and open without address bar. If you don't have a service worker or if your browser don't support it, web page will be loaded fresh every single time. No Cache.

Cache-On Scenario (With Service worker): Assuming you have service workers configured, service workers can cache by lazy loading or prefetching the files that are configured for caching (You can include or exclude caching anything from html, CSS, images to JSON/XML API responses).

After the initial cache, service worker will use the cache to serve your apps network request based on cache approach you have implemented from below ones.

  • cache falling back to network
  • Network falling back to cache
  • Cache then network

Most apps choose to precache due to performance benefits and look for new files on loading, if any changes found will be loaded on next session or prompt user to refresh. With this solution, each file will have a long Hash string for each file cached by service worker. On load of each application, hash code from server will be fetched to match and find what file needs to be updated and the same will be updated in a separate service worker thread. You can notice this in network tab -> service worker response in chrome developer tools.

If you choose network-first approach, you can avoid showing old content on initial load, but loose significant performance benefits that comes with caching.

Only two events…

In essence, there are only two events that will automatically trigger a PWA update:

  1. A change in the linked manifest.json; e.g. a changed icon file or a changed scope or start_url.
  2. A one-character change in the controlling service-worker.js. Hence, if you store the version number in a const in this file and change it, an update of the PWA will be triggered.

When a change is detected, the new version will normally be activated only with the next PWA load. So, in all, two reloads are necessary to see a change.

How the update eventually is handled, is ultimately determined by the service-worker.js. Different update strategies may be defined in terms of the size and volatility of the PWA assets. It is also possible to activate a new service immediately.

However, there is one important caveat. Make sure that the browser cache expiry directive set by the .htaccess file of your asset server is set to a really short duration (e.g. hours) or even to none. Failing to do so, will result in the browser not seeing any change for days to come in the manifest.json nor the service-worker.js.

More details about service worker behaviour are available from Google Web Fundamentals.