Почему MVC4 объединяет и уменьшает размер моих файлов?

Я реализую поддержку связывания и минимизации в 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    

Что здесь происходит? Большинство файлов в какой-то мере минимизируются, но они не должны почти удваивать размер моей полезной нагрузки.

Дополнительная информация-   Когда я загружаю js файлы из своего локального dev-блока (файл fiddler размером 379kb), а сервер (fiddler сообщил размер 999kb) и помещает их в kdiff, они двоичные идентичны. Когда я смотрю в вкладке "Сеть разработчиков инструментов Chrome", локальный сервер загружает 379kb, но значение "Parser" равно 975kb. Что такое значение парсера. Может быть, есть какой-то параметр сжатия IIS, который не установлен на моем сервере, но находится на моем локальном сервере IIS? Единственное различие, которое я отмечаю, это тот факт, что IIS Express, который я запускаю на моей машине dev, составляет 8.0, где сервер - IIS 7.5.

Ответ 1

Скорее всего, то, что вы видите здесь, является частью "магии" отладки/выпуска, которая исходит от FileExtensionReplacementList.

Возьмем, например, jQuery. Обычно в папке с вашими скриптами вы увидите две копии каждого файла, то есть jquery-1.6.2.js и jquery-1.6.2.min.js.

По умолчанию оптимизация будет использовать версию min.js при debug=false и использовать регулярную jquery-1.6.2.js при debug=true, так как обычно это упрощает отладку (не связывая и не минимизируя пакет).

Этот выбор файла "magic" управляется с помощью FileExtensionReplacementList на BundleCollection.

В следующем выпуске (окончательная первоначальная версия) в этом списке будет немного больше детализации, так как обычно разработчики захотят настроить таргетинг, когда они должны использоваться, т.е.

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

Ответ 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;