【发布时间】:2018-10-23 13:15:20
【问题描述】:
除了浏览器缓存之外,还有其他几种浏览器缓存数据的方式。对于 Chrome,在渲染引擎 Blink 中还有另一个缓存,用于在内存中存储图像、样式、脚本和字体(可能更多)。
此缓存用于网站上的连续导航。从 Blink 缓存传递的资源在网络选项卡中标记为 (from memory cache)。从浏览器缓存提供的资源标有(from disk cache)。
我现在的问题是,哪些资源存储在这个非常快的缓存中并从该缓存中交付?根据我的测试,它变化很大:
- 它非常适合直接在 HTML 中的图像和脚本标签。
- 它有时适用于直接在 HTML 中的样式(链接)标签。有时它不起作用(在具有相同会话的同一浏览器中)。
- 对于以编程方式插入 HTML 的脚本标签,它几乎从不工作。但有时它会起作用。
磁盘缓存命中和内存缓存命中之间的一个巨大差异在与 Service Worker 结合使用时变得显而易见。在 Service Worker 中无法观察到由内存缓存服务的请求(因为缓存位于 Service Worker 之前)。由磁盘缓存处理的请求通过 Service Worker(因为 Browser Cache 位于 Service Worker 之后)。
为了显示解释的行为,我构建了一个包含所有资源类型的测试页面:https://dm-clone-optimized.app.baqend.com/
您可以使用顶部的链接浏览站点,并观察请求在网络选项卡和控制台中的行为方式。每个页面加载相同的资源。
经过一些导航(Chrome 70.0.3538.67),我大部分时间都会遇到这种情况:
- HTML 是从网络获取的
- 脚本标签
scripts.js和scripts2.js来自内存缓存 - 图片标签
logo.png也来自内存 - 样式链接标签
styles.css来自磁盘缓存 :( - 以编程方式添加的脚本标签
scripts2.js?id=1也来自磁盘缓存 :(
我很想了解 Blink 内存缓存的工作原理,以及如何调整我的网站以将其用于具有适当 cache control 标头的所有资源。
----编辑----
我最担心的是:为什么动态添加的脚本根本不缓存?这对像require.js这样的框架有明显的影响,因为它们将所有依赖项都插入为动态添加的脚本标签。
【问题讨论】:
-
据我了解,缓存控制并没有真正提供可能影响渲染引擎实现的缓存策略的粒度级别。除非您正在寻找 Blink 如何解释 max-age 属性?作为 Web 内容开发人员,您不需要真正关心 Blink 如何管理其缓存(内存中与磁盘)。我不确定你对 Blink 文档的研究有多深,但这个演示文稿很有趣:docs.google.com/presentation/d/…
-
@user3474985 实际上,Blink 缓存似乎遵循 max-age 等缓存控制指令。至少 max-age=0 no-cache no-store 的资源似乎没有被缓存。我想知道的是为什么动态添加的脚本根本不被缓存(除了一些罕见的时刻)。 Yoav Weiss 和 Jake Archibald 似乎也认为这很奇怪,see Twitter conversation
-
我担心这种行为的原因是它对像 require.js 这样的框架有明显的影响,因为它们将所有依赖项作为动态脚本标签插入。例如,如果 JavaScript 是商店前端的性能瓶颈,这尤其成问题。
标签: google-chrome caching rendering