Javascript 缓存-一次使用查询字符串更新多个js文件

Javascript 缓存-一次使用查询字符串更新多个js文件,javascript,model-view-controller,caching,Javascript,Model View Controller,Caching,我正在使用MVC,我们希望阻止浏览器加载旧的.js/.css文件。网络上大多数人说在.js文件的末尾使用查询字符串。因此,在一种观点中,我是这样做的: @section scripts { <script src="@Url.Content("/Scripts/Person/people_list.js?" + System.DateTime.Now)"></script> } @节脚本 { } 到目前为止还不错,效果很好。缓存测试的行为与我所希望的一样 这

我正在使用MVC,我们希望阻止浏览器加载旧的.js/.css文件。网络上大多数人说在.js文件的末尾使用查询字符串。因此,在一种观点中,我是这样做的:

@section scripts
{
     <script src="@Url.Content("/Scripts/Person/people_list.js?" + System.DateTime.Now)"></script>
}
@节脚本
{
}
到目前为止还不错,效果很好。缓存测试的行为与我所希望的一样

这里是我的问题-我们在几个不同的文件上有很多这样的脚本标记。我们希望所有的.js/.css都使用这种模式。我想知道是否有一种方法可以在某个地方添加代码,从而更新所有这些脚本标记以添加查询字符串。(比如共享文件夹的Layout.cshtml?)或者,我应该手动更新每个视图中的每个视图吗


多亏了

一种常用的模式是在请求的页面上生成一个恒定的服务器端。通过这种方式,您可以在调试时使用时间戳,也可以在需要时使用与特定提交/上载相关的“版本”号来清除缓存

当然,这也可以由客户端手工完成。例如,RequireJS提供了一个“半身像”选项

e、 g.(该示例是用PHP编写的,但可以是任何真正的示例)


...
...

不,您可能应该切换到使用捆绑和缩小。它将在您更改其中一个文件时自动为您生成查询字符串值。您的代码不会允许缓存资源,因为DateTime.Now在调用之间永远不会相同(除非您也进行输出缓存)

这里有一篇关于如何做到这一点的文章:虽然它谈到了MVC4/.NET4.5,但您可以从nuget获得早期版本的.NET的捆绑和缩小功能,并且可以在旧的webforms网站上使用它,它只是没有内置

此外,为了更容易调试和更快/更小的生产文件,您应该包括以下样式:

@section styles {
    @Styles.Render("~/content/home")
}
而您的javascript类似于:

@section scripts {
    @Scripts.Render("~/bundles/jquery")
}

这允许您在调试中单独包含脚本和样式,以及在生产中使用web.config中的开关完全组合和缩小版本之间进行切换。举个不错的例子,创建一个新的MVC4 internet web应用程序,您可以在
App\u Start\BundleConfig.cs
中看到它们是如何构建默认捆绑包的,以及如何在
Views\Shared\\u Layout.cshtml

中将它们放置在页面上。您可以为这些静态文件设置expires标头,以便浏览器停止加载旧JS和css文件您使用的web服务器是什么?您是从cdn交付这些文件的吗?感谢大家迄今为止的回复!我们正在使用IIS。一位朋友建议像这样编辑web服务器的选项
@section scripts {
    @Scripts.Render("~/bundles/jquery")
}