Почему 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;