【问题标题】:Cache invalidation using the query-string, bad practice?使用查询字符串缓存失效,不好的做法?
【发布时间】:2016-09-09 07:31:57
【问题描述】:

在我制作的网站上,我通常使用查询字符串参数使 CSS 和 JS 的缓存无效,如下所示:

注意:这是来自 chrome 检查器的屏幕截图,这些查询字符串都是由我在渲染到浏览器时制作的一个小系统自动附加的。

一位朋友现在告诉我,使用查询字符串的缓存效果不如更改文件名本身或文件名之前的路径中的某个位置。他还发送了an article along with 它,这里他们主要谈论人们使用代理时性能不佳。

但是,该文章已有 8 年历史。我想知道,这仍然是一个有效的观点吗?我应该关心吗?这真的是一种不好的做法吗?

【问题讨论】:

  • 为什么你有?v=1.1.0-alpha的文件?
  • @Justinas 这就是您使缓存无效的方式,您将新版本添加到查询字符串中,并且该文件不会从缓存中获取,而是从网络中获取。
  • @jcubic 实际上您将文件名设置为 header.js 并且仅将 chache 无效附加到链接。 OP显示所有文件都以?v=1.1.0-alpha作为(?)扩展名
  • @Justinas 这不是一个扩展在你的浏览器中试试这个data:text/html,<script src="http://code.jquery.com/jquery-1.11.3.min.js?v=1.11.3"></script>你会看到文件jquery-1.11.3.min.js?v=1.11.3

标签: javascript css caching web


【解决方案1】:

确实,查询字符串缓存失效并不是最佳实践。在某些情况下它不起作用...某些浏览器(据说),并且您的 CDN 可能设置为忽略查询字符串(提供相同的文件)。但这并不意味着它对开发工作流程无效或作为一种快速解决方案无效。

有些人强烈认为查询字符串不够好。对于专业网站(尤其是持续集成)您应该使用基于上次更新日期或文件内容哈希的文件名。

关于该主题的链接...

【讨论】:

  • “查询字符串缓存失效并不是最佳实践。”?有没有专家不鼓励这种做法?谷歌、亚马逊和大多数 CDN 在他们的网站上都有一个关于如何做到这一点的部分。
  • “在某些情况下它不起作用”。在哪里? “一些浏览器(据说)”哪些?我能找到的唯一问题是 Squid Cache(不是浏览器)默认配置为不缓存动态内容。此默认设置已在 2008 年更改(修复)。
  • 如果不建议将其用于生产用途!您应该建议 stackoverflow.com。如果您查看此页面的源代码,您将看到:
【解决方案2】:

如果 Google 为您提供如何正确执行此操作的教程,我想它一定会得到很好的支持。

https://cloud.google.com/cdn/docs/cache-invalidation-overview

【讨论】:

    【解决方案3】:

    如果您目前正在开发您的网站,那么您将真正使用附加到资源链接的 random 查询字符串。赞<a href="header.js?noCache=<?= time(); ?>">

    但你已经说过,这已经工作了 8 年,所以缓存一些资源也许是件好事?

    是的,非缓存版本的运行速度会比缓存版本慢。

    【讨论】:

    • 我更新了原帖,8年是关于文章的。它已经 8 岁了,我想知道这家伙是否还有一个有效的观点。我已经使用查询字符串很长时间了,我个人从来没有遇到过问题。
    • 这个答案完全删除了缓存。仅当文件发生更改时才应更改查询字符串值,在这种情况下为 header.js..
    • 我有时会使用类似的技术,但使用文件的filemtime,而不仅仅是time。它在计算上不是最优的,但在许多用例和简单的网站中,简单读取文件属性应该可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2021-01-10
    • 2010-09-14
    • 2015-06-06
    • 2016-09-06
    相关资源
    最近更新 更多