如何防止缓存我的Javascript文件?

Bdf*_*dfy 111 javascript caching

我有一个简单的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>
Run Code Online (Sandbox Code Playgroud)

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

更新:如何使用javascript添加随机脚本?

Cur*_*urt 164

添加随机查询字符串 src

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

<script src="test.js?version=1"></script>
Run Code Online (Sandbox Code Playgroud)

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

ASP.NET:

<script src="test.js?rndstr=<%= getRandomStr() %>"></script>
Run Code Online (Sandbox Code Playgroud)

有关缓存清除的更多信息,请访问:

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

  • 替代解决方案是使用某种构建号(如开头提交的数量,或修订号/提交哈希).这样,您将利用服务器端语言自动执行此操作,但在没有真正更改时不会失去缓存的优势.但是,如上所述,这需要:版本控制(或其他一些更改跟踪)和服务器端处理. (9认同)
  • @Tadeck比这更好,使用内容的散列值,以便在需要时更新.可能会生成新的构建,但JS可能不会更改.ASP.NET Bundling和Minification内置了这个.http://curtistimson.co.uk/front-end-dev/what-is-cache-busting/#_hashed (9认同)
  • 该解决方案的一个令人讨厌的方面是Chrome会将其视为新文件。例如,如果设置了断点,则在下次重新加载时将丢失所有这些断点。 (2认同)

Ale*_*tau 32

<script src="test.js?random=<?php echo uniqid(); ?>"></script>
Run Code Online (Sandbox Code Playgroud)

编辑:或者你可以使用文件修改时间,以便它缓存在客户端上.

<script src="test.js?random=<?php echo filemtime('test.js'); ?>"></script>
Run Code Online (Sandbox Code Playgroud)

  • 你最好把"LastWriteTimeUTC"unix-timestamp放在那里,只要脚本没有改变,它就会保持缓存状态. (2认同)

Que*_*tin 13

配置您的Web服务器以发送脚本的缓存控制HTTP标头.

HTML文档中的假标题:

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


dav*_*ode 11

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

<script src="test.js?v=1"></script>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,浏览器将使用缓存版本,直到指定新版本(v = 2,v = 3 ...)


Bas*_*ter 6

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

<script type="text/javascript" src="test.js?q=123"></script> 
Run Code Online (Sandbox Code Playgroud)

每次刷新页面时,都需要确保"q"的值已更改.