Google Chrome Audit在库中的JSF资源上说"以下资源显式不可缓存"

wsa*_*ton 3 css jsf http-caching google-chrome-devtools

我使用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>
Run Code Online (Sandbox Code Playgroud)

这是审计日志条目:

The following resources are explicitly non-cacheable. Consider making them cacheable if possible:
    style.css.jsf
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我从库中删除它,这条消息就会消失.因此,看起来在库中缓存资源存在问题.

有没有办法来解决这个问题?

编辑:根据本回答中的一条评论,如果在页面上执行正常刷新,可能不会缓存CSS: 正确设置HTTP标头以强制缓存JS,CSS和PNG文件

那可能是对的吗?为什么书签或键入的URL不能重新使用缓存副本?

Bal*_*usC 12

这是一个错误的错误.

library属性将库值添加为查询字符串,另请参阅什么是JSF资源库以及如何使用它?Chrome审核似乎会惩罚资源网址中的任何查询字符串,即使刷新期间的响应标头和实际浏览器行为完全有效.我刚试过自己的Chrome,我确实也能看到这个错误的错误.

如果你回"网络"选项卡,然后你一定要注意有效期Expires,ETagLast-Mofidied响应头(没有Cache-Control),你必须遵守下面的浏览器行为:

  • 在空缓存中的新请求或通过Ctrl + F5硬重新加载页面时,您必须在这些资源上看到HTTP状态为200.
  • 在导航到引用完全相同资源的另一个页面,或再次单击完全相同(书签)链接时,或再次按下浏览器地址栏中的Enter时,您必须看到灰色的HTTP状态200和"来自缓存"的大小柱.
  • 在通过F5或Ctrl + R重新加载页面时,您必须在这些资源上看到HTTP状态为304(并且浏览器将收到更小的响应 - 仅响应标头,没有正文 - 并继续使用缓存版本).

如果这些资源真的"明确地不可缓存",就像Chrome Audit提到的那样,你会在每个案例中看到完整的HTTP 200响应.

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

尝试更好的Web性能测试工具.例如YSlow.在我的例子中,它没有翻转资源URL中的查询字符串.