Закрепить ASP.Net MVC Bundle для рендеринга файлов javascript в определенном порядке
Я работаю над приложением ASP.Net MVC 4 и использую Bundling и minifiction для рендеринга стилей и script файлов.
У меня есть файл script (Файл A), который вызывает функцию в другом файле ( Файл B), когда я использую
@Scripts.Render()
он передает тэг link
для Файл A до Файл B, чтобы он запускал ошибку, а script работал неправильно.
Есть ли способ заставить @Script.Render()
отображать теги link
в определенном порядке без использования отдельного пакета для каждого файла????
ИЗМЕНИТЬ
Я использую метод IncludeDirectory
для включения всех script файлов в эту папку
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
"~/Scripts/js",
"*.js"));
}
}
Ответы
Ответ 1
Напишите свой собственный заказчик как Дарин Димитров ответ в этом вопросе: Как я могу указать, что явный ScriptBundle включает заказ?
public class MyBundleOrderer : IBundleOrderer
{
public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
//any ordering logic here
return files;
}
}
Ответ 2
Связывание по умолчанию добавит сценарии в алфавитном порядке. Он будет перемещаться по известным библиотекам и добавлять их в правильном порядке (сначала будет помещен jQuery, а затем, например, jQuery-ui).
Самый простой способ - заказать скрипты самостоятельно. Одним из способов является перемещение ваших пользовательских сценариев в другую папку, а затем добавление всех сценариев в их собственный пакет в нужном вам порядке:
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
"~/Scripts/js","*.js"));
bundles.Add(new ScriptBundle("~/bundles/myScripts").Include(
"~/Scripts/custom/scriptB.js",
"~/Scripts/custom/scriptA.js"));
}
}
Еще один вариант - подстановочные знаки. Этот параметр по-прежнему включает перемещение пользовательских сценариев в их собственную папку, но только с одним пакетом (источником): *
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/js").Include(
"~/Scripts/*.js",
"~/Scripts/custom/scriptB.js",
"~/Scripts/custom/scriptA.js"));
}
}
Также касательно вашего комментария "Есть ли способ заставить @Script.Render()
отображать теги link
в определенном порядке, не используя отдельный пакет для каждого файла" - обратите внимание, что отдельные теги ссылок происходят только в режиме отладки. После развертывания в режиме выпуска будет только один тег ссылки и один файл.
Ответ 3
Посмотрите на BundleCollection.FileSetOrderList для заказа связанных файлов. Я нашел это сообщение в блоге об этом: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx, что объясняет это довольно хорошо.
Пример кода для упорядочения JQuery:
BundleFileSetOrdering bundleFileSetOrdering1 = new BundleFileSetOrdering("jquery");
bundleFileSetOrdering1.Files.Add("jquery.js");
bundleFileSetOrdering1.Files.Add("jquery-min.js");
bundleFileSetOrdering1.Files.Add("jquery-*");
bundleFileSetOrdering1.Files.Add("jquery-ui*");
bundleFileSetOrdering1.Files.Add("jquery.ui*");
bundleFileSetOrdering1.Files.Add("jquery.unobtrusive*");
bundleFileSetOrdering1.Files.Add("jquery.validate*");
bundles.FileSetOrderList.Add(bundleFileSetOrdering1);
Ответ 4
Вам следует рассмотреть возможность использования Cassette http://getcassette.net/
Он поддерживает автоматическое обнаружение зависимостей script на основе script ссылок, найденных внутри каждого файла.
Если вы предпочитаете придерживаться решения MS Web Optimization, но, как идея создания сценариев на основе ссылок script, вы должны прочитать мой блог в блоге http://blogs.microsoft.co.il/oric/2013/12/27/building-single-page-application-bundle-orderer/