Chrome内存缓存与磁盘缓存


96

我对Chrome内存缓存与磁盘缓存感兴趣吗?我使用webpack,常见的块插件,并使用chunkhash生成我的所有文件。

内存与磁盘缓存有何不同?当我重新加载页面时,某些文件是从内存缓存中加载的,而某些是从磁盘缓存中加载的(从内存缓存中的bundle.js和image.jpg以及从磁盘缓存中的css)。有时情况有所不同。我们可以控制它,选择从哪里加载什么?内存缓存似乎比磁盘缓存快。


1
嗨,伊戈尔(Igor),这是否引起了webpack的加载问题?您是如何解决的?
Rejoy

1
没有问题。这只是浏览器缓存功能,用于缓存Webpack捆绑文件。
Igor-Vuk

嗨,伊戈尔(Igor),当某些捆绑文件从磁盘加载而某些捆绑文件从内存加载时,我发现这是一个问题。发生这种情况时,它将引发JSONP错误。这仅在极少数情况下发生。
Rejoy

Answers:


74

就像他们的名字说的那样:

“内存缓存”将资源存储到内存(RAM)或从中加载资源。因此,这要快得多,但不是持久的。在关闭浏览器之前,内容是可用的。

“磁盘缓存”是持久的。缓存的资源存储在磁盘上,并从磁盘加载。

简单测试:打开Chrome开发人员工具/网络。多次重新加载页面。表列“大小”将告诉您某些文件是从“内存缓存”中加载的。现在关闭浏览器,再次打开Developper Tools / Network并再次加载该页面。现在,所有缓存的文件都是“从磁盘缓存”加载的,因为您的内存缓存为空。


4
好吧,我不知道这就是这么简单。
Faizan Anwer Ali Rupani

27
浏览器如何确定将哪些资产存储在内存缓存与磁盘缓存中?
chharvey

10
我们如何配置应该在内存缓存中缓存的内容?
Igor-Vuk

1
我在我的角度应用程序上有一些iten,它们是在本地运行时从磁盘加载的,在生产中这些文件根本不被缓存。只有来自内存的缓存才能在生产环境中使用。你们知道是什么原因造成的吗?
拉斐尔·安德拉德

@RafaelAndrade请记住,Angular提供了多个环境(在src / environments / *。ts中)。environment.prod.ts定义您的生产构建环境,其中environment.ts定义您的本地开发环境。在本地开发环境中,您通常不希望缓存文件,因此本地更改始终适用于您的应用程序。
鲁文

14

Chrome在许多抽象级别上实现了缓存。核心是HTTP(浏览器)缓存-其他缓存机制的后端。通常,缓存可以分为:

  • HTTP缓存
  • 服务工作者缓存
  • 闪烁缓存

HTTP缓存

通过网络发出的每个请求都由遵循RFC的 HTTP缓存代理。首次请求时,缓存将被覆盖。资源由原始URL键入密钥。

服务工作者缓存

要正常处理网络连接失败,可以使用Service Workers。缓存和缓存存储将再次从磁盘上获取。

闪烁缓存

Blink使用Http Cache作为后端的两种创建方式-内存和简单(文件系统)。使用哪一个取决于全局设置的缓存限制,它们可以占用多少内存。同样,当前的渲染器缓存获得最多的共享。缓存的是字体,图像和脚本。如果全局内存使用率达到某个指定的阈值,则使用文件系统后端。

强制进入内存缓存

如果希望通过覆盖内存的默认机制提供文件,则可以实现自己的Service Worker。使用File Api,可以读取资源并将其存储到内存中的对象中。然后,覆盖访存事件将禁止使用此全局对象提供的内容进行网络和文件读取。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.