有没有办法告诉您是否正在从服务工作者那里获取缓存的数据?

德诺夫

我正在开发一个创作/ CMS类型的应用程序。该应用程序允许同时编辑各种数据“块”。它已使用appache和indexDB支持脱机。通过这种方法,我知道我的数据是来自网络还是来自缓存。现在,我想迁移内容以使用服务工作者和新的缓存API。

我需要一种方法来了解我的数据(请求)是从缓存还是从网络提供的,因此我可以通知用户他们可能正在查看过时的数据,以便任何编辑都可以覆盖他们不知道的数据。海事组织,这是一件很平常的事,但事实并非如此简单……

我目前正在尝试使用WorkBox进行工作,但我对本机解决方案感到非常满意。我尝试使用Workbox在响应中设置新的标头,但Chrome抱怨

const apiStrategy = workbox.strategies.cacheFirst({
    cacheName: 'data-cache',
    cacheExpiration: {
        maxEntries: 100,
        maxAgeSeconds: 3600 * 24
    },
    cacheableResponse: { statuses: [200] }
});

workbox.routing.registerRoute(
    new RegExp('/api/'),
    async ({event, url}) => {
        const cachedResponse = await apiStrategy.handle({event, url});
        if (cachedResponse) {
            const responseClone = cachedResponse.clone();
            responseClone.headers.set('x-sw-cache', 'yes');
            return responseClone;
        }
        return cachedResponse;
    }
);

那么有什么方法可以知道响应是来自网络还是来自缓存?

德诺夫

原来有很多插件使用自定义cacheWillUpdate插件,我可以获得所需的东西我的代码现在看起来像

workbox.routing.registerRoute(
    new RegExp('/api/'),
    new workbox.strategies.NetworkFirst({
        cacheName: 'data-cache',
        cacheExpiration: {
            maxEntries: 100,
            maxAgeSeconds: 3600 * 24
        },
        cacheableResponse: { statuses: [ 200 ] },
        plugins: [
            {
                cacheWillUpdate: ({ response }) => {
                    return newResponse(response.clone(), (headers) => {
                        headers.set("x-sw-cache", 'yes');
                        return headers;
                    });
                }
            }
        ]
    })
);


const newResponse = (res, headerFn) => {
    const cloneHeaders = () => {
        const headers = new Headers();
        for (const kv of res.headers.entries()) {
            headers.append(kv[0], kv[1]);
        }
        return headers;
    };

    const headers = headerFn ? headerFn(cloneHeaders()) : res.headers;

    return new Promise(function (resolve) {
        return res.blob().then(function (blob) {
            resolve(new Response(blob, {
                status: res.status,
                statusText: res.statusText,
                headers: headers
            }));
        });
    });
};

newReponse函数取自如何更改响应的标头?谢谢@mjs!

现在,我可以检查x-sw-cache标题以通知我的用户他们可能正在查看状态数据。:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有SSL证书缓存的服务工作者

离子 PWA 服务工作者 - 没有 CORS

服务工作者缓存与 VuexPersistence

将服务工作者保存在缓存中有意义吗?

同时使用GWT火力地堡服务工作者没有找到(404错误)

PWA:如果我的Web应用程序有没有清单文件的服务工作者,会发生什么?

服务工作者从磁盘缓存中缓存资源

有没有办法让Postgres告诉您除了/附近还有什么语法错误?

有没有办法告诉您特定修订版本是从哪个分支合并而来的?

有没有办法知道一个方法是否正在从方法内部等待?

服务工作者列出缓存中的所有URL并传递给另一个函数

服务工作者在反应中缓存的路由

WebView:以编程方式清除服务工作者缓存

PWA服务工作者缓存/更新预期行为

如何由服务工作者更新缓存的资源

注销时如何清除服务工作者缓存?

如何防止服务工作者删除缓存,PWA

服务工作者缓存破坏谷歌地图 api

是否可以修改服务工作者缓存响应标头?

检查服务工作者缓存中是否存在URL

服务工作者查询缓存算法是否允许表达式匹配URL路径?

Javascript服务工作者:从缓存中获取资源,但也进行更新

服务工作者可以获取和缓存跨域资产吗?

有没有办法获取正在运行的数据库的名称?

有没有办法使用浏览器的控制台从用户那里获取数据

成功注册服务工作者后,为什么没有点击ServiceWorkerRegistration回调?

嵌套获取服务工作者中的响应

服务工作者获取事件未触发

“服务工作者”是否支持离线HTML表单数据?