历史重大bug,早已弃用的旧service-worker导致时间冻结
← 返回列表

当前位置: 作者:ouplan · 2026-08-04 05:47:39

#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就会消失,因为换主题的时候也会自动更新到最新主题
#2 ton520 · 2026-08-04 05:58:12
stalltrix
没感觉到这个问题。大多数网页显示错误清除浏览器数据刷新基本都能好
#3 e · 2026-08-04 07:45:23
stalltrix
应该只有访问官网的节点才有这个问题吧,自建的不受影响。
#4 风长旧客 · 2026-08-04 08:15:24
stalltrix
照这么说细思极恐。 既不白屏也不报错崩溃。换做是我碰到了,大概也会以为完全正常,只是没人了。
#5 bigjj · 2026-08-04 08:27:54
stalltrix
好像之前有段时间一直没人发帖。刷首页一直是老帖子,还以为要凉了。但怪的是我自己的webui一直有新帖子来。

后来就莫名其妙的自动好了。也没注意这件事
#6 huaxiong · 2026-08-04 08:39:12
stalltrix
@风长旧客(rkugg3) 其实这种普通人还是能区分的,你把网断开后论坛还能打开,并且还能正常刷帖子。那么就证明sw在后台跑。正常情况下应该打不开
#7 coco · 2026-08-04 08:54:22
stalltrix
@huaxiong(gmpb75) 真的出现这种拔线还能用的情况,我会先怀疑自己在做梦。

小时候做梦电视放鬼片,把电视机的线拔了还是继续放。之后经常遇到类似的梦,形成了拔线还能放=梦的直觉
#8 skymmap · 2026-08-04 09:04:39
stalltrix
后面弃用sw其实也是后面ui迭代更新加快,而这个老是缓存导致bug,后来发现sw的效果相比开发收益有很大影响,就弃用了。

但是没想到还能有这么大的余波
#9 gege · 2026-08-04 09:11:07
stalltrix
> “时间被冻结”
这何尝不是另一种archive,为什么不能是feature呢,哈哈
#10 yuiba · 2026-08-04 09:23:51
stalltrix
各位看下你们的Application,浏览器中worker是不是还挂着
#11 cpwin · 2026-08-04 09:39:21
stalltrix
谁写的,拖出来挨打
#12 晒膊 · 2026-08-04 09:57:19
stalltrix
service-worker经常往浏览器扔一堆垃圾。每次清理垃圾的时候都发现开启了service-worker的网站空间明显大很多
#13 huaxiong · 2026-08-04 10:14:07
stalltrix
@晒膊(nqm6yg) 这是pwa技术的基础,把页面都存下来了,占用大是必然的
#14 007幽灵 · 2026-08-04 10:19:27
stalltrix
相当于客户端了,一旦出问题更新客户端的代码其实很难的,就像催客户更新app一样。网页的优势就是客户端自动更新。以前这里的大佬告诉我的
#15 LoopLab · 2026-08-04 10:39:42
stalltrix
@yuiba(biohcm) 没有。旧域名有。新域名没有。不过估计很多人也一样不会知道这个问题
#16 pingpong · 2026-08-04 10:47:35
stalltrix
前端发展到今天,
浏览器里跑网页到浏览器跑Application,把握不住迟早炸
#17 下耕 · 2026-08-04 11:02:15
stalltrix
有时候会出现“幽灵帖子”,点进去显示404,但是刷新就好了。不知道是不是这个bug
#18 aaaa · 2026-08-04 11:19:54
stalltrix
sw并不是问题,问题是这个既没有过期时间也没有版本概念。加上ttl时间或者sw version自动升级之类的应该就可以了
#19 daren · 2026-08-04 11:28:12
stalltrix
来这里太晚了,没有吃到热乎乎的bug。我也想试试这个bug什么味道

注册

或使用第三方注册

登录

没有账号? 立即注册
技术
闲聊
开发
正在提交...