Domanda

Sto solo provando ASP.NET MVC 4 ma non riesco a capire come disabilitare la funzione di minificazione Javascript / CSS.Soprattutto per l'ambiente di sviluppo questo aiuterà molto nel debugging.Immagino che sarebbe un passaggio in web.config ma poiché ASP.NET MVC 4 è ancora in fase beta al momento, non ci sono davvero molte informazioni là fuori.Apprezzerei se qualcuno potesse aiutare o indicare i post del blog giusti, ecc.

È stato utile?

Soluzione

In Global.asax.cs

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transform = new NoTransform();
        }
#endif

Altri suggerimenti

Un'altra opzione sarebbe creare un Helper HTML da utilizzare per creare lo script e i tag di collegamento.Ecco cosa ho implementato per Javascript, che può essere fatto anche per 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());
        }
    }

Ora tutto ciò che devi fare è chiamarlo nella tua vista:

<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>

E renderà gli script come riferimenti separati o utilizzerà la nuova funzione di raggruppamento / minimizzazione a seconda di quale sia l'impostazione di debug nel tuo web.config.Ho utilizzato parte del codice da http://codecutout.com/resource-minify-bundling comeun riferimento quando creo il mio aiuto se vuoi vedere altri esempi.Il loro aiuto è scritto un po 'meglio, genera eccezioni quando vengono forniti argomenti non validi, ecc ... Non sono ancora riuscito a ripulire il mio.

Puoi registrare i tuoi bundle nel Global.asax e usare la classe NoTransform se non vuoi che il contenuto venga minimizzato.

Personalmente non voglio affatto che il mio script venga trasformato.Creo solo due directory di script.Uno con le versioni dello script di debug e uno con le versioni minificate originariamente scaricate.

Il minificatore MVC 4 out of the box (JsMinify) rompe jQuery 1.7.1 per Opera, quindi non voglio usarlo.Ho appena inserito le seguenti righe nel mio metodo 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);

Detto questo, posso semplicemente aggiungere una delle due righe nel mio _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>

Ovviamente potremmo diventare un po 'più funky con questo in atto.Potremmo generare un solo bundle e, a seconda del tipo creato, selezionare i file da includere.

Dopo la chiamata a EnableDefaultBundles() in Global.asax, puoi farlo ...

        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();
            }
        }

Non carino (modifica dello stato impostato dal sistema), ma è molto meno codice di tutti gli altri suggerimenti, ti consente comunque di utilizzare il comportamento di raggruppamento standard e non comporta modifiche alle tue visualizzazioni.

Nelle versioni più recenti di ASP.NET MVC è sufficiente aggiungere

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

subito dopo

BundleConfig.RegisterBundles(...);

puoi disattivarlo da config:

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

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

Penso che sarebbe giusto se tale funzionalità fosse disponibile "out of the box".

Ho pubblicato un feedback su UserVoice.com: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle

Dagli le tue "voci".

Invece di sostituire le istanze di JsMinify e CssMinify, si possono invece utilizzare le interfacce. Questa opzione non era disponibile nelle versioni precedenti perché il secondo parametro del costruttore era un tipo piuttosto che un'interfaccia.

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);

Forse vale anche la pena notare, per gli script forniti con versioni minimizzate e non minimizzate, ad es.jQuery, è possibile utilizzare un metodo di supporto per rimuovere facoltativamente il ".min" per le build DEBUG per facilitare il 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"));

Prova una nuova estensione per System.Web.Optimization - Bundle Transformer .In Bundle Transformer ha implementato una serie di opportunità per semplificare il debug (vedere la documentazione ).

Un'altra alternativa (testata con v1.1.0.0 e 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
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top