2

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

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

这是我的解决方案:

.aspx 中的 .js 引用:

<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>

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

4

3 回答 3

2

Safari 拒绝缓存带有查询参数的 URL。因此,您可以使用诸如版本化路径之类的东西来代替查询参数,并使用 mod_rewrite 将其删除。

就像是:

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

在 Apache 配置文件中(其他服务器的配置留作作业):

RewriteEngine On
RewriteRule  ^/scripts/[0-9]+/(.+)$    /scripts/$1
于 2010-09-22T07:03:05.690 回答
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 处理。

于 2011-06-03T10:53:29.210 回答
0

只是一个想法:您可能只是将 JS 呈现为 ASPX;我之前已经使用 JSP 强制重新加载 CSS。不为那个解决方案感到自豪,但它以前曾奏效过。

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

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

于 2010-09-22T06:50:32.927 回答