如何:Javascript文件始终是最新的

时间:2010-09-22 06:23:09

标签: javascript performance http caching http-caching

我有一个使用大量JavaScript的.NET Web应用程序。 .aspx和.js文件是齐头并进的。 问题:.aspx文件在客户端(不是缓存)上始终是最新的,但.js文件可能会被缓存。如果文件仅缓存一个会话,这甚至是一个问题,因为用户在我的网站上花费了很多时间,每次更新.aspx / .js对时,用户都遇到了问题。

现在,我找到了一个解决方案,但我不确定是否有更好的解决方案,或者我的解决方案是否存在性能缺陷。

这是我的解决方案:

.js- .aspx中的引用:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>

因此,“GetScriptLastModified”将附加一个?v =参数,如下所示:

protected string GetScriptLastModified(string FileName)
{
  string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
  System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
  return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}

因此,呈现的.js-Link对客户端看起来像这样:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>

每次上传新版本时链接都会更改,我可以确定用户在更改时立即获取新脚本或图片。

3 个答案:

答案 0 :(得分:2)

Safari拒绝使用查询参数缓存网址。因此,您可以使用类似于版本化路径的内容而不是查询参数来使用mod_rewrite来删除它。

类似的东西:

<script type='text/javascript' src='/scripts/1377815076/GamesCharts.js'></script>

在Apache配置文件中(配置其他服务器作为家庭作业):

RewriteEngine On
RewriteRule  ^/scripts/[0-9]+/(.+)$    /scripts/$1

答案 1 :(得分:2)

我们在环境中做的是手动增加调用脚本中的计数器:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1'></script>

每当js文件有任何更新时,我们只需递增计数器:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=2'></script>

您的方法自动运行,但每次调用脚本时都需要检索LastWriteTime。如果它是一个高流量站点,它将增加CPU处理。

答案 2 :(得分:0)

只是一个想法:您可能只是将JS渲染为ASPX;我之前用JSP强制重新加载CSS。对此解决方案并不感到自豪,但它之前已经奏效。

<script type='text/javascript' src='/mycode/GamesCharts.js.aspx'></script>

然后只是在ASPX文件中静态渲染JS。