PWA 离线模式无法从移动浏览器的缓存中加载
PWA offline mode not loading from cache on mobile browsers
我写了一个简单的 PWA(current version) based on this tutorial by Vaadin。它工作正常,在 Chrome 中测试过,也在离线模式下。
在移动设备上使用它,出现问题:
- 保存PWA后,启动一次,运行正常。
- 然后关闭,打开飞行模式,重启PWA后,系统提示我没有网络连接->没问题,我可以忽略
- 忽略后,应用程序没有像我预期的那样加载静态资产,而是显示一个空白页面,说浏览器无法加载页面,因为我没有互联网连接。
我以为 PWA 有什么用?为什么它不加载静态资产?我觉得我的 service-worker 很好:
const staticAssets = [
'./',
'./styles.css',
'./app.js',
'./images',
'./fallback.json',
'./images/system/offline.png'
]
self.addEventListener('install', async event => {
const cache = await caches.open('static-assets');
cache.addAll(staticAssets);
});
self.addEventListener('fetch', event => {
const req = event.request;
const url = new URL(req.url);
if(url.origin === location.origin){
event.respondWith(cacheFirst(req));
}else{
event.respondWith(networkFirst(req));
}
});
async function cacheFirst(req){
const cachedResponse = await caches.match(req);
return cachedResponse || fetch(req);
}
async function networkFirst(req){
const cache = await caches.open('dynamic-content');
try{
const res = await fetch(req);
cache.put(req, res.clone());
return res;
}catch(err){
const cachedResponse = await cache.match(req);
return cachedResponse || caches.match('./fallback.json');
}
}
如果您认为问题出在其他地方,我很乐意分享更多代码!
问题出在 service-worker:
我忘了将 service worker 文件添加到静态资产中。
通过阅读这个问题的答案找到了解决方案:。
我遇到了同样的问题。在我的例子中,问题来自于向 start_url 添加查询字符串的清单。缓存对此很敏感。您可以向 .match 添加一个参数以防止它发生,如下所示:
caches.match(event.request, {ignoreSearch: true})
我写了一个简单的 PWA(current version) based on this tutorial by Vaadin。它工作正常,在 Chrome 中测试过,也在离线模式下。
在移动设备上使用它,出现问题:
- 保存PWA后,启动一次,运行正常。
- 然后关闭,打开飞行模式,重启PWA后,系统提示我没有网络连接->没问题,我可以忽略
- 忽略后,应用程序没有像我预期的那样加载静态资产,而是显示一个空白页面,说浏览器无法加载页面,因为我没有互联网连接。
我以为 PWA 有什么用?为什么它不加载静态资产?我觉得我的 service-worker 很好:
const staticAssets = [
'./',
'./styles.css',
'./app.js',
'./images',
'./fallback.json',
'./images/system/offline.png'
]
self.addEventListener('install', async event => {
const cache = await caches.open('static-assets');
cache.addAll(staticAssets);
});
self.addEventListener('fetch', event => {
const req = event.request;
const url = new URL(req.url);
if(url.origin === location.origin){
event.respondWith(cacheFirst(req));
}else{
event.respondWith(networkFirst(req));
}
});
async function cacheFirst(req){
const cachedResponse = await caches.match(req);
return cachedResponse || fetch(req);
}
async function networkFirst(req){
const cache = await caches.open('dynamic-content');
try{
const res = await fetch(req);
cache.put(req, res.clone());
return res;
}catch(err){
const cachedResponse = await cache.match(req);
return cachedResponse || caches.match('./fallback.json');
}
}
如果您认为问题出在其他地方,我很乐意分享更多代码!
问题出在 service-worker:
我忘了将 service worker 文件添加到静态资产中。
通过阅读这个问题的答案找到了解决方案:
我遇到了同样的问题。在我的例子中,问题来自于向 start_url 添加查询字符串的清单。缓存对此很敏感。您可以向 .match 添加一个参数以防止它发生,如下所示:
caches.match(event.request, {ignoreSearch: true})