如何防止缓存我的 Javascript 文件? [复制]

Posted

技术标签:

【中文标题】如何防止缓存我的 Javascript 文件? [复制]【英文标题】:How to prevent caching of my Javascript file? [duplicate] 【发布时间】:2011-11-16 19:31:41 【问题描述】:

我有一个简单的 html

<html>
<body>
<head>
<meta charset="utf-8">
<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>
<script src="test.js"></script>
</body>
</html>

在 test.js 中,我更改了一个 javascript 函数,但我的浏览器正在缓存这个文件。如何禁用脚本 src 的缓存?

【问题讨论】:

我向脚本源添加了时间戳,但仍有几个用户需要触发 F5 或 Ctrl+F5 才能获取新脚本。怎么样? (内联网不是万维网) 【参考方案1】:

src添加随机查询字符串

您可以通过在每次进行更改时增加查询字符串来手动执行此操作:

<script src="test.js?version=1"></script>

或者,如果您使用的是服务器端语言,您可以自动生成:

ASP.NET:

<script src="test.js?rndstr=<%= getRandomStr() %>"></script>

更多关于缓存清除的信息可以在这里找到:

https://curtistimson.co.uk/post/front-end-dev/what-is-cache-busting/

【讨论】:

另一种解决方案是使用某种内部版本号(例如自开始以来的提交数,或修订号/提交哈希)。这样,您将利用服务器端语言自动执行此操作,但在没有真正改变时不会失去缓存的优势。但这需要如前所述:版本控制(或其他一些更改跟踪)和服务器端处理。 @Tadeck 更好的是,使用内容的散列值,以便在需要时更新。可能会生成一个新版本,但 JS 可能不会改变。 ASP.NET Bundling and Minification 内置了这个。curtistimson.co.uk/front-end-dev/what-is-cache-busting/#_hashed 你们都错了! @SébastienGarcia-Roméo 这是一个有效的选项。这是我在链接帖子curtistimson.co.uk/post/front-end-dev/what-is-cache-busting 中提出的选项之一 这个解决方案的一个令人讨厌的方面是 Chrome 会将其视为一个新文件。例如,如果您设置了断点,您将在下次重新加载时丢失所有断点。【参考方案2】:
<script src="test.js?random=<?php echo uniqid(); ?>"></script>

编辑:或者您可以使用文件修改时间,以便将其缓存在客户端上。

<script src="test.js?random=<?php echo filemtime('test.js'); ?>"></script>

【讨论】:

你最好把 "LastWriteTimeUTC" unix-timestamp 放在那里,这样只要脚本没有改变它就会保持缓存。 简单但很好的解决方案,谢谢。 uniqid() 每次都会生成新的文件名。我认为,更好的方法是filemtime 函数。这只会在文件被修改时更改文件版本,这就是我们在代码中进行更改并要求客户端清除缓存时的问题。【参考方案3】:

Configure your webserver 为脚本发送缓存控制 HTTP 标头。

HTML 文档中的虚假标题:

    不像真正的 HTTP 标头那样受支持 应用于 HTML 文档,而不是它链接到的资源

【讨论】:

【参考方案4】:

您可以将 queryString 附加到您的 src 并仅在您发布更新版本时更改它:

<script src="test.js?v=1"></script>

这样浏览器将使用缓存的版本,直到指定新版本(v=2,v=3...)

【讨论】:

【参考方案5】:

您可以将随机(或日期时间字符串)作为查询字符串添加到指向您的脚本的 url。像这样:

<script type="text/javascript" src="test.js?q=123"></script> 

每次刷新页面时,都需要确保 'q' 的值发生变化。

【讨论】:

以上是关于如何防止缓存我的 Javascript 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS:如何防止浏览器缓存静态文件?

Vue CLI 3 防止某些输出文件的缓存破坏

Cocoa - 防止在 WebKit 中缓存 Javascript - Safari Beta 4 错误?

如何防止其他网站链接到我的 javascript 文件?

如何在 IIS 中关闭凭据缓存?

Firebase 托管:如何防止对 SPA 的 index.html 进行缓存