我对Chrome的内存缓存和磁盘缓存很感兴趣。我使用webpack、common chunks插件,并为所有文件生成chunkhash。
内存缓存和磁盘缓存有何区别?当我重新加载页面时,某些文件从内存缓存中加载,某些文件从磁盘缓存中加载(bundle.js和image.jpg从内存缓存中加载,css从磁盘缓存中加载)。有时候也会不同。我们能控制它们吗?选择从哪里加载?内存缓存似乎比磁盘缓存更快。
我对Chrome的内存缓存和磁盘缓存很感兴趣。我使用webpack、common chunks插件,并为所有文件生成chunkhash。
内存缓存和磁盘缓存有何区别?当我重新加载页面时,某些文件从内存缓存中加载,某些文件从磁盘缓存中加载(bundle.js和image.jpg从内存缓存中加载,css从磁盘缓存中加载)。有时候也会不同。我们能控制它们吗?选择从哪里加载?内存缓存似乎比磁盘缓存更快。
就像它们的名字所说:
"Memory Cache" 存储资源并从内存(RAM)中加载。因此速度更快,但它是非持久性的。只有在关闭浏览器前才能访问内容。
"Disk Cache" 是持久性的。缓存的资源存储在磁盘上并且可以从磁盘读取。
简单测试: 打开 Chrome 开发者工具 / 网络。多次重新加载页面。表格列“大小”将告诉您某些文件是“从内存缓存”加载的。 现在关闭浏览器,再次打开开发者工具 / 网络并重新加载该页面。因为内存缓存为空,所有缓存文件现在都是“从磁盘缓存”加载的。
cache-control: no-cache
,为什么在网络工具中我仍然看到 "200 (from disk cache)"? - Eric BurelChrome在很多抽象级别上实现了缓存。核心是HTTP(浏览器)缓存 - 其他缓存机制的后端。通常,缓存可以分为:
HTTP缓存
网络上发出的每个请求都会由遵守RFC的HTTP缓存代理。第一次请求时会覆盖缓存。资源按原始URL进行键控。
Service Worker缓存
为了优雅地处理网络连接故障,可以使用Service Workers。缓存和缓存存储将再次从磁盘中获取。
Blink缓存
Blink在两种创建模式中使用Http缓存作为后端 - 内存和简单(文件系统)。使用哪一个取决于全局设置的缓存限制以及它们可以占用多少内存。当前渲染器缓存得到最大份额。缓存的内容是字体、图像和脚本。如果全局内存使用达到某个指定的阈值,则使用文件系统后端。
强制使用内存缓存
如果要覆盖默认机制从内存中提供文件,则可以实现自己的Service Worker。使用File API,资源可以被读取并存储到内存中的对象中。然后覆盖fetch事件将抑制网络和文件读取,并使用此全局对象提供内容。