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?
9 ответов
Решение, которое я первоначально отправил, сомнительно (грязный взлом). Поведение изменено в пакете 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's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList
//...your code
}
Microsoft подразумевает следующее поведение (и я предпочитаю следовать этому в моих проектах):
укороченная версия
- У вас есть отладочная и свернутая версии скрипта в вашем проекте в одной папке:
- script.js
- script.min.js
- Вы добавляете только script.js в пакет в своем коде.
В результате у вас будет автоматически включен script.js в режиме DEBUG и script.min.js в режиме RELEASE.
длинная версия
Вы также можете иметь версию .debug.js. В этом случае файл включается в следующий приоритет в DEBUG:
- script.debug.js
- script.js
в выпуске:
- script.min.js
- script.js
нота
И, кстати, единственной причиной наличия .min- версий ваших скриптов в MVC4 является случай, когда минимизированная версия не может быть обработана автоматически. Например, следующий код не может быть скрыт автоматически:
if (DEBUG) console.log("Debug message");
Во всех остальных случаях вы можете использовать только отладочную версию вашего скрипта.
Если все, что у вас есть, это минимизированная версия файла, самое простое решение, которое я нашел, - это скопировать минимизированный файл, удалить.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' в имени на самом деле минимизирован, не должно вызывать никаких проблем (кроме того факта, что он по сути не читается). Он используется только в режиме отладки и записывается в виде отдельного скрипта. Если не в режиме отладки, предварительно скомпилированный файл min должен быть включен в ваш пакет.
Я нашел хорошее решение, которое работает по крайней мере в MVC5, вы можете просто использовать Bundle
вместо ScriptBundle
, У него нет умного поведения ScriptBundle
что нам не нравится (игнорируя.min и т. д.) в этом случае. В моем решении я использую Bundle
для сторонних скриптов с файлами.min и.map, и я использую ScriptBundle
для нашего кода. Я не заметил никаких недостатков в этом. Чтобы заставить его работать таким образом, вам нужно добавить оригинальный файл, например angular.js, и он будет загружать angular.js в режиме отладки и связывать angular.min.js в режиме выпуска.
Для рендеринга *.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 UI для 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.*"));
Для моего случая я использовал (замечательно!) Библиотеку Knockout.js, которая поставляется в виде отладочной / не версии:
"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"
Чтобы сделать это, я включил "Knockout-{Version}.js" (не отладочный) в свой Bundle и получил.debug. JS-файл в режиме отладки.
Простой способ - просто переименовать файл.min, например, у вас есть abc.min.css, чем просто переименовать этот файл в abc_min.css и добавить его в свой пакет. Я знаю, что это не правильный способ сделать это, а просто временное решение. спасибо и счастливого кодирования.
Bundler имеет много преимуществ, проверьте эту страницу,НО:
Платформа Microsoft MVC4 Считает, что у вас есть как минимум минифицированная версия, так и не минимизированная версия для каждого Script или Style Bundle(также доступны другие файлы, такие как Debug и vsdoc). Поэтому у нас возникают проблемы в ситуациях, когда существует только один из этих файлов.
Вы можете постоянно изменять состояние отладки в файле web.config для обработки вывода:
<compilation debug="false" targetFramework="4.0" />
Смотрите выходные изменения! Фильтрация файлов изменена. Для достижения цели мы должны изменить игнорирование фильтрации случаев, что изменит логику приложения!
Люди, я бы просто держал это, пока 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