ServiceWorker 没有收到获取请求
ServiceWorker not receiving fetch requests
我是第一次安装 Service Worker,并按照教程进行操作:https://developers.google.com/web/fundamentals/getting-started/primers/service-workers
我的 service worker 在安装和更新时表现符合预期,但未按预期触发提取请求。
var CACHE_NAME = 'test-cache-v1'
var urlsToCache = [
'/',
'/public/scripts/app.js'
]
self.addEventListener('install', function (event) {
console.log('Installing new service worker', event)
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function (cache) {
return cache.addAll(urlsToCache)
})
.catch(err => console.log('Error Caching', err))
)
})
self.addEventListener('fetch', function (event) {
console.log('Fetch req', event)
event.respondWith(
caches.match(event.request)
.then(function (response) {
console.log('Cache hit', response)
// Cache hit - return response
if (response) {
return response
}
return fetch(event.request)
.catch(e => console.log('Error matching cache', e))
}
)
)
})
我看到 'Installing new service worker' 按预期输出到控制台,但没有 'Fetch req'。我正在使用 Chrome devtools 并访问了应用程序选项卡下 ServiceWorker 旁边的 "Inspect" 选项。
如果您监听 activate
事件,并在该事件中添加对 clients.claim()
的调用,那么您新激活的 service worker 将控制其范围内的现有网页,包括注册它的页面。 this article 中有关于服务工作者生命周期的更多信息。以下代码就足够了:
self.addEventListener('activate', () => self.clients.claim());
如果您不调用 clients.claim()
,则服务工作者将激活,但不会控制任何当前打开的页面。直到您导航到其范围内的下一个页面(或重新加载当前页面),Service Worker 才会接管控制权,并通过其 fetch
处理程序开始拦截网络请求。
动态网站,小心!
如果 service worker 有作用域:example.com/weather/
它没有作用域:example.com/weather
特别是在默认情况下删除尾部斜线的 firebase
在这种情况下,service worker 将安装、激活甚至缓存文件,但不会接收“获取”事件!很难调试。
将“trailingSlash”: true 添加到“托管”下的 firebase.json。这将解决问题。确保修改重写自:
{
"source": "/weather", "function": "weather"
}
收件人:
{
"source": "/weather/", "function": "weather"
}
以及manifest.json
我是第一次安装 Service Worker,并按照教程进行操作:https://developers.google.com/web/fundamentals/getting-started/primers/service-workers
我的 service worker 在安装和更新时表现符合预期,但未按预期触发提取请求。
var CACHE_NAME = 'test-cache-v1'
var urlsToCache = [
'/',
'/public/scripts/app.js'
]
self.addEventListener('install', function (event) {
console.log('Installing new service worker', event)
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function (cache) {
return cache.addAll(urlsToCache)
})
.catch(err => console.log('Error Caching', err))
)
})
self.addEventListener('fetch', function (event) {
console.log('Fetch req', event)
event.respondWith(
caches.match(event.request)
.then(function (response) {
console.log('Cache hit', response)
// Cache hit - return response
if (response) {
return response
}
return fetch(event.request)
.catch(e => console.log('Error matching cache', e))
}
)
)
})
我看到 'Installing new service worker' 按预期输出到控制台,但没有 'Fetch req'。我正在使用 Chrome devtools 并访问了应用程序选项卡下 ServiceWorker 旁边的 "Inspect" 选项。
如果您监听 activate
事件,并在该事件中添加对 clients.claim()
的调用,那么您新激活的 service worker 将控制其范围内的现有网页,包括注册它的页面。 this article 中有关于服务工作者生命周期的更多信息。以下代码就足够了:
self.addEventListener('activate', () => self.clients.claim());
如果您不调用 clients.claim()
,则服务工作者将激活,但不会控制任何当前打开的页面。直到您导航到其范围内的下一个页面(或重新加载当前页面),Service Worker 才会接管控制权,并通过其 fetch
处理程序开始拦截网络请求。
动态网站,小心!
如果 service worker 有作用域:example.com/weather/ 它没有作用域:example.com/weather
特别是在默认情况下删除尾部斜线的 firebase
在这种情况下,service worker 将安装、激活甚至缓存文件,但不会接收“获取”事件!很难调试。
将“trailingSlash”: true 添加到“托管”下的 firebase.json。这将解决问题。确保修改重写自:
{
"source": "/weather", "function": "weather"
}
收件人:
{
"source": "/weather/", "function": "weather"
}
以及manifest.json