gpt4 book ai didi

javascript - 服务 worker : how to update the cache when files changed on the server?

转载 作者:数据小太阳 更新时间:2023-10-29 06:06:07 25 4
gpt4 key购买 nike

您使用什么缓存策略?我阅读了 Offline Cookbook,最简单的使用策略是缓存静态内容并忽略 API 调用。

这个策略看起来是这样的:

  1. 检查请求是否已经在缓存中
  2. 如果不将请求、响应对添加到缓存
  3. 返回响应

如果服务器端的文件已更改,如何更新缓存?目前,客户端始终获取缓存的结果。

这是我的缓存策略的代码:

// You will need this polyfill, at least on Chrome 41 and older.
importScripts("serviceworker-cache-polyfill.js");

var VERSION = 1;

var CACHES = {
common: "common-cache" + VERSION
};

// an array of file locations we want to cache
var filesToCache = [
"font-cache.html",
"script.js",
];

var neededFiles = [
"index.html"
];

var errorResponse = function() {

return new Response([
"<h2>Failed to get file</h2>",
"<p>Could not retrive response from cache</p>"
].join("\n"),
500
);
};

var networkFetch = function(request) {

return fetch(request).then(function(response) {

caches.open(CACHES["common"]).then(function(cache) {

return cache.put(request, response);
});

}).catch(function() {
console.error("Network fetch failed");
return errorResponse();
});
}

this.addEventListener("install", function(evt) {
evt.waitUntil(
caches.open(CACHES["common"]).then(function(cache) {

// Cache before
cache.addAll(filesToCache);
return cache.addAll(neededFiles);
})
);
});

this.addEventListener("activate", function(event) {

var expectedCacheNames = Object.keys(CACHES).map(function(key) {
return CACHES[key];
});

console.log("Activate the worker");

// Active worker won"t be treated as activated until promise resolves successfully.
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (expectedCacheNames.indexOf() ===
-1) {
console.log(
"Deleting out of date cache:",
cacheName);

return caches.delete(cacheName);
}
})
);
})
);
});

self.addEventListener("fetch", function(event) {
console.log("Handling fetch event for", event.request.url);

event.respondWith(

// Opens Cache objects
caches.open(CACHES["common"]).then(function(cache) {
return cache.match(event.request).then(function(
response) {

if (response) {
console.log("Found response in cache", response);

return response;
} else {

return networkFetch(event.request);
}
}).catch(function(error) {

// Handles exceptions that arise from match() or fetch().
console.error(
" Error in fetch handler:",
error);

return errorResponse();
});
})
);
});

最佳答案

您可能会熟悉 Jeff Posnick 的解决方案 - sw-precache .
那里使用的策略是:

  1. Gulp 正在生成带有校验和的 Service Worker 文件
  2. Service Worker 已注册(使用他自己的校验和)
  3. 如果添加/更新了文件,则 SW 文件会更改
  4. 下次访问时,SW 会检查其校验和是否不同,因此它会再次使用更新后的文件注册自己

您可以通过后端以任何您想要的方式自动执行此流程:)

他在 this article 中描述得更好

关于javascript - 服务 worker : how to update the cache when files changed on the server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30523843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com