Как отключить Javascript / минимизацию CSS в ASP.NET MVC 4 Beta - PullRequest
16 голосов
/ 21 февраля 2012

Я просто пробую ASP.NET MVC 4, но не могу понять, как отключить функцию минимизации Javascript / CSS.Особенно для среды разработки это очень поможет при отладке.Я полагаю, что это был бы переход в web.config, но поскольку ASP.NET MVC 4 все еще находится на стадии бета-тестирования, на самом деле информации там немного.Был бы признателен, если кто-то может помочь или указать на правильные сообщения в блоге и т. Д.

Ответы [ 10 ]

18 голосов
/ 17 марта 2012

В Global.asax.cs

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transform = new NoTransform();
        }
#endif
4 голосов
/ 23 февраля 2012

Вы можете зарегистрировать свои собственные пакеты в Global.asax и использовать класс NoTransform, если вы не хотите, чтобы содержимое было минимизировано.

Лично я не хочу, чтобы мой сценарий трансформировался вообще.Я просто создаю две директории скриптов.Один с версиями сценария отладки и один с первоначально загруженными уменьшенными версиями.

MVC 4 из коробки минификатор (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 голосов
/ 22 февраля 2012

Другим вариантом будет создание помощника HTML, который можно использовать для создания сценария и тегов ссылки.Вот что я реализовал для 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 голосов
/ 02 июля 2014

В более новых версиях ASP.NET MVC просто добавьте

#if DEBUG
            foreach (var bundle in BundleTable.Bundles)
            {
                bundle.Transforms.Clear();
            }
#endif

сразу после

BundleConfig.RegisterBundles(...);
3 голосов
/ 05 марта 2012

После звонка на 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();
            }
        }

Не очень красиво (изменяет состояние, установленное системой), но кода гораздо меньше, чем во всех других предложениях, все же позволяет использовать стандартное поведение комплектации и не требует никаких изменений в ваших представлениях.

2 голосов
/ 26 сентября 2012

Вы можете отключить его из конфигурации:

<system.web>
    <compilation debug="true" />
    <!-- Lines removed for clarity. -->
</system.web>

http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

1 голос
/ 19 апреля 2012

Вместо того, чтобы заменять экземпляры 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"));
1 голос
/ 21 марта 2012

Думаю, было бы правильно, если бы такая функция была доступна «из коробки».

Я оставил отзыв на UserVoice.com: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle

Отдай свои "голоса".

0 голосов
/ 19 декабря 2013

Другая альтернатива (протестировано с 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
    }
}
0 голосов
/ 26 марта 2012

Попробуйте новое расширение для System.Web.Optimization - Bundle Transformer . В Bundle Transformer реализован ряд возможностей по упрощению отладки (см. документация ).

...