为什么Google洞察力要求使用有效的缓存策略为过期的图片提供静态资产?

时间:2019-01-22 03:06:13

标签: cache-control pagespeed-insights

之前我在Google洞察力中进行测试时,它列出了一些可以添加到过期日期的图像,css和js文件,至少我对此是这样理解的:

  

通过有效的缓存策略为静态资产提供服务

因此,我正在通过将图像添加到AWS s3存储桶并设置7天的持续时间进行测试。正如我在Chrome开发者工具中检查过的那样,它确实显示了$('.message a').click(function(){ $('form').animate({height: "toggle", opacity: "toggle"}, "slow"}); 。大小显示从内存中获取的状态代码为304。

但是现在,当我再次在Google Page Speed Insights中进行测试时,它仍然在

下显示此特定图片
  

通过有效的缓存策略为静态资产提供服务

部分。

如果按照建议添加了有效期/较长时间,为什么仍在此处显示图像?还有什么我需要做的事情才能使此静态文件正确提供?

1 个答案:

答案 0 :(得分:0)

Google's Lighthouse suggests建议一年,但也解释说,它的启发式方法比硬编码的限制更笼统。

如果您想听取他们的建议,则使用一年最简单,尽管较小的值应通过支票。

从示例:

Cache-Control: max-age=31536000
  

在可能的情况下,长时间存储不可变的静态资产,例如一年或更长时间。配置您的构建工具,以将哈希值嵌入静态资产文件名中,以使每个文件名都是唯一的。

试探法被解释为是从真实统计数据中得出的,而不是具有特定的值:

  

此估算包括根据向Chrome报告的汇总使用情况统计信息得出的每种资源最佳缓存持续时间的一些计算。持续时间不一定会更好。请查看审核源以了解详细信息。最终,取决于您的资源的最佳缓存持续时间由您决定。

the source code中,您可以看到启发式的定义方式:

// Ignore assets that have very high likelihood of cache hit
const IGNORE_THRESHOLD_IN_PERCENT = 0.925;

...

const cacheHitProbability = CacheHeaders.getCacheHitProbability(cacheLifetimeInSeconds);
if (cacheHitProbability > IGNORE_THRESHOLD_IN_PERCENT) continue;

...
static getCacheHitProbability(maxAgeInSeconds) {
// This array contains the hand wavy distribution of the age of a resource in hours at the time of
// cache hit at 0th, 10th, 20th, 30th, etc percentiles.
// Example: a max-age of 12 hours already covers ~50% of cases, doubling to 24 hours covers ~10% more.
...
const RESOURCE_AGE_IN_HOURS_DECILES = [0, 0.2, 1, 3, 8, 12, 24, 48, 72, 168, 8760, Infinity];
assert.ok(RESOURCE_AGE_IN_HOURS_DECILES.length === 12, 'deciles 0-10 and 1 for overflow');

长话短说:我相信阈值大约在三个月左右(max-age=8337600左右),但匹配精确值不太可能比挑选一年有用。