我有一个使用大量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>
每次上传新版本时链接都会更改,我可以确定用户在更改时立即获取新脚本或图片。
答案 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。