2014-08-22 6 views
0

Использование ASP.NET Web Optimization Framework, я пытаюсь загрузить некоторые файлы javascript. Он отлично работает, за исключением того, что я сталкиваюсь с особой ситуацией с заказом на загрузку, скоростью загрузки или ее выполнением. Я не могу понять, что.ASP.NET Web Optimization - путаница в порядке загрузки

В основном, я использую редактор 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") 

Я получаю ошибку

туз не определен

Это означает s, что файл 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: Programming CSS: Bundling and Minification (прокрутите до Более расширенные возможности объединения).

Отрывок (I жирным шрифтом текст):

В частности, BundleCollection класс имеет несколько особенностей, которые стоит отметить, несмотря на то, что они в основном полезны, когда файлы, а сценарий, чем CSS файлы - в комплекте.

Первой особенностью является заказ. Класс BundleCollection имеет свойство «Заказчик» типа IBundleOrderer. Насколько это может показаться, заказчик является компонентом, ответственным за определение фактического порядка, в который вы хотите вложить файлы для загрузки. Заказчиком по умолчанию является класс DefaultBundleOrderer. Этот класс связывает файлы в порядке, определяемом параметрами, заданными через FileSetOrderList-свойство BundleCollection. FileSetOrderList предназначен для сбора классов BundleFileSetOrdering. Каждый из этих классов определяет шаблон для файлов (например, jquery- *), а порядок, в котором классы BundleFileSetOrdering добавляются в FileSetOrderList, определяет фактический порядок файлов. Например, учитывая конфигурацию по умолчанию, все файлы jQuery всегда вставляются перед файлами Modernizr.

Источник для DefaultBundleOrderer класс: here.

Однако особый интерес представляет класс BundleCollection 'AddDefaultFileOrderings (снимок экрана ниже).

BundleCollection

Теперь, возвращаясь к вашему вопросу, в вашем расслоении у вас есть ace.js и ext-language_tools.js. Последний файл соответствует ext-* и в результате всегда будет отображаться в верхней части списка файлов в вашем пакете до ace.js.

РЕШЕНИЕ:

Это уже ответил HERE.

Это же решение также представлено в журнале MSDN (ссылка вверху).

Другой метод, описанный там, чтобы «сбросить все упорядоченности, используя следующий код»:

bundles.ResetAll(); 

«В этом случае эффект от использования внимание заказчика по умолчанию или распоряжение заказчика бедняка, показанный ранее то же самое. Заметьте, однако, что ResetAll также сбрасывает порядок упорядочения скриптов. "

+0

Эй, большое спасибо за публикацию этого. Это действительно помогло. Я знаю, что с первого взгляда кажется «Вау, ты глупый, просто используйте второй комплект и делай с ним», но это нечто большее. Это законная проблема, которая может иметь далеко идущие последствия в отношении других вещей, и это то, что я чувствую __does__ нужно понимать. У меня нет подписки на MSDN Magazine, поэтому я бы наверняка искал ее навсегда! – Ciel

+0

Эй, я рад, что смогу помочь! Я согласен, что это сложная функция, которая, вероятно, застала некоторых разработчиков. Я удивлен, что это плохо документировано. – erdinger

+0

@async - Он становится еще лучше. Вся документация, как представляется, ориентирована на группу MVC, а критические части документации не существуют для веб-приложений, отличных от MVC. –

Смежные вопросы