我已经实现了一个服务工作者,它缓存所有离线使用请求,这很好用。但是每次我加载一个页面时,都会有两个请求访问我的网络服务器(一个来自服务工作者,一个来自浏览器)!
如何缓存请求并且只加载一次页面?
service-worker.js
self.addEventListener('install', function(event) {
//load error page which will show if user has no internet
var errorPage = new Request('/?p=error&offline');
event.waitUntil(pushToCache(errorPage));
});
//If any fetch fails, it will look for the request in the cache and serve it from there first
self.addEventListener('fetch', function(event) {
event.waitUntil(pushToCache(event.request));
event.respondWith(
fetch(event.request) //try loading from internet
.catch(function (error) {
return fetchFromCache(event.request);
}) //no internet connection try getting it from cache
);
});
function pushToCache(request){
if(request.method == "GET"){
return caches.open('stm-app').then(function (cache) {
return fetch(request).then(function (response) {
return cache.put(request, response);
});
});
}
};
function fetchFromCache(request) {
return caches.open('stm-app').then(function (cache) {
return cache.match(request).then(function (matching) {
if(!matching || matching.status == 404){
return fetchFromCache(new Request('/?p=error&offline')); //show page that user is offline
}else{
return matching;
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
sw-register.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js')
.then(function(registration) {
console.log('Registered:', registration);
})
.catch(function(error) {
console.log('Registration failed: ', error);
});
}
Run Code Online (Sandbox Code Playgroud)
因此,每当您提出请求时,都会发生以下情况:
pushToCache() 向服务器发出获取请求以缓存响应,是的,这是有道理的,那个东西只是为页面最初发出的每个请求向服务器发送了两个请求。
您可能需要考虑的一件事是首先从缓存做出响应,然后通过网络获取最新数据。这样您就可以避免在连接问题的情况下加载延迟,即使用户在线,它也会加快页面的加载时间。
让我们考虑以下场景: 用户或服务器离线。一旦您触发请求,它必须超时才能进入承诺的 catch 部分并获得缓存的响应。
拦截事件后您可以做的是检查缓存是否匹配,如果发现任何内容,请使用该事件响应该事件。然后启动获取请求以更新缓存。现在,如果您没有找到任何东西,请触发 fetch 请求,克隆响应(因为响应主体只能使用一次),使用原始响应进行响应,然后使用克隆的响应更新缓存。
我们用它实现了什么?
用户无论在线、离线还是使用 Lie-Fi,都能得到即时响应!
服务器最多收到一个请求,缓存将始终使用来自服务器的最新数据进行更新!
serviceworke.rs是一个很好的资源,可以帮助您了解如何使用 Service Workers 做许多有趣的事情。
这个页面特别详细地解释了我上面所说的工作原理。
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |