pwa如何更新缓存?

发布于 2022-09-07 22:54:27 字数 122 浏览 18 评论 0

假如我有一个api,该api返回的数据并不会被用户操作所影响,所以它很少会改变,我拦截该api,使用缓存优先。假如我的数据改变了,我怎么放弃原来的缓存,采用新的数据呢?如何让sw知道数据改变了,需要去更新缓存呢?有没有类似的方案?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清君侧 2022-09-14 22:54:27

pwa更新缓存通常有两种一种是自动更新,一种是手动更新。

你可以在register的时候手动更新一下。

navigator.serviceWorker.register('/service-worker.js').then(reg => {
  // sometime later…
  reg.update();
});

或者是这样加版本,不是每次访问都更新

var version = 'v1';

navigator.serviceWorker.register('/service-worker.js').then(function (reg) {
    if (localStorage.getItem('sw_version') !== version) {
        reg.update().then(function () {
            localStorage.setItem('sw_version', version)
        });
    }
});

或者自动更新,在sw.js文件里面,每次手动更新里面的cacheName

// 安装阶段跳过等待,直接进入 active
var cacheName = "cachev2"
self.addEventListener('install', function (event) {
    event.waitUntil(self.skipWaiting());
});

self.addEventListener('activate', function (event) {
    event.waitUntil(
        Promise.all([
            // 更新客户端
            self.clients.claim(),

            // 清理旧版本
            caches.keys().then(function (cacheList) {
                return Promise.all(
                    cacheList.map(function (cacheName) {
                        if (cacheName !== 'cachev1') {
                            return caches.delete(cacheName);
                        }
                    })
                );
            })
        ])
    );
});

或者还有一种办法,就是这个API后面query的时候带一个version的参数,如果这个参数改变的话,整个fetch match到的path不一样。
但是这样会修改逻辑代码,不是很好。

可以看这个参考

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文