javascript - 具有多个缓存的 Service Worker

标签 javascript service-worker

有许多示例可用于使用类似于以下内容的单个缓存来初始化 Service Worker:

let cacheName = 'myCacheName-v1';
let urlsToCache = ['url1', 'url2', url3'];

self.addEventListener('install', function (event) {
  event.waitUntil(
    caches.open(cacheName).then(function (cache) {
      return cache.addAll(urlsToCache);
    }).then(function () {
      return this.skipWaiting();
    })
  );
});

我希望在我的 service worker 上初始化多个缓存。动机是根据 Assets 的变化趋势(例如,静态应用程序数据与 css、javascript 等)对 Assets 进行分组。使用多个缓存,我可以更新单个缓存(通过版本化的缓存名称)作为缓存中的文件更改。理想情况下,我希望设置类似于以下的结构:

let appCaches = [{
    name: 'core-00001',
    urls: [
      './',
      './index.html', etc...
    ]
  },
  {
    name: 'data-00001',
    urls: [
      './data1.json',
      './data2.json', etc...
    ]
  },
  etc...
];

到目前为止,我最好的尝试是类似于:

self.addEventListener('install', function (event) {
  appCaches.forEach(function (appCache) {
    event.waitUntil(
      caches.open(appCache.name).then(function (cache) {
        return cache.addAll(appCache.urls);
      }));
  });
  self.skipWaiting();
});

这种方法似乎有效。但是,我仍然是 service worker 和 promises 的新手。有些东西告诉我,这种方法有一个陷阱,我太缺乏经验而无法识别。有没有更好的方法来实现它?

最佳答案

最好在处理程序中只调用一次 event.waitUntil,但好处是相对容易获得等待的单个 Promise。

类似的东西应该可以工作:

event.waitUntil(Promise.all(
  myCaches.map(function (myCache) {
    return caches.open(myCache.name).then(function (cache) {
      return cache.addAll(myCache.urls);
    })
  )
));

Promise.all采用 Promise 数组并仅在数组中的所有 promise 解析后解析,这意味着 install 处理程序将等待所有缓存初始化。

关于javascript - 具有多个缓存的 Service Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891815/

相关文章:

javascript - 我没有在我的页面中看到我的按钮

javascript - 服务工作线程不会在初始加载时拦截第一个获取调用

javascript - 在点击提示之前推送通知 "Error Registration failed - permission denied"?

javascript - 安装时将所有 (*.js) 或 (*.css) 文件批量添加到服务工作线程缓存

javascript - CSS Div 滚动高度

javascript - Nav 中的 React Bootstrap Checkbox -> NavItem 不会在点击时重新呈现

javascript - Meteor:在服务器上将电子邮件地址转换为MD5hash,并在客户端上访问

javascript - 使用jquery查找不包含 "ul"元素的 "li"元素

vue.js - 渐进式WA : Polling for data in the background

javascript - Service Worker 正在缓存文件,但从未触发 fetch 事件