在某些情况下,应用程序可能需要相对较大的资源作为严格要求,但仅在某些情况下,服务工作者不容易检测到。例如:
- Safari 具有 Web Audio API 的前缀和不一致的实现。我找到了一个很棒的垫片,但它超过了 300kb。Web 应用程序在 Safari 中运行非常重要,但在其他浏览器中则不需要。
- 某些媒体有多种格式,可能并不总是受支持。视频通常太大而无法预缓存并且存在范围请求问题,但它可以应用于 WebP 图像或短音频文件(例如 Opus 与 AAC)。如果您在预缓存清单中包含所有格式,默认情况下它将下载所有格式。
一种方法是从预缓存清单中手动排除某些文件,然后有条件地从主线程上的脚本加载这些文件以存储在运行时缓存中。但是这些文件不会被预先缓存——它们只会在新版本激活后加载,此时您可能不再在线。
是否有允许以下内容的解决方案?:
- 让 service worker 向主线程发送一条消息,其中包含检查各种条件的“测试”脚本的 URL。
- 在主线程上加载并运行该脚本,并向服务人员发送所需条件资产的列表
- 将这些资产添加到预缓存清单中,以便与以前的版本进行比较并根据需要下载
- 在加载所有预缓存资产(包括条件资产)之前,服务工作者不应切换到新版本。