2

许多代码示例,以及Visual Studio 2012 为新的 MVC 应用程序生成的默认RegisterBundles方法,都包含这样的代码,用于将常见的 JavaScript 文件(如 jQuery)添加到包中:BundleConfig.cs

    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));

在一定比例的情况下,用户的浏览器已经在其缓存中拥有这些公共文件。因此,等待通过捆绑再次下载文件似乎很浪费。

除非浏览器可以识别出捆绑的文件(可能与其他文件连接并缩小)已经存在,否则这种捆绑的使用似乎根本不会加快速度,反而会导致不必要的延迟。

或者我在这里错过了什么?也许“通用”文件(jQuery等)已经被缓存的可能性很低?

4

2 回答 2

1

我不认为这是浪费,仅缩小功能就应该有助于改善客户响应。但这确实取决于您的网络应用程序中的 js、css 等。浏览器仅限于六个同时连接。因此,如果您的网页有六个或更少的客户端文件,则使用 ScriptBundle 可能没有意义。但是由于大多数网站都有大量的 javascript 和 css,因此 ScriptBundle 的缩小功能是值得的。这将大大减少发送给用户的 KB 量。您可以随时禁用它并查看这些文件对您的应用程序的负载量。

于 2013-09-23T17:50:34.677 回答
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> 
于 2013-09-23T18:36:34.863 回答