Я просто пытаюсь ASP.NET MVC 4, но я не могу понять, как отключить функцию Javascript/CSS minification. Особенно для среды разработки это очень поможет в отладке. Я бы предположил, что это будет переход в web.config, но поскольку ASP.NET MVC 4 все еще находится в стадии бета-тестирования, на данный момент там действительно мало информации. Был бы признателен, если кто-то может помочь или указать правильные сообщения в блогах и т.д.
Как отключить миниатюра Javascript/CSS в бета-версии ASP.NET MVC 4
Ответ 1
В Global.asax.cs
#if DEBUG
foreach (var bundle in BundleTable.Bundles)
{
bundle.Transform = new NoTransform();
}
#endif
Ответ 2
Другой вариант - создать помощник HTML, который можно использовать для создания тегов script и ссылок. Вот что я применил для Javascript, который также можно сделать для CSS:
public static class BundleHelper
{
public static MvcHtmlString JsBundle(this HtmlHelper helper, string bundlePath)
{
var jsTag = new TagBuilder("script");
jsTag.MergeAttribute("type", "text/javascript");
return ReferenceBundle(helper, bundlePath, jsTag);
}
public static MvcHtmlString ReferenceBundle(this HtmlHelper helper, string bundlePath, TagBuilder baseTag)
{
var httpContext = helper.ViewContext.HttpContext;
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
var htmlString = new StringBuilder();
if (bundle != null)
{
var bundleContext = new BundleContext(helper.ViewContext.HttpContext, BundleTable.Bundles, urlHelper.Content(bundlePath));
if (!httpContext.IsDebuggingEnabled)
{
baseTag.MergeAttribute("href", System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(bundlePath));
return new MvcHtmlString(baseTag.ToString());
}
foreach (var file in bundle.EnumerateFiles(bundleContext))
{
var basePath = httpContext.Server.MapPath("~/");
if (file.FullName.StartsWith(basePath))
{
var relPath = urlHelper.Content("~/" + file.FullName.Substring(basePath.Length));
baseTag.MergeAttribute("href", relPath, true);
htmlString.AppendLine(baseTag.ToString());
}
}
}
return new MvcHtmlString(htmlString.ToString());
}
}
Теперь все, что вам нужно сделать, это вызвать его на ваш взгляд:
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="~/Content/css" rel="stylesheet" type="text/css" />
<link href="~/Content/themes/base/css" rel="stylesheet" type="text/css" />
@Html.JsBundle("~/scripts/js")
<meta name="viewport" content="width=device-width" />
</head>
И он будет отображать сценарии в виде отдельных ссылок или использовать новую функцию связывания/минимизации в зависимости от того, какой параметр отладки находится в вашем web.config. Я использовал код http://codecutout.com/resource-minify-bundling в качестве ссылки при создании моего помощника, если вы хотите увидеть еще несколько примеров. Их помощник написан немного лучше, бросая исключения, когда поставляются недопустимые аргументы, и т.д. Я еще не успел очистить мой.
Ответ 3
Вы можете зарегистрировать свои собственные пакеты в Global.asax и использовать класс NoTransform
, если вы не хотите, чтобы контент был минимизирован.
Я лично не хочу, чтобы мой script был вообще преобразован. Я просто создаю два каталога script. Один с версиями отладки script и один с первоначально загруженными мини-версиями.
MVC 4 из коробки minifier (JsMinify) разбивает jQuery 1.7.1 для Opera, поэтому я не хочу использовать этот. Я просто поместил следующие строки в свой метод Global.asax: Application_Start()
:
Bundle debugScripts = new Bundle("~/DebugScripts",
new NoTransform("text/javascript"));
debugScripts.AddDirectory("~/Scripts/Debug", "*.js");
BundleTable.Bundles.Add(debugScripts);
Bundle productionScripts = new Bundle("~/ProductionScripts",
new NoTransform("text/javascript"));
productionScripts.AddDirectory("~/Scripts/Minified", "*.js");
BundleTable.Bundles.Add(productionScripts);
С этим я могу просто добавить одну из двух строк в моей _layouts.cshtml
:
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/DebugScripts")" type="text/javascript"></script>
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/ProductionScripts")" type="text/javascript"></script>
Конечно, мы могли бы получить немного больше напуганных с этим на месте. Мы могли бы сгенерировать только один пакет и в зависимости от построенного типа выбрать, какие файлы включать.
Ответ 4
После вызова EnableDefaultBundles()
в Global.asax вы можете сделать это...
if ( ... running in development environment ...)
{
var registeredBundles = BundleTable.Bundles.GetRegisteredBundles();
foreach (var bundle in registeredBundles)
{
if (bundle.Transform is System.Web.Optimization.JsMinify)
bundle.Transform = new NoTransform();
}
}
Не очень (изменение состояния, заданное системой), но это намного меньше кода, чем все другие предложения, все еще позволяет использовать стандартное поведение связывания и не вносить никаких изменений в ваши представления.
Ответ 5
В новых версиях ASP.NET MVC просто добавьте
#if DEBUG
foreach (var bundle in BundleTable.Bundles)
{
bundle.Transforms.Clear();
}
#endif
сразу после
BundleConfig.RegisterBundles(...);
Ответ 6
вы можете отключить его из config:
<system.web>
<compilation debug="true" />
<!-- Lines removed for clarity. -->
</system.web>
http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification
Ответ 7
Я думаю, было бы правильно, если такая функция будет доступна "из коробки".
Я разместил отзыв на UserVoice.com: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle
Дайте ему свои "голоса".
Ответ 8
Вместо замены экземпляров JsMinify и CssMinify вместо этого можно использовать интерфейсы. Этот параметр недоступен в более ранних версиях, потому что второй параметр конструктора был типом, а не интерфейсом.
IBundleTransform jsTransform;
IBundleTransform cssTransform;
#if DEBUG
jsTransform = new NoTransform("text/javascript");
cssTransform = new NoTransform("text/css");
#else
jsTransform = new JsMinify();
cssTransform = new CssMinify();
#endif
Bundle jsBundle = new Bundle("~/JsB", jsTransform);
Bundle cssBundle = new Bundle("~/CssB", cssTransform);
Возможно, также стоит отметить, что для скриптов, которые поставляются с минитипированными и не уменьшенными версиями, например. jQuery, можно использовать вспомогательный метод для опционального выделения ".min" для сборки DEBUG для облегчения отладки:
private string Min(string scriptNameIncludingMin)
{
#if DEBUG
return scriptNameIncludingMin.Replace(".min", ""); // Remove .min from debug builds
#else
return scriptNameIncludingMin;
#endif
}
// ...
jsBundle.AddFile(Min("~/Scripts/jquery-1.7.2.min.js"));
Ответ 9
Попробуйте новое расширение для System.Web.Optimization - Bundle Transformer. В Bundle Transformer реализован ряд возможностей для упрощения отладки (см. documentation).
Ответ 10
Другая альтернатива (протестирована с v1.1.0.0 и MVC5):
public class BundleConfig
{
public static void Register()
{
ScriptBundle jsBundle = new ScriptBundle("~/Scripts/myscript.min.js");
jsBundle.Include("~/Scripts/myscript.js");
DisableInDebugMode(jsBundle);
BundleTable.Bundles.Add(jsBundle);
}
private static void DisableInDebugMode(ScriptBundle jsBundle)
{
#if DEBUG
// Don't minify in debug mode
jsBundle.Transforms.Clear();
#endif
}
}