我在基于 ASP.NET MVC 的应用程序和 javascript 文件包含在 .csHtml 文件中。
我需要这样做,以便用户不必执行 [Ctrl+F5] 或手动清除缓存,并且每次在浏览器中加载最新版本的 javascript 文件。
如果可以提供一些示例,我将不胜感激。
建议的主要技术是在包含文件时使用虚拟参数。此外,每次修改 js 文件时,我都不会手动更改参数。如果可以自动完成,需要一些示例。
编辑 1:请提供与 ASP.NET MVC 预期的解决方案。
我在基于 ASP.NET MVC 的应用程序和 javascript 文件包含在 .csHtml 文件中。
我需要这样做,以便用户不必执行 [Ctrl+F5] 或手动清除缓存,并且每次在浏览器中加载最新版本的 javascript 文件。
如果可以提供一些示例,我将不胜感激。
建议的主要技术是在包含文件时使用虚拟参数。此外,每次修改 js 文件时,我都不会手动更改参数。如果可以自动完成,需要一些示例。
编辑 1:请提供与 ASP.NET MVC 预期的解决方案。
在 JS 文件的文件名中添加版本号(就像 jQuery 一样)。然后,每当您修改 JS 文件时,都会更改版本并更改包含它的 HTML 文件。
jQuery文件命名示例:
jquery-1.8.3.js
jquery-1.9.0.js
这使您可以在服务器上为 JS 文件本身设置非常长的缓存,这确实有助于提高网站的性能。但是,每当您修改 JS 文件时,查看器都会立即获取新的 JS 文件,因为新命名的文件会被新的 HTML 文件提取,因为它们不在浏览器缓存中。
您可以通过在每个 javascript 文件 URL 之后附加随机哈希或数字 URL 参数来进行缓存清除,如下所示:
http://www.bestsiteonearth.yes/cool_javascript.js?cache_buster=2187sasas1289012890aohkjaiosa0990
由于每次加载页面时该数字都不同,因此不会缓存 URL。更多信息在这里。教程提供了 PHP 示例,但如果您知道如何使用任何语言创建哈希或随机数并可以将其附加到 URL,那么您就可以开始了。
我个人使用 PHP,但我这样做的方式是在输出缓冲区中搜索静态文件,例如图像、脚本和样式表(以及音频、视频等),然后从文件系统中检索它们的修改时间并将其附加为/t=TIMESTAMP
. 然后我使用.htaccess
剥离时间戳并获取原始文件名。这优于查询字符串,因为许多客户端不会缓存带有查询字符串的文件,而且它也优于版本控制,因为它只需修改文件即可自动更新。
您想使用Bundling 和 Minification。根据您的 MVC 版本,实现略有不同。在最新版本中,默认使用它。
捆绑和缩小会将所有脚本(和样式表)组合并缩小到一个文件中(或多个文件,具体取决于您的使用方式),并为它们提供一个独特的参数。每当该特定捆绑包中的文件更改时(因此用户需要下载新文件),该参数会自动更改。
对于 MVC3,您需要安装Microsoft Web Optimization。
然后在你的 global.ascx 中,你会做这样的事情并从以下位置调用它Application_Start
:
private static void SetupBundling()
{
var jsBundle = new Bundle("~/Scripts/js", typeof(JsMinify));
jsBundle.AddDirectory("~/Scripts/", "*.js", false);
jsBundle.AddDirectory("~/Scripts/anothr-good-folder/", "*.js", false);
BundleTable.Bundles.Add(jsBundle);
var randomBundle = new Bundle("~/Scripts/random", typeof(JsMinify));
randomBundle.AddFile("~/Scripts/random/main.js");
randomBundle.AddFile("~/Scripts/random/cool.js");
BundleTable.Bundles.Add(randomBundle);
var cssBundle = new Bundle("~/Content/css", typeof(CssMinify));
cssBundle.AddDirectory("~/Content/", "*.css", false);
BundleTable.Bundles.Add(cssBundle);
}
因此,第一个捆绑包将捆绑.js
您~/Scripts
文件夹中的每个文件。在您的头文件中,您可以像这样引用它:
<script src="@Microsoft.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Scripts/js")" type="text/javascript"></script>
它将呈现为:
<script src="/Scripts/js?v=-2573834892993289" type="text/javascript"></script>
并且任何时候您的.js
文件之一更改(或.css
),参数也会更改。
CSS 捆绑包的类似实现,如果您只想randomBundle
在某些页面上引用它。