【发布时间】:2018-02-05 01:20:06
【问题描述】:
- 我正在尝试使用离线优先策略构建 PWA。
- 源文件的服务器是 NodeJS 服务器。
- 我目前正在 localhost 节点服务器上对此进行测试(不确定它是否有影响?)。
- Service Worker + 缓存看起来不错,但在离线模式下我只能看到 Chrome 离线页面。
让我们深入了解一下:
提供的页面(通过http://localhost:8080/place/test url)有一些客户端JS,我在其中注册了一个Service Worker:
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);
})
);
});
在开发工具控制台中,一切似乎都很好:
- 软件已注册
- 缓存包含我想要缓存的元素
但是当我选中 离线模式复选框 并刷新我的页面网址:http://localhost:8080/place/test 时,我只得到 Google Chrome 离线网页。
=> 我在那里缺少什么?(它与 nodeJs 有关系吗?与 localhost 环境有关?与我的实现有关?)
我一直在努力解决这个问题......
我已经检查了“应用程序”选项卡,我的服务人员显示为已激活并正在运行。
注意:如果在这里找到了类似的问题,但在那里没有满意的答案:Service worker not run in offline mode using nodejs server
【问题讨论】:
-
你说的SW注册了; (如对您链接到的其他问题的评论)它是否显示在“应用程序”选项卡中?
-
是的,它显示为“已激活并正在运行”
标签: javascript node.js localhost service-worker progressive-web-apps