开发记录
问题描述
假如你很早之前访问过我的站点(就是去年,当时我还没有绘制站点logo,用的是原作者imsyy的logo(就是那个钟)),你就会发现:最近的更新logo和字体都没有变化
这是为什么呢?
原因分析
因为我们的浏览器在访问一个页面时,里面的图片之类的东西一般都不会改变,所以我们的浏览器就聪明地把他们都存在了本地,(这就是缓存
,cache
)下一次访问直接访问本地缓存就行了,大大滴提高了访问速度。
但这种没刷新的情况是什么呢?因为我们制作网页时为了引用图片更方便,所以在修改图片内容时没有换图片的文件名,这样子就不用改代码。但对于缓存来说这两个文件是一样的(因为名字没变),所以就不会刷新。
这个时候,我们可以使用Ctrl+F5
来刷新缓存,这样子就刷新了。
但是问题结束了吗?并没有!我们再按F5
刷新(不刷新缓存),网页内容又变成了原来的样子!
为什么会这样呢?我们不是已经把缓存刷新至最新了吗?
进一步探究
这时候我们打开开发人员工具
,找到网络
一栏,发现了这些东西:
履行者
一栏,解释了我们是从哪里得到的这些文件。如果此栏为空,就代表它没有从缓存获取(例如hitokoto 一言
,作为需要实时刷新的文字内容,肯定不能存在缓存里面的啊)。如果此栏有信息,说明是从缓存获取的(例如我们的logo
文件,就是从Service Worker
获取的)
研究此栏的文字,我们发现:一共有4种缓存:
Service Worker
Memory Cache
Disk Cache
Push Cache
其中,Service Worker
的解释如图
所以,我们只需要刷新Service Worker
里面的内容就可以解决了
问题解决
那为什么ctrl+f5
之后再F5
就不行了呢?下图展示了我们Ctrl+F5
后获取的内容。我们发现,memory cache
里面的内容是最新的。再F5
刷新,又是从Service Worker
里面获取的文件,而它是旧的。
所以说,Ctrl+F5
并没有刷新Service Worker
里面的文件,而是memory cache
的。(或者说Service Worker
被无视了)
所以说,我们只用删除Service Worker
里面的文件进行了。文件目录:
1 | %appdata%\..\Local\Microsoft\Edge\User Data\Default\Service Worker\CacheStorage |
尾声
故事是不是应该结束了?没有!刚刚是不是发现了一个问题:为什么logo.png
这个文件F5
刷新是从Service Worker
读取的,Ctrl+F5
又是从memory cache
里面获取的呢?
因为Service Worker
的优先级比memory cache
高。有Service Worker
先用它,没有再用memory cache
。而Ctrl+F5
无视了Service Worker
,就导致它仍存的是之前的文件。因为它不为空,所以就不会出现“找不到”的情况,优先级最高,也就不会去找memory cache
拿最新的文件啦!!!
相关链接
清理 Edge 浏览器 Service Worker CacheStorage 所占据的空间 - 知乎 (zhihu.com)
ctrl f5后依旧从内存拿取文件,依旧有缓存机制存在_ctrl + f5 后仍存在disk cache memory cache-CSDN博客