Asp.net mvc 4 为什么MVC4捆绑和缩小会使我的文件变大?

Asp.net mvc 4 为什么MVC4捆绑和缩小会使我的文件变大?,asp.net-mvc-4,asp.net-optimization,Asp.net Mvc 4,Asp.net Optimization,我正在MVC4中实现绑定和缩小支持,它似乎使我的javascript文件比没有绑定/缩小的文件更大。我正在使用nuget中提供的最新版本(上的预发布选项)。我在RegisterBundles类中设置了以下包 bundles.Add(new ScriptBundle("~/bundles/baseJS").Include( "~/Scripts/jquery-1.7.1.js", "~/Scripts/jquery.c

我正在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"));
我正在使用

@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
当我在我的生产服务器上运行它时,我从fiddler那里得到了关于整个js包的以下信息

Bytes Received:  999,396    
这是怎么回事?大多数文件在某种程度上都被缩小了,但它的大小不应该是我的有效负载的两倍

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

您可以使用绑定选项,但缩小是通过
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;      

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

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

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

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

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

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

我早上第一件事就是试试……但为什么它会让它变大呢?这是真正让我困惑的部分。关于b1.transforms.Add(new JsMinify())的说法是正确的;这解决了我的问题,总下载量小于未缩小文件的总和。EnableOptimizations=true;只需关闭调试,并像在服务器上一样捆绑和缩小本地dev box上的所有内容;它将js文件捆绑并缩小到388447字节,这与我所期望的差不多。当我将它部署到我的服务器时,没有代码更改,它是999350字节。这怎么可能呢?据我所知,用于捆绑的内部逻辑考虑了调试和发布版本。它将根据此状态选择不同的文件。一个例子可能是发布版的.min.js,但是debug.continue的普通版本。。。跳回您关于“为什么它会使它更大”的问题,很可能是因为bundler添加了分离注释以帮助调试,我希望某种隔离逻辑可以减少脚本之间的任何冲突。我还没有深入挖掘,但这就是我“看到它”的方式。请记住,它仍然只是RC代码,可能有一些bug。注意:Hao是ASP.net捆绑/缩小的首席开发人员。如果我正确理解答案,我想我的问题是,为什么Jquery的缩小比ASP.net的要紧?