- 我正在尝试构建一个具有“离线优先策略”的PWA。
- 源文件的服务器是一个NodeJS服务器。
- 我目前在本地主机上测试这个服务器(不确定是否会产生影响?)。
- 服务工作者+缓存似乎很好,但在离线模式下我只能获得Chrome离线页面。
让我们深入了解:
通过http://localhost:8080/place/test URL提供服务的页面具有一些客户端JS,在其中我注册了一个服务工作者:
client.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register(rootPath+'/js/service-worker.js')
.then(function() { console.log('Service Worker Registered'); });
}
service-worker.js(基于Google PWA教程)
var cacheName = 'myCacheVersion';
var filesToCache = [
'../',
'../place/test',
'../js/client.js',
'../js/service-worker.js',
"../css/style.css"
];
self.addEventListener('install', function(e) {
console.log('[ServiceWorker] Install');
e.waitUntil(
caches.open(cacheName).then(function(cache) {
console.log('[ServiceWorker] Caching app shell');
return cache.addAll(filesToCache);
})
);
});
self.addEventListener('activate', function(e) {
console.log('[ServiceWorker] Activate');
e.waitUntil(
caches.keys().then(function(keyList) {
return Promise.all(keyList.map(function(key) {
if (key !== cacheName) {
console.log('[ServiceWorker] Removing old cache', key);
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
self.addEventListener('fetch', function(e) {
console.log('[ServiceWorker] Fetch', e.request.url);
e.respondWith(
caches.match(e.request).then(function(response) {
return response || fetch(e.request);
})
);
});
在Dev Tools控制台中,一切似乎都很好:
- SW已注册
- 缓存包含我想要缓存的元素
=》我错过了什么?(与nodeJs有关吗?与本地主机环境有关吗?与我的实现有关吗?)
我已经为这个问题苦苦挣扎了一段时间...
我在“应用程序”选项卡中进行了检查,我的服务工作者显示为已激活并正在运行。
注意:如果在此处找到了类似的问题,但没有满意的答案:使用nodejs服务器时离线模式下无法运行服务工作者。