【问题标题】:Why is MVC4 bundling and minification making my files bigger?为什么 MVC4 捆绑和缩小会使我的文件变大?
【发布时间】:2012-06-27 21:25:27
【问题描述】:

我正在 MVC4 中实现捆绑和缩小支持,看起来它使我的 javascript 文件比未捆绑/缩小时更大。我正在使用 nuget 中可用的最新版本(预发布选项)。我在我的 RegisterBundles 类中设置了以下捆绑包。

bundles.Add(new ScriptBundle("~/bundles/baseJS").Include(
                    "~/Scripts/jquery-1.7.1.js",
                    "~/Scripts/jquery.cookie.js",
                    "~/Scripts/jquery-ui-1.8.11.js",
                    "~/Scripts/bootstrap.js",
                    "~/Scripts/jquery.pjax.js",
                    "~/Scripts/kendo/2012.1.515/js/kendo.all.min.js",
                    "~/Scripts/jquery.jstree.js",
                    "~/Scripts/jquery.unobtrusive-ajax.js",
                    "~/Scripts/jquery.validate.js",
                    "~/Scripts/jquery.validate.unobtrusive.js",
                    "~/RIS.Scripts/PostJson.js"));

我正在将它加载到我的 _Layout.cshtml 中使用

@Scripts.Render("~/bundles/baseJS")

当我在调试模式下将 Fiddler 中收到的这些脚本的字节数相加时,我得到以下信息

Name                        Size(bytes)
jquery                      98013
jquery cookie               1455
jquery ui                   124704
bootstrap                   52378
pjax                        8138
kendo.all                   219751
jstree                      55045
unobtrusive-ajax            2492
validate                    13323
validate-unobtrusive        5138
postjson                    634

Total                       581071

当我在我的生产服务器上运行它时,我从提琴手那里得到了整个 js 包的以下内容。

Bytes Received:  999,396    

这里发生了什么?大多数文件在某种程度上都被缩小了,但它不应该几乎是我的有效负载大小的两倍。

其他细节- 当我从本地开发盒(fiddler 报告大小 379kb)和服务器(fiddler 报告大小 999kb)下载 js 文件并将它们放入 kdiff 时,它们的二进制文件是相同的。当我查看 Chrome 的开发者工具网络选项卡时,本地服务器下载 379kb,但“解析器”的值为 975kb。这个解析器值是多少。是否有一些 IIS 压缩设置未在我的服务器中设置但在我的本地 IIS 服务器上?我注意到的唯一区别是,我在开发机器上运行的 IIS Express 是 8.0,而服务器是 IIS 7.5。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-optimization


    【解决方案1】:

    您在这里看到的很可能是来自FileExtensionReplacementList 的一些调试/发布“魔法”。

    我们以 jQuery 为例。通常在您的脚本文件夹中,您会看到每个文件的两个副本,即jquery-1.6.2.jsjquery-1.6.2.min.js

    默认情况下,优化将在debug=false 时使用min.js 版本,在debug=true 时使用常规jquery-1.6.2.js,因为通常这会使调试更容易(无需捆绑也无需缩小捆绑包)。

    此文件选择“魔法”通过FileExtensionReplacementList 上的BundleCollection 控制。

    在下一个版本 (RTM) 中,此列表中的粒度会更细一些,因为通常开发人员希望确定何时应该使用这些,即

    list.Add("min", OptimizationMode.WhenEnabled);
    list.Add("debug", OptimizationMode.WhenDisabled);
    

    【讨论】:

    • 注意:Hao 是 ASP.NET 捆绑/缩小的首席开发人员
    • 如果我正确理解了答案,我想我的问题是为什么 Jquery 的缩小比 ASP.net 的缩小?
    【解决方案2】:

    您可以使用捆绑选项,但缩小是通过 BundleTable.EnableOptimizations = true 设置和一些您尚未使用的“转换”选项完成的。请参阅 CssMinify 和 JsMinify。

    类似的东西:

            var b1 =new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-1.*");
    
            b1.Transforms.Add(new JsMinify());
    
            bundles.Add(b1);
    

    -和-

    BundleTable.EnableOptimizations = true;      
    

    【讨论】:

    • 我会在早上尝试这个第一件事......但为什么它会变得更大?这才是真正让我困惑的部分。
    • 您对 b1.transforms.Add(new JsMinify()); 的看法是正确的这解决了我的问题,总下载量小于未压缩文件的总和。 EnableOptimizations = true;只需关闭调试,并像在服务器上一样捆绑和缩小本地开发盒上的所有内容。
    • 好的,当我在我的开发盒上运行 EnableOptimizations = true;它将 js 文件捆绑并缩小到 388,447 字节,这与我预期的差不多。当我将它部署到我的服务器而不更改代码时,它是 999,350 字节。这怎么可能?
    • 据我了解,用于捆绑的内部逻辑等考虑了调试与发布版本。它会根据这个状态选择不同的文件。一个示例可能是用于发布的 .min.js,但用于调试的普通版本。
    • continuing ... 跳回到您关于“为什么它会变大”的问题,很可能是因为捆绑器添加了分离 cmets 以帮助调试,我希望某种隔离逻辑能够减少脚本之间的任何冲突。我还没有深入挖掘,但这就是我“看到它”的方式。记住它仍然只是 RC 代码,它可能有一些错误。
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2023-03-03
    • 2013-02-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多