Странность с Scripts.Render и Scripts.Url

Jun 20, 2014 at 1:48 PM
Добрый день.

Давно не занимался настройкой Bundle Transformer, только обновлял nuget пакеты, а тут пришлось кой чего добавить в проект и я заметил одну странность. И так, на текущий момент я имею Bundle Transformer 1.9.0-Beta2 и Bundle Transformer.Microsoft Ajax 1.9.0-Beta1.

В BundleConfig.cs прописываю:
var jsTransformer = new JsTransformer();
var nullOrderer = new NullOrderer();
bundles.Add(new Bundle("~/JS/jQuery", jsTransformer) { Orderer = nullOrderer }.Include("~/Scripts/jquery-{version}.js"));
В _Layout.cshtml прописываю (для демонстрации странности):
@Scripts.Render("~/JS/jQuery")
<script src="@Scripts.Url("~/JS/jQuery")"></script>
В результате на выходе я вижу следующую картину:
<script src="/Scripts/jquery-2.1.1.js"></script>
<script src="/JS/jQuery?v=ygzUdLNrtOiEywg44JqUPweFpYJfUGNDPI84-hBn2PE1"></script>
И вот тут я перестаю понимать, почему так происходит, возможно, я просто плохо понял смысл описания к функции "Url" - "Returns a fingerprinted URL if the virtualPath is to a bundle, otherwise returns the resolve URL."?

На это поведение ни как не влияет ни Релиз ни режим отладки. Возможно, после того, как проект будет опубликован на сервер я таки увижу две одинаковые строчки, но сейчас это проверить не могу. Единственное, что сейчас влияет на результат - это включение опции BundleTable.EnableOptimizations = true;, тогда да, все отображается как я и предполагал.

Я хотел бы понять, это стандартное поведение?

ЗЫ: я действительно успел подзабыть опыт работы с Bundle Transformer, так как этот модуль меня вообще давно не беспокоил. Спасибо за качественный продукт.
Coordinator
Jun 20, 2014 at 2:55 PM
Привет, Tstar!

Здесь Bundle Transformer вообще не причем. Это особенности Microsoft ASP.NET Web Optimization Framework. Просто @Scripts.Url("~/JS/jQuery") всегда возвращает ссылку на собранный (релизный) бандл, потому что в нем может содержаться сразу несколько файлов, а, как известно, ссылку на несколько файлов сгенерировать невозможно.

Нововведения бета-версии заключаются в более тесной интеграции бандлов и отладочных HTTP-хэндлеров. Если в файл /App_Start/BundleConfig.cs добавить следующий код:
BundleResolver.Current = new CustomBundleResolver();
То отладочные HTTP-хэндлеры будут использовать трансформации из бандлов (трансформации отдельных элементов, трансляторы и постпроцессоры). В режиме отладки к URL каждого файла будет добавляться параметр, содержащий виртуальный путь к бандлу.

Кроме того, появился новый тип модуля – постпроцессор. Постпроцессоры запускаются после трансляторов и до минимизатора. Это было сделано специально для создания модуля BundleTransformer.Autoprefixer.
Jun 23, 2014 at 12:33 PM
Спасибо. Теперь пазл сложился :)

По крайней мере радует, что по ссылке "/JS/jQuery?v=ygzUdLNrtOiEywg44JqUPweFpYJfUGNDPI84-hBn2PE1" я в любом случае получаю доступ к скриптам. Bundle Transformer по этой ссылке выдает собранные в один файл мои скрипты. Правда, это все так сильно усложняет работу с RequireJS :( Приходится вручную каждый модуль прописывать в конфиге RequireJS. Даже не представляю, как можно облегчить себе этот процесс не теряя главное преимущество - не прописывать в конфиге каждый модуль вручную.