Bundler не включает файлы .min
У меня есть странная проблема с пакетом mvc4, не включающим файлы с расширением .min.js
В моем классе BundleConfig я объявляю
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/Scripts/jquery")
.Include("~/Scripts/jquery-1.8.0.js")
.Include("~/Scripts/jquery.tmpl.min.js"));
}
На мой взгляд, я объявляю
<html>
<head>
@Scripts.Render("~/Scripts/jquery")
</head><body>test</body>
</html>
И когда он отображает, он отображает только
<html>
<head>
<script src="/Scripts/jquery-1.8.0.js"></script>
</head>
<body>test</body>
</html>
Если я переименую jquery.tmpl.min.js в jquery.tmpl.js(и соответственно обновить путь в комплекте), оба сценария отображаются правильно.
Есть ли какой-либо параметр конфигурации, который заставляет его игнорировать файлы .min.js?
Ответы
Ответ 1
Решение, которое я изначально опубликовано, вызывает сомнения (это грязный хак). Измененное поведение изменилось в пакете Microsoft.AspNet.Web.Optimization, и настройка больше не работает, о чем свидетельствуют многие комментаторы. Сейчас я не могу воспроизвести проблему вообще с версией 1.1.3 пакета.
Пожалуйста, смотрите источники System.Web.Optimization.BundleCollection(например, вы можете использовать dotPeek), чтобы лучше понять, что вы думаете делать.
Также прочитайте Ответ Максима Шмелева.
Оригинальный ответ:
Переименуйте .min.js в .js или выполните что-то вроде
public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
{
if (ignoreList == null)
throw new ArgumentNullException("ignoreList");
ignoreList.Ignore("*.intellisense.js");
ignoreList.Ignore("*-vsdoc.js");
ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
//ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
}
public static void RegisterBundles(BundleCollection bundles)
{
bundles.IgnoreList.Clear();
AddDefaultIgnorePatterns(bundles.IgnoreList);
//NOTE: it bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList
//...your code
}
Ответ 2
Microsoft подразумевает следующее поведение (и я предпочитаю следовать ему в моих проектах):
короткая версия
- У вас есть как отладочные, так и уменьшенные версии script в вашем проекте в той же папке:
- Вы добавляете в свой код только script.js.
В результате у вас автоматически есть script.js, включенных в режим DEBUG, и script.min.js в режиме RELEASE.
длинная версия
У вас также может быть версия .debug.js. В этом случае файл включается в следующий приоритет в DEBUG:
- script.debug.js
- script.js
в RELEASE:
Примечание
И, кстати, единственная причина наличия .min версий ваших скриптов в MVC4 - это случай, когда мини-версию нельзя обрабатывать автоматически. Например, следующий код не может быть запутан автоматически:
if (DEBUG) console.log("Debug message");
Во всех остальных случаях вы можете использовать только отладочную версию вашего script.
Ответ 3
Если у вас есть мини-версия файла, самое простое решение, которое я нашел, это скопировать мини файл, удалить .min из скопированного имени файла, а затем ссылаться на неминифицированное имя файла в вашем пакете.
Например, скажем, вы купили компонент js, и они дали вам файл с именем some-lib-3.2.1.min.js. Чтобы использовать этот файл в пакете, выполните следующие действия:
-
Скопируйте файл some-lib-3.2.1.min.js и переименуйте скопированный файл в файл some-lib-3.2.1.js. Включите оба файла в свой проект.
-
Ссылка на неминифицированный файл в вашем комплекте, например:
bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
"~/Scripts/some-lib-{version}.js"
));
Просто потому, что файл без 'min' в имени фактически минимизирован, не должен вызывать никаких проблем (кроме того, что он практически нечитабелен). Он используется только в режиме отладки и записывается как отдельный script. Если не в режиме отладки, в ваш пакет должен быть включен предварительно скомпилированный файл min.
Ответ 4
Я нашел хорошее решение, которое работает хотя бы в MVC5, вы можете просто использовать Bundle
вместо ScriptBundle
. У этого нет умного поведения ScriptBundle
, который нам не нравится (игнорируя .min и т.д.) В этом случае. В моем решении я использую Bundle
для трехсторонних скриптов с файлами .min и .map, и я использую ScriptBundle
для нашего кода. Я не заметил никаких недостатков этого. Чтобы заставить его работать таким образом, вам нужно будет добавить оригинальный файл, например. angular.js, и он будет загружать angular.js в debug, и он будет связывать angular.min.js в режиме выпуска.
Ответ 5
Чтобы отобразить файлы *.min.js
, вы должны отключить BundleTable.EnableOptimizations
, который является глобальным параметром, который применяется ко всем связям.
Если вы хотите включить оптимизацию только для определенных пакетов, вы можете создать свой собственный тип ScriptBundle
, который временно включает оптимизацию при перечислении файлов в комплекте.
public class OptimizedScriptBundle : ScriptBundle
{
public OptimizedScriptBundle(string virtualPath)
: base(virtualPath)
{
}
public OptimizedScriptBundle(string virtualPath, string cdnPath)
: base(virtualPath, cdnPath)
{
}
public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
{
if (context.EnableOptimizations)
return base.EnumerateFiles(context);
try
{
context.EnableOptimizations = true;
return base.EnumerateFiles(context);
}
finally
{
context.EnableOptimizations = false;
}
}
}
Используйте OptimizedScriptBundle
вместо ScriptBundle
для пакетов, чей минитипированный файл всегда должен использоваться, независимо от того, существует ли файл с минимальными значениями.
Пример для пользовательского интерфейса Kendo для ASP.NET MVC, который распространяется как набор только мини файлов.
bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
.Include(
"~/Scripts/kendo/kendo.all.*",
"~/Scripts/kendo/kendo.aspnetmvc.*",
"~/Scripts/kendo/cultures/kendo.*",
"~/Scripts/kendo/messages/kendo.*"));
Ответ 6
В моем случае я использовал (замечательную!) библиотеку Knockout.js, которая поставляется как Debug/Non versions:
"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"
Чтобы сделать эту работу, я включил "Knockout- {Version}.js" (не отлаживаемый) в свой Bundle и получил .debug. js в режиме отладки.
Ответ 7
Простым способом просто переименуйте файл .min, например, у вас есть abc.min.css, а не просто переименуйте этот файл в abc_min.css и добавьте его в свой комплект. Я знаю, что это не правильный способ сделать это, а просто временное решение. благодарность и счастливое кодирование.
Ответ 8
У Bundler есть много преимуществ проверить эту страницу НО:
Платформа Microsoft MVC4 Полагает, что у вас есть как минимум, так и неминифицированная версия для каждого Script или Style Bundle (также доступны другие файлы, такие как Debug и vsdoc). Поэтому у нас есть проблемы в ситуациях, когда есть только один из этих файлов.
Вы можете изменить состояние отладки в файле web.config навсегда для обработки вывода:
<compilation debug="false" targetFramework="4.0" />
Смотрите выходные изменения! Фильтрация файлов изменилась. Для достижения этой цели мы должны изменить фильтрацию фильтра игнорирования, которая изменит логику приложения!
Ответ 9
Folks
Я просто оставил бы это просто, пока Microsoft не начнет действовать вместе
Попробуйте это
В RegisterBundles создайте этот комплект для Kendo
bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
"~/Content/kendo/2012.3.1121/kendo.common.min.css",
"~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
"~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
));
В _Layout.cshtml поставьте это:
@if (HttpContext.Current.IsDebuggingEnabled)
{
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"
rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")"
rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"
rel="stylesheet" type="text/css" />
}
else
{
@Styles.Render("~/Content/kendo/css")
}
Таким образом, мы получаем лучшие из пакетов в Production и ссылку в Debug
Исправить это, когда Microsoft исправляет свой код MVC 4