我们可以阻止 CSS 缓存吗?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费积分!

当您开发网站时,会进行大量的“刷新”操作。 您开始对浏览器在单次刷新中会获取什么和不会获取什么有了一个很好的了解。 例如,我发现,如果我在服务器上覆盖了一个图像文件,则需要 **刷新两次** 该图像才能在实时网站上更新。 然后,我可能会切换到 Opera 并查看该网站在那里的运行情况,结果发现页面第一次渲染时是 **非常旧的** 版本。 糟糕。 刷新。 刷新。 哦... 出现了。

这对您来说没什么问题,您已经习惯了这种事情。 但是,如果您将相同的链接发送给您的客户,并且发生了同样的事情怎么办。 很有可能(至少)会造成一些混乱。 在更大范围内,假设您在一个流量很大的网站上推出了一次相当重大的布局变更。 由于 CSS 缓存,许多人可能在下一次访问时看到布局混乱。

我们能解决这个问题吗? 是否有办法阻止 CSS 缓存?

为您的 CSS 添加时间戳

有一个小技巧,我相信它来自 JavaScript 程序员的世界。 为了阻止他们的脚本缓存,他们在 src 属性的末尾添加了一个时间戳。 因此,让我们窃取这个想法。

我做了一个 快速测试,看看这种胡闹是否真的可行。 以下是我如何包含样式表链接

<link rel="stylesheet" type="text/css" href="style.css?<?php echo date('l jS \of F Y h:i:s A'); ?>" />

结果是

<link rel="stylesheet" type="text/css" href="style.css?Thursday 24th of April 2008 04:45:21 PM" />

根据需要更改 日期格式。 您可能想要跳过空格。

这里理论是,该链接每秒都会更改,浏览器会被欺骗以为这是一个新的样式表,并每次都会重新加载它。 Jason Edmond Beaird 有 相同的想法,甚至创建了一个小书签来强制执行它。

我还没有对此进行任何深入测试,但我的早期测试表明它运行良好。 您对此怎么看? 我只是在喝“酷饮”吗? 这样做有什么严重的问题吗? 是否有更好/更智能/更快的方法?

更新

我在这里更新了 2013 年 6 月的信息,只是要指出一些重要的事情。

在生产环境中,在推出新 CSS 时破坏缓存是一个非常好的计划。 但是,使用这里介绍的日期戳破坏缓存意味着您将无法从浏览器缓存中获得任何好处,这将对性能造成灾难性影响。 您最好使用其他方法,例如在文件名末尾添加版本号,例如 style.css?version=3.2,然后根据需要更新它。

在本地开发环境中,可能可以接受在每次页面加载时破坏缓存,但是现代开发工具(如 Chrome 的 Web 检查器)可以关闭缓存。