我刚刚尝试实现服务工作者以在静态站点上缓存一些 JSON 文件和其他资产(在 localhost chrome 版本 47.0.2526.73(64 位)上运行)。使用 cache.addAll() 我已将文件添加到缓存中,当我在 chrome 中打开资源选项卡并单击缓存存储时,会列出所有文件。
我遇到的问题是我的服务工作人员在 chrome://service-worker-internals 中被列为“已激活”和“正在运行”,但是,我无法确定工作人员是否真的在拦截请求并提供缓存文件。我已经添加了事件侦听器,即使我在服务人员开发工具实例中控制台记录事件,它也永远不会到达断点:
this.addEventListener('install', function(event) {
event.waitUntil(
caches.open('v1').then(function(cache) {
console.log(cache);
return cache.addAll([
'/json/0.json',
'/json/1.json',
'/json/3.json',
'/json/4.json',
'/json/5.json',
]);
})
);
});
this.addEventListener('fetch', function(event) {
console.log(event);
var response;
event.respondWith(caches.match(event.request).catch(function() {
return fetch(event.request);
}).then(function(r) {
response = r;
caches.open('v1').then(function(cache) {
cache.put(event.request, response);
});
return response.clone();
}).catch(function() {
}));
});
基本上,我正在按照 HTML5 Rocks Service Workers 介绍中的描述进行操作,但我很确定我的资产不是从缓存中提供的。我已经注意到从服务工作者提供的资产在大小列中的 devtools 的网络选项卡中通过指示“来自服务工作者”来注明。
似乎我的代码与示例没有什么不同,但由于某种原因它从未遇到过 fetch 事件。我的代码要点:https ://gist.github.com/srhise/c2099b347f68b958884d