当前位置: 首页 > 面试题库 >

强制刷新缓存的CSS数据

芮朗
2023-03-14
问题内容

是否有可能迫使浏览器刷新缓存的CSS?

这并不是每个请求都那么简单。我们有一个站点已有一段时间稳定的CSS。

现在,我们需要对CSS进行一些重大更新;但是,已缓存CSS的浏览器将在两天内不会收到新CSS,从而导致呈现问题。

有没有一种方法可以强制刷新CSS,还是最好选择特定于版本的CSS URL?


问题答案:

有几件事情需要考虑,有多种方法可以解决。首先,规格

我们要完成什么?

理想情况下,修改后的资源将在首次请求时无条件获取,然后从本地缓存中检索,直到它到期且没有后续服务器交互。

观察到的缓存行为

跟踪不同的排列可能会有些混乱,因此我创建了下表。这些观察结果是通过从Chrome向IIS发出请求并在开发人员控制台中观察响应/行为而生成的。

在所有情况下,新的URL都将产生HTTP200。重要的是 后续 请求会发生什么。

+---------------------+--------------------+-------------------------+
|        Type         |   Cache Headers    |     Observed Result     |
+---------------------+--------------------+-------------------------+
| Static filename     | Expiration +1 Year | Taken from cache        |
| Static filename     | Expire immediately | Never caches            |
| Static filename     | None               | HTTP 304 (not modified) |
|                     |                    |                         |
| Static query string | Expiration +1 Year | HTTP 304 (not modified) |
| Static query string | Expire immediately | HTTP 304 (not modified) |
| Static query string | None               | HTTP 304 (not modified) |
|                     |                    |                         |
| Random query string | Expiration +1 Year | Never caches            |
| Random query string | Expire immediately | Never caches            |
| Random query string | None               | Never caches            |
+---------------------+--------------------+-------------------------+

但是
,请记住,浏览器和Web服务器并不总是按照我们期望的方式运行。一个著名的例子:2012年,移动Safari开始缓存POST请求。开发人员不满意。

请求参数

ASP.Net MVC Razor语法中的示例,但几乎适用于所有服务器处理语言。

…由于某些应用程序传统上使用带有查询URL的GETs和HEADs(在rel_path部分中包含“?”的URL)来执行具有明显副作用的操作,因此,除非服务器提供了响应,否则缓存不得将对此类URI的响应视为新鲜的明确的到期时间。这特别意味着,不应从缓存中获取来自HTTP / 1.0服务器对此类URI的响应。

将随机参数添加到HTML中包含的CSS URL的末尾将强制执行新请求,并且服务器应使用HTTP200响应(而不是304,即使尚未修改)。

<link href="normalfile.css?random=@Environment.TickCount" />

当然,如果我们对 每个 请求随机分配查询字符串,这将完全破坏缓存。 这对于生产应用来说是很少/永远不需要的。

如果仅维护一些URL,则可以手动修改它们以包含内部版本号或日期:

@{
    var assembly = Assembly.GetEntryAssembly();
    var name = assembly.GetName();
    var version = name.Version;
}

<link href="normalfile.css?build=@version.MinorRevision" />

这将在用户代理第一次遇到URL时引起一个新请求,但是后续请求将大部分返回304。这仍然会导致发出请求,但至少不会提供整个文件

路径修改

更好的解决方案是创建一条新路径。只需一点努力,即可自动完成此过程,以使用版本号(或其他一致的标识符)重写路径。

该答案显示了用于非Microsoft平台的一些简单而优雅的选项。

微软开发人员可以使用HTTP模块来拦截给定文件类型的所有请求,或者可以利用MVC路由/控制器组合来提供正确的文件(我还没有看到这样做,但是我相信这是可行的)。

当然,最简单的方法(不一定是最快或最好的方法)是在每个发行版中重命名有问题的文件,并在link标记中引用更新的路径。

TLDR

  • 更改文件名或查询字符串
  • 使用每个版本仅发生一次的更改
  • 文件重命名比更改查询字符串更可取
  • 始终设置HTTP标头以最大限度地利用缓存的好处


 类似资料:
  • 问题内容: 我正在通过XAMPP开发基于Wordpress源代码的网站。有时,我更改了CSS代码,脚本或其他内容,但我注意到我的浏览器需要花费一些时间来应用修改。这导致我使用多个浏览器刷新一个浏览器,如果不应用新样式,则尝试第二个浏览器,而且总是这样。 有什么办法可以避免这个问题?有时我在更改代码时没有注意到先前的修改。 问题答案: 一般解决方案按Ctrl+ F5(或Ctrl+ Shift+ R)

  • 问题内容: 在我的React应用程序中,我有两种不同类型的组件: 演示文稿 和 容器 。大约是Dan Abromov的“ Presentational and Container Components”之后 ,除了我不使用Flux或Redux。 现在,我具有以下结构: 该负责从一些REST API加载数据,如果成功的话,代表们提交的数据的。 该负责添加新用户,再通过调用一个REST API。现在,

  • 问题内容: 我将SEAM与JPA(实现为Seam托管持久性上下文)一起使用,在后备bean中,我将一组实体(ArrayList)加载到后备bean中。 如果不同的用户修改了另一个会话中的实体之一,而我希望将这些更改传播到会话中的集合中,则我有一种方法并尝试了以下方法… 用以下查询 重新执行查询,这只会返回我已经拥有的相同数据(我假设它正在使用一级缓存而不是访问数据库) 调用,这应该从数据库刷新,但

  • 问题内容: 我注意到一些浏览器(特别是Firefox和Opera)非常热衷于使用.css和.js文件的缓存副本,即使在浏览器会话之间也是如此。当你更新这些文件之一但用户的浏览器继续使用缓存的副本时,这会导致出现问题。 问题是:强制用户浏览器在文件更改后重新加载文件的最优雅方法是什么? 理想情况下,该解决方案不会强制浏览器在每次访问页面时重新加载文件。我将发布自己的解决方案作为答案,但我很好奇是否有

  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 问题内容: 因为我以前使用过jQuery的AjAX方法,所以我对XMLHttpRequests较新。但是,我需要在网络工作者中工作,现在我必须使用经典的XMLHttpRequest来解决性能问题。 我正在尝试从jquery 重建-property。如果应该禁用缓存,请添加以下内容: 但是,如果我想强制缓存(不是阻止),应该设置哪个标头? 问题答案: 您可以设置各种标头来鼓励缓存,但是它们(包括您使