有没有办法判断您是否从 Service Worker 获取缓存数据?
Is there a way to tell if you're getting cached data from the service worker?
我正在开发一个创作/CMS 类型的应用程序。该应用程序允许同时编辑各种 'blocks' 数据。已经支持离线使用appache和indexDB。通过这种方法,我知道我的数据是来自网络还是来自缓存。现在我想迁移一些东西以使用服务工作者和新缓存 api.
我需要一种方法来知道我的数据(请求)是从缓存还是网络提供的,这样我就可以通知用户他们可能正在查看过时的数据,因此任何编辑都可能会覆盖他们不知道的数据关于。 IMO,这本来是一件很常见的事情,但事实证明并不是那么容易...
我目前正在尝试使用 WorkBox 让事情正常进行,但我对本机解决方案非常满意。使用 Workbox 我尝试在响应中设置一个新的 header 但 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;
}
);
那么有什么方法可以知道响应是来自网络还是缓存?
如果您查看浏览器的开发工具(即 chrome),切换到网络选项卡,它将显示为(来自 ServiceWorker)。此外,如果您启用调试工作箱输出,您需要在控制台中了解所有信息。
原来有一堆plugins。我能够使用自定义 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((resolve) => {
return res.blob().then((blob) => {
resolve(new Response(blob, {
status: res.status,
statusText: res.statusText,
headers: headers
}));
});
});
};
newReponse
函数取自 How to alter the headers of a Response? 感谢@mjs!
我现在可以检查 x-sw-cache
header 以通知我的用户他们可能正在查看状态数据。 :)
我正在开发一个创作/CMS 类型的应用程序。该应用程序允许同时编辑各种 'blocks' 数据。已经支持离线使用appache和indexDB。通过这种方法,我知道我的数据是来自网络还是来自缓存。现在我想迁移一些东西以使用服务工作者和新缓存 api.
我需要一种方法来知道我的数据(请求)是从缓存还是网络提供的,这样我就可以通知用户他们可能正在查看过时的数据,因此任何编辑都可能会覆盖他们不知道的数据关于。 IMO,这本来是一件很常见的事情,但事实证明并不是那么容易...
我目前正在尝试使用 WorkBox 让事情正常进行,但我对本机解决方案非常满意。使用 Workbox 我尝试在响应中设置一个新的 header 但 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;
}
);
那么有什么方法可以知道响应是来自网络还是缓存?
如果您查看浏览器的开发工具(即 chrome),切换到网络选项卡,它将显示为(来自 ServiceWorker)。此外,如果您启用调试工作箱输出,您需要在控制台中了解所有信息。
原来有一堆plugins。我能够使用自定义 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((resolve) => {
return res.blob().then((blob) => {
resolve(new Response(blob, {
status: res.status,
statusText: res.statusText,
headers: headers
}));
});
});
};
newReponse
函数取自 How to alter the headers of a Response? 感谢@mjs!
我现在可以检查 x-sw-cache
header 以通知我的用户他们可能正在查看状态数据。 :)