#1
ouplan
· 2026-08-04 05:47:39
stalltrix
以前tia1881写的service-worker,当初是说缓存页面以加快打开速度。
这个service-worker如下,看上去似乎没有什么问题,中规中矩
```js
self.addEventListener('install', event => {
self.skipWaiting()
event.waitUntil(
caches.open('static-v1').then(cache => {
return cache.addAll([
'/',
'/index.php'
])
})
)
})
self.addEventListener('activate', event => {
self.clients.claim()
})
self.addEventListener('fetch', event => {
const url = new URL(event.request.url)
if (url.pathname.startsWith('/index/') || url.pathname.startsWith('/view/')) {
event.respondWith(apiStrategy(event.request))
return
}
if (url.pathname.startsWith('/static/')) {
event.respondWith(staticCacheStrategy(event.request))
return
}
event.respondWith(staticStrategy(event.request))
})
async function apiStrategy(request) {
if (request.method !== 'GET') {
return fetch(request)
}
const cache = await caches.open('api-cache')
try {
const response = await fetch(request)
if (response.ok) {
cache.put(request, response.clone())
}
return response
} catch (e) {
const cached = await cache.match(request)
return cached || new Response('Offline', { status: 503 })
}
}
async function staticStrategy(request) {
const cache = await caches.open('static-v1')
const cached = await cache.match(request)
if (cached) {
return cached
}
const response = await fetch(request)
return response
}
async function staticCacheStrategy(request) {
const cache = await caches.open('static-v1')
const cached = await cache.match(request)
if (cached) return cached
const response = await fetch(request)
if (response.ok) {
cache.put(request, response.clone())
}
return response
}
```
此service-worker虽然只使用了二个月,后来网速快了后这个service-worker就被弃用了。后来换掉了就没在意了,也没人反馈问题,最后大家都忘了有这件事了。
但是最近和别人闲聊的时候,看到对方无意说"最近更新都是5月,三个月前的了",我就很纳闷,虽然并不是首页刷屏,但是还是有不少帖子的。别人截图确实是5月份的。后来死皮赖脸的让截控制台network才发现service-worker还在运行
---
看出来上面的代码什么问题了吗,对,这个没有设置缓存过期时间。也就是说访问一次后会一直停留在旧页面。现在页面早已更新几版了,或许还有不少人一直在用旧页面
这还不是最严重的,毕竟旧页面也覆盖率了80%的使用情况。但最近的变化让这个bug爆炸了,之前讨论后把stalltrix的301到kepdb,然后此service-worker fetch发生http 301,接着产生的cors问题,最终报错走缓存。因此当变更域名301后就会出现“时间全部被冻结”在以前的帖子的情况。
也就是说
在之前2个月的service-worker运行期间,如果有人访问过一次页面,那么这个bug就会被种下,到了现在就发芽爆炸了
但是实际影响未知,因为如果后续换过theme主题的话,这个bug就会消失,因为换主题的时候也会自动更新到最新主题
。我也想试试这个bug什么味道