许多代码示例以及Visual Studio 2012为新MVC应用程序生成的RegisterBundles
中的默认BundleConfig.cs
方法包含这样的代码,用于将一些常见的JavaScript文件(如jQuery)添加到一个包中:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
在某些情况下,用户的浏览器已在其缓存中包含这些常用文件。因此,等待通过捆绑再次下载文件似乎很浪费。
除非浏览器能够识别捆绑文件(可能与其他文件连接并缩小)已经存在,否则捆绑的使用似乎不会加快速度,反而会导致不必要的延迟。 / p>
或者我在这里遗漏了什么?也许“常见”文件(jQuery等)已被缓存的概率很低?
答案 0 :(得分:1)
我不认为这是浪费,单独的缩小功能应该有助于改善客户的反应。但它确实取决于你的网络应用程序中的js,css等。浏览器限制为六个同时连接。因此,如果您的网页有六个或更少的客户端文件,那么使用ScriptBundle可能没有意义。但由于大多数网站都有大量的javascript和css,因此ScriptBundle的缩小功能值得。这将大大减少发送给用户的KB数量。您可以随时禁用它,并查看这些文件对您的应用程序的负载程度。
答案 1 :(得分:1)
“用户的浏览器已在其缓存中包含这些常用文件”
不正确。您正在引用本地副本,因此如果它们之前已经到过您的站点,它将只在缓存中...如果您之前没有使用过捆绑,那么不会,它将不会被缓存。在第一次下载之后,是的,它将保持缓存,直到您更改脚本。
如果要引用用户可能已缓存的版本,则可以使用CDN。以下代码来自ASP.NET Bundling and Minification
public static void RegisterBundles(BundleCollection bundles)
{
bundles.UseCdn = true; //enable CDN support
var jqueryCdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js";
bundles.Add(new ScriptBundle("~/bundles/jquery",
jqueryCdnPath).Include(
"~/Scripts/jquery-{version}.js"));
}
然后如果CDN失败则回退:
@Scripts.Render("~/bundles/jquery")
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
var e = document.createElement('script');
e.src = '@Url.Content("~/Scripts/jquery-1.7.1.js")';
e.type = 'text/javascript';
document.getElementsByTagName("head")[0].appendChild(e);
}
</script>