将散列附加到 js 文件名 vs Cache-Control:no-store
Appending hash to js filenames vs Cache-Control: no-store
我正在阅读这篇 answer 关于如何将资源(例如 JS 或 CSS 文件)的哈希附加到文件名,以便您的浏览器仅在文件发生更改时才下载它, 否则使用缓存版本。
为什么要通过 HTTP 使用它 header Cache-Control: no-cache
?
在文件名中使用散列意味着您需要确保永远不会缓存包含 <script src="myscript.someHash.js"></script>
标签的 HTML。
为什么不允许使用 no-cache
缓存 HTML(以及所有其他资源)?
这里讨论的是在确保正确性的同时缓存页面的两种不同方法。 This article 很好地描述了它们,因此我将使用它的术语:模式 1 在 HTML 页面上使用 no-cache
,但创建了独特的每个版本的静态资产的文件名,并允许它们永久缓存。 模式 2 仅对所有内容使用 no-cache
。
它们都有效。从性能的角度来看,模式 1 将更胜一筹,因为它的某些页面只有 no-cache
。唯一的缺点是构建工作流程更复杂,因为您需要生成唯一的文件名并确保您的 HTML 页面正确链接到它们。幸运的是,许多框架都支持这种工作流程。
您主要担心的似乎是“您需要确保永远不会缓存包含 [static links] 的 HTML”。但它仍然可以被缓存,只是需要在每次使用时重新验证。但模式 2 中的 每个 文件都是如此,因此它不是相对劣势。
我正在阅读这篇 answer 关于如何将资源(例如 JS 或 CSS 文件)的哈希附加到文件名,以便您的浏览器仅在文件发生更改时才下载它, 否则使用缓存版本。
为什么要通过 HTTP 使用它 header Cache-Control: no-cache
?
在文件名中使用散列意味着您需要确保永远不会缓存包含 <script src="myscript.someHash.js"></script>
标签的 HTML。
为什么不允许使用 no-cache
缓存 HTML(以及所有其他资源)?
这里讨论的是在确保正确性的同时缓存页面的两种不同方法。 This article 很好地描述了它们,因此我将使用它的术语:模式 1 在 HTML 页面上使用 no-cache
,但创建了独特的每个版本的静态资产的文件名,并允许它们永久缓存。 模式 2 仅对所有内容使用 no-cache
。
它们都有效。从性能的角度来看,模式 1 将更胜一筹,因为它的某些页面只有 no-cache
。唯一的缺点是构建工作流程更复杂,因为您需要生成唯一的文件名并确保您的 HTML 页面正确链接到它们。幸运的是,许多框架都支持这种工作流程。
您主要担心的似乎是“您需要确保永远不会缓存包含 [static links] 的 HTML”。但它仍然可以被缓存,只是需要在每次使用时重新验证。但模式 2 中的 每个 文件都是如此,因此它不是相对劣势。