在JavaScript中清除缓存

168 javascript caching

如何使用JavaScript清除浏览器缓存?

我们部署了最新的JavaScript代码,但我们无法获取最新的JavaScript代码.

编者注:这个问题在以下几个地方是半复制的,下面第一个问题的答案可能是最好的.这个已接受的答案不再是理想的解决方案.

如何强制浏览器重新加载缓存的CSS/JS文件?

如何强制客户端刷新JavaScript文件?

动态重新加载本地Javascript源/ json数据

Kev*_*son 191

您可以调用window.location.reload(true)来重新加载当前页面.它将忽略任何缓存的项目,并从服务器检索页面,CSS,图像,JavaScript等的新副本.这不会清除整个缓存,但会清除您所在页面的缓存.

但是,您最好的策略是对各种其他答案中提到的路径或文件名进行版本控制.另外,请参阅Revving Filenames:不要使用查询字符串,以免被?v=n用作版本控制方案.

  • 哇谢谢!这适用于从cache.manifest文件加载的HTML5应用程序缓存.我有一个旧的清单,没有从内存中删除,所以一个缓存的浏览器不会显示更新的文件.我在javascript控制台中输入了这个,并且运行正常.谢谢! (6认同)
  • 但通过更改文件名来加速...是否会保留所有以前的版本?否则你会从搜索引擎中获得很多失败的尝试以及什么不能阅读旧版本(或书签/链接图像) (2认同)
  • @Manuel它将仅禁用从您调用location.reload(true)的确切URL的缓存访问页面.它永远不会从缓存中清除原始页面,因为它只是在新请求中附加时间戳,如果此页面异步进行其他调用,则这些请求将不会禁用其缓存行为.例如.如果刷新带有重载(true)的页面加载一些html,并且该页面有一个脚本,该脚本会在同一页面上显示更多html的第二个ajax调用,则第二个请求将不会禁用其缓存. (2认同)
  • 不幸的是,Reload(true) 已被弃用 (2认同)

Gre*_*reg 107

您无法使用javascript清除缓存.一种常见的方法是将修订号或上次更新的时间戳附加到文件中,如下所示:

myscript.123.js
Run Code Online (Sandbox Code Playgroud)

要么

myscript.js?updated=1234567890

  • 但请注意,许多代理在具有查询字符串时不会缓存文件.参见[Kevin Hakanson的回答](http://stackoverflow.com/a/2181544/130121). (9认同)
  • 如何在缓存整个HTML时清除缓存?即使由于缓存HTML而添加版本号也不会影响.请帮助 (3认同)

Bar*_*her 38

尝试更改JavaScript文件的src?由此:

<script language="JavaScript" src="js/myscript.js"></script>
Run Code Online (Sandbox Code Playgroud)

对此:

<script language="JavaScript" src="js/myscript.js?n=1"></script>
Run Code Online (Sandbox Code Playgroud)

此方法应强制您的浏览器加载JS文件的新副本.


Ale*_* T. 19

除了每小时或每周缓存之外,您可以根据文件数据进行缓存.

示例(在PHP中):

<script src="js/my_script.js?v=<?=md5_file('js/my_script.js')?>"></script>
Run Code Online (Sandbox Code Playgroud)

甚至使用文件修改时间:

<script src="js/my_script.js?v=<?=filemtime('js/my_script.js')?>"></script>
Run Code Online (Sandbox Code Playgroud)

  • 我可以验证我是否正确理解了这一点?:使用选项1,当文件更改时,md5校验和哈希值会更改,然后更改URL.浏览器会看到一个新的URL并启动该文件的新加载.服务器会忽略附加到url的get数据.如果是这样的话,非常该死的. (3认同)
  • 使用校验和是个好主意,但应该正确完成.计算每个文件的每个请求都会显着影响您的性能.Querystring也不适合缓存,请参阅其他答案.正确的用法是将校验和(部分?)或版本号附加到文件名并使用此新名称(您可以使用构建脚本在部署时自动执行此操作).见[grunt](http://gruntjs.com/),[rev](https://github.com/cbas/grunt-rev)和[usemin](https://github.com/yeoman/grunt- usemin). (2认同)

Fab*_*ger 10

您还可以强制在PHP中每小时重新加载代码:

<?php
echo '<script language="JavaScript" src="js/myscript.js?token='.date('YmdH').'">';
?>
Run Code Online (Sandbox Code Playgroud)

要么

<script type="text/javascript" src="js/myscript.js?v=<?php echo date('YmdHis'); ?>"></script>
Run Code Online (Sandbox Code Playgroud)

  • @GMsoF这只是一个额外的get参数,在这种情况下用来告诉浏览器它是一个"不同"的文件.因此,浏览器将丢弃缓存版本并加载此版本.这通常与文件的"上次修改日期"一起使用.我希望这是有道理的 ;-) (4认同)

Myg*_*god 7

window.location.reload(true)似乎已被 HTML5 标准弃用。在不使用查询字符串的情况下执行此操作的一种方法是使用Clear-Site-Data标题,这似乎是标准化的

  • 这需要更多的赞成票 (2认同)

小智 6

把它放在模板的末尾:

var scripts =  document.getElementsByTagName('script');
var torefreshs = ['myscript.js', 'myscript2.js'] ; // list of js to be refresh
var key = 1; // change this key every time you want force a refresh
for(var i=0;i<scripts.length;i++){ 
   for(var j=0;j<torefreshs;j++){ 
      if(scripts[i].src && (scripts[i].src.indexOf(torefreshs[j]) > -1)){
        new_src = scripts[i].src.replace(torefreshs[j],torefreshs[j] + 'k=' + key );
        scripts[i].src = new_src; // change src in order to refresh js
      } 
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 请对您的解决方案提供一些解释 (4认同)

Jus*_*son 5

这是我正在使用的最新项目的片段.

从控制器:

if ( IS_DEV ) {
    $this->view->cacheBust = microtime(true);
} else {
    $this->view->cacheBust = file_exists($versionFile) 
        // The version file exists, encode it
        ? urlencode( file_get_contents($versionFile) )
        // Use today's year and week number to still have caching and busting 
        : date("YW");
}
Run Code Online (Sandbox Code Playgroud)

从视图来看:

<script type="text/javascript" src="/javascript/somefile.js?v=<?= $this->cacheBust; ?>"></script>
<link rel="stylesheet" type="text/css" href="/css/layout.css?v=<?= $this->cacheBust; ?>">
Run Code Online (Sandbox Code Playgroud)

我们的发布过程会生成一个文件,其中包含当前版本的修订号.这通过URL编码该文件并将其用作缓存破坏程序来工作.作为故障转移,如果该文件不存在,则使用年份和周数,以便缓存仍然有效,并且每周至少刷新一次.

此外,这为在开发环境中的每个页面加载提供缓存清除,以便开发人员不必担心清除任何资源(javascript,css,ajax调用等)的缓存.


alb*_*anx 5

或者您可以通过服务器使用file_get_contets读取js文件,然后在头文件中将echo放入js内容


Dan*_*iel 5

尝试使用这个

 <script language="JavaScript" src="js/myscript.js"></script>
Run Code Online (Sandbox Code Playgroud)

对此:

 <script language="JavaScript" src="js/myscript.js?n=1"></script>
Run Code Online (Sandbox Code Playgroud)