service worker 缓存网站的原理是什么?有什么潜在的缺陷?

2022-02-23 14:30:44 +08:00
 LeeReamond

如题,最近个人博客挂了个别人写的主题里面有个选项是开启 service worker 缓存,我试了试开启了之后效果确实很好,除了/目录的 html 是经过网络传输的,剩下几乎所有内容都是本地缓存的,基本打开页面 0.01 秒渲染,体验确实不错。

很好奇这东西的技术原理。传统的缓存一般都是 localstorage 或者 sessionstorage/cookie 这一类东西,空间容量还有限制,这个 serviceworker 是依托于这些传统规范实现的缓存吗?如果是的话它的整个生命周期仍然符合之前的浏览器规范吗?或者说这是个完全新的做的东西,不受传统缓存规范约束

作为用户角度(我注意到从服务器角度似乎开启这个缓存功能只需引入一个 js 文件),我是否需要担心我的本地储存空间被挤占?比如登录 A 网站,A 网站就什么都不和用户说就在本地存下几 MB 的东西,访问 B 网站又存了一些,并且如果不再次访问网站触发代码的话他们又不会被自动清除。。是否会产生这样的问题?

有没有懂行老哥讲讲,这东西生产实践有啥坑么,如果能提高用户体验的话(所有网页都是秒开),为啥大商业公司的网站好像没见过用这个的呢?淘宝,B 站之类的

1148 次点击
所在节点    问与答
8 条回复
ai277014717
2022-02-23 14:40:08 +08:00
猜测是反向代理。
okakuyang
2022-02-23 14:48:47 +08:00
service worker 出来有几年了。油管、推特之类的网站,有时候当你网络出现故障,但是还能加载出基本的网页框架,那大概就是使用了 service worker 。
service worker 使用需要注册,也就是浏览器会弹窗问你要不要安装。安装之后就相当于浏览器在本地运行你写的一串代码,无论连网与否。这串代码负责代理这个站点发出的所有请求,如果请求匹配你写的规则就会从存储里取数据回来当作响应。
service worker 内可以调用 indexDB 作为存储,chrome 浏览器下,indexDB 的最大使用量为硬盘空闲容量的一半。
浏览器会定期将 service worker 过期。
部分对实时性要求不高的网站可以做,比如一些工具网站。
3dwelcome
2022-02-23 15:09:50 +08:00
在我眼里就是一个 http 代理。

大网站不用的原因,就是不想让你离线用吧。

我工具网站没用,是因为 HTML 页面频繁更新,每次都希望向服务器检测一下,看有没有最新数据。

只要不下载资源,返回 304 速度很快的,和 service worker 离线几乎没多大差别了。
LeeReamond
2022-02-23 15:14:40 +08:00
@okakuyang 感谢,提纲挈领,比看资料有用多了。一个问题是我在后端确实只是在 html 里引入了一个同源的 js 文件,也并没有提示我要安装啥的,之后就开启了,是否我没有成功开启这个功能,全缓存只是我对浏览器本身缓存机制的错觉?

时效性的问题,比如我在博客这种环境,感觉 html 本身是动态内容的话,似乎也不会有什么时效性的影响
LeeReamond
2022-02-23 15:17:42 +08:00
我 F12 看网络信息的话,除了 html 是 500 毫秒加载,其他的所有 js/css/图片全都是 0ms 内存缓存,感觉就是开启成功了啊,印象里原先的 cdn+几小时缓存机制不是这样的
L1shen
2022-02-23 15:20:16 +08:00
service worker 缓存资源一般使用的是 CacheStorage 具体可以参考

https://developer.mozilla.org/zh-CN/docs/Web/API/CacheStorage
3dwelcome
2022-02-23 15:23:32 +08:00
@LeeReamond "其他的所有 js/css/图片全都是 0ms 内存缓存,感觉就是开启成功了啊"

正常 http 缓存,也是先内存加载的。内存没有才找磁盘加载。

至于过期时间,一般资源设置的时间,还是挺长的。
LeeReamond
2022-02-23 16:36:09 +08:00
@3dwelcome 后来看了一下,F12 里会显式提示由 serviceworker 提供,浏览器本身的缓存则写成内存或硬盘提供。所以我这个确实是 serviceworker 的拦截和缓存正常工作了,但我未像 2L 所说在客户端见到任何确认,是自动就这样了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX