https://googlechrome.github.io/samples/service-worker/basic/上的页面 包含您开始使用现代离线网页所需的所有脚本。在我偶然发现它之前,我花了很多徒劳的时间研究这个主题。突然间,我一直在阅读的所有内容开始变得有意义。HTML5 再次给我留下了深刻的印象,因为它是一个极好的开发系统。
它有一小段脚本需要在你的主页上运行,它有一个完整的服务工作者脚本,当你在线时会从你的服务器获取文件——或者当你离线时从缓存中获取它们。
我花了不到一个小时就让它工作了。注意您可以在本地主机上使用 http 对其进行测试。任何其他服务器都需要 https 连接。Google 和 Firefox 调试器不显示 serviceworker 的来源。
从一开始就很清楚,serviceworker 示例中展示的功能非常接近我的应用程序所需的功能,但我认为我发现了一个错误。
激活处理程序应该负责清理旧缓存。这是脚本 - 从页面逐字逐句。
// Names of the two caches used in this version of the service worker.
// Change to v2, etc. when you update any of the local resources, which will
// in turn trigger the install event again.
const PRECACHE = 'precache-v1';
const RUNTIME = 'runtime';
// The activate handler takes care of cleaning up old caches.
self.addEventListener('activate', event => {
const currentCaches = [PRECACHE, RUNTIME];
event.waitUntil(
caches.keys().then(cacheNames => {
return cacheNames.filter(cacheName => !currentCaches.includes(cacheName));
}).then(cachesToDelete => {
return Promise.all(cachesToDelete.map(cacheToDelete => {
return caches.delete(cacheToDelete);
}));
}).then(() => self.clients.claim())
);
});
简而言之,它不是删除旧缓存。我认为它在执行过滤器以确定不需要哪些缓存之前尝试删除缓存。
我是一位经验丰富的程序员,但这个片段让我害怕。对于生产应用程序来说,它非常简短,但如果您正在调试它,则很难阅读。如果作者以更详细的方式编写它会很好,以便更多的开发人员能够理解发生了什么。
它是如何工作的?