ASP.NET Web Optimization - путаница с порядком загрузки
С использованием ASP.NET Web Optimization Framework
Я пытаюсь загрузить некоторые файлы JavaScript. Он работает нормально, за исключением того, что я сталкиваюсь со специфической ситуацией с порядком загрузки, скоростью загрузки или ее выполнением. Я не могу понять, какие.
В основном я использую ace
редактор кода для javascript, и я также хочу включить его пакет автозаполнения. Это требует двух файлов.
/ace.js
/ext-language_tools.js
Это не проблема, если я загружаю оба этих файла обычным способом (с <script>
теги) работает нормально. Но когда я пытаюсь использовать пакеты веб-оптимизации, мне кажется, что что-то идет не так.
Попробовать это...
bundles.Add(new ScriptBundle("~/bundles/js") {
.Include("~/js/ace.js")
.Include("~/js/ext-language_tools.js")
});
а потом в поле зрения..
@Scripts.Render("~/bundles/js")
Я получаю ошибку
туз не определен
Это означает, что ace.js
файл не запущен или не загружен. Потому что, если я разобью его на две части, он начнет работать.
bundles.Add(new ScriptBundle("~/bundles/js") {
.Include("~/js/ace.js")
});
bundles.Add(new ScriptBundle("~/bundles/js/language_tools") {
.Include("~/js/ext-language_tools.js")
});
Может кто-нибудь объяснить, почему это будет вести себя таким образом?
1 ответ
Это хорошо объясняется в журнале MSDN Magazine: программирование CSS: комплектация и минимизация (перейдите к разделу " Дополнительные расширенные функции комплектации ").
Выдержка (я выделил текст):
В частности, у класса BundleCollection есть пара функций, которые стоит упомянуть, хотя они в основном полезны при объединении файлов сценариев, а не файлов CSS.
Первая особенность - это заказ. Класс BundleCollection имеет свойство с именем Orderer типа IBundleOrderer. Как ни странно, заказчик - это компонент, отвечающий за определение фактического порядка, в котором вы хотите, чтобы файлы были связаны для загрузки. Заказчиком по умолчанию является класс DefaultBundleOrderer. Этот класс связывает файлы в порядке, который следует из настроек, установленных через FileSetOrderList - свойство BundleCollection. FileSetOrderList разработан как коллекция классов BundleFileSetOrdering. Каждый из этих классов определяет шаблон для файлов (например, jquery-*), а порядок, в котором классы BundleFileSetOrdering добавляются в FileSetOrderList, определяет фактический порядок файлов. Например, при заданной конфигурации по умолчанию все файлы jQuery всегда связываются перед файлами Modernizr.
Источник для класса DefaultBundleOrderer находится здесь.
Однако особый интерес представляет функция AddDefaultFileOrderings класса BundleCollection (скриншот ниже).
Теперь, возвращаясь к вашему вопросу, в вашем комплекте есть ace.js
а также ext-language_tools.js
, Последний файл соответствует ext-*
и в результате всегда будет включен в верхней части списка файлов в вашем пакете до ace.js
,
РЕШЕНИЕ:
На это уже ответили ЗДЕСЬ.
Такое же решение также приведено в журнале MSDN (ссылка вверху).
Другой метод, описанный здесь, состоит в том, чтобы "сбросить все заказы, используя следующий код":
bundles.ResetAll();
"В этом случае эффект от использования заказа по умолчанию или заказа бедняка, показанного ранее, тот же. Обратите внимание, что ResetAll также сбрасывает порядок сценариев".