如何使用 Service Worker 缓存 React 应用

How to cache a React app with service workers

我只是想知道如何处理这个问题。我想缓存我的整个应用程序。 我已经尝试过类似的方法,但似乎不起作用

self.addEventListener('install',(e)=>{
  console.log('installed');

})

self.addEventListener('activate',(e)=>{
  console.log('activated');
  self.skipWaiting();
})

self.addEventListener('fetch',(e)=>{
  e.respondWith(
    fetch(e.request)
      .then(res=>{
        const resClone = res.clone();
        caches.open(cacheName).then(cache=>{
          cache.put(e.request, resClone);
        })
        return res;

      }).catch(err => {
        console.log('no connection');
        caches.match(e.request).then(res => { return res })
      })
  )
})

有人知道如何处理吗?

像一种幼稚的方法是查看页面源代码并检查什么 js,css 文件正在被 react 使用并手动缓存它们。

这在生产中不起作用,您必须手动检查构建目录中的文件并更新 service-worker

或者更好更明智的做法是使用 workbox(来自 google 的 npm 包),它将处理所有这些混乱情况

这对我有用,

self.addEventListener("fetch", function(event) {
  event.respondWith(
    caches.match(event.request).then(function(response) {
      if (response) {
        return response;
      } else {
        return fetch(event.request)
          .then(function(res) {
            return caches.open(CACHE_NAME).then(function(cache) {
              cache.put(event.request.url, res.clone());
              return res;
            });
          })
         
      }
    })
  );
});

这告诉 service worker 先从缓存中读取,如果没有来自缓存的响应,然后网络。 要记住的一件事是,这不会检查对文件所做的任何更新。如果你改变你的反应代码,服务工作人员将加载它在缓存中的以前的文件。

要解决这个问题,您可以使用 workbox 的 staleWhileRevalidate,它会在有网络连接时更新缓存。

一个不太方便的解决方案是在服务工作者激活时删除缓存:

self.addEventListener('activate', function(event) {
  event.waitUntil(
    caches.keys()
    .then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        return caches.delete(key);

      }));
    })
  );
  return self.clients.claim();
});

每当安装新的 Service Worker 时,都会删除缓存并创建新的缓存。