Google Chrome 审计说 "The following resources are explicitly non-cacheable" 来自库的 JSF 资源

Google Chrome Audit says "The following resources are explicitly non-cacheable" on JSF resources from library

我使用 Chrome 的审核功能来尝试找出我网站中的一些性能瓶颈。我发现了很多关于不可缓存资源的报告。

我用一个包含库中样式表的单页干了 运行,发现了同样的东西:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html" >
    <h:head>
        <h:outputStylesheet library="default" name="style.css"/> 
    </h:head>
    <h:body>
        <div><h:outputText value="test"/></div>
    </h:body>
</html>

这是审核日志条目:

The following resources are explicitly non-cacheable. Consider making them cacheable if possible:
    style.css.jsf

有趣的是,如果我将它从库中删除,这条消息就会消失。所以,看起来库中的缓存资源有问题。

有办法解决这个问题吗?

编辑:根据此答案中的评论之一,如果在页面上执行正常刷新,可能 CSS 不会被缓存:

可以吗?为什么书签或输入 URL 不能重新使用缓存的副本?

这是一个误报。

library 属性将库值添加为查询字符串,另请参阅 What is the JSF resource library for and how should it be used? Chrome 审计似乎会惩罚 any 查询字符串在资源 URL 中,即使响应 headers 和刷新期间的实际浏览器行为是完全有效的。我自己试了一下 Chrome,我确实也能看到这个错误。

如果您返回 "Network" 选项卡,那么您必须注意到有效的 ExpiresETagLast-Mofidied 响应 headers(并且没有 Cache-Control) 并且您必须观察以下浏览器行为:

  • 在空缓存中的新请求,或通过 Ctrl+F5 硬重新加载页面时,您必须在这些资源上看到 HTTP 状态 200。
  • 导航到引用完全相同资源的另一个页面,或再次单击完全相同(书签)link,或再次在浏览器地址栏中按 Enter,您必须看到灰色的 HTTP 状态200 和尺寸列中的 "from cache"。
  • 通过 F5 或 Ctrl+R 重新加载页面时,您必须在这些资源上看到 HTTP 状态 304(并且浏览器将收到更小的响应 — 只有响应 headers,没有 body — 并继续使用缓存版本)。

如果这些资源确实如 Chrome Audit 字面上提到的那样 "explicitly non-cacheable",您会在每个案例中看到完整的 HTTP 200 响应。

资源 URL 中的查询字符串通常用作缓存清除技术。当服务器端更新资源时,开发人员当然希望在客户端强制重新加载。一种方法是重命名资源 path/filename,但另一种更常见的方法是更改​​查询字符串参数值(通常是代表版本或时间戳的值)。

试试更像样的网络性能测试工具。例如。 Y慢。在我的例子中,它没有打开资源 URLs.

中的查询字符串