2012-02-21 16 views
16

Sto solo provando ASP.NET MVC 4 ma non riesco a capire come disabilitare la funzione di minimizzazione Javascript/CSS. Soprattutto per l'ambiente di sviluppo questo sarà di grande aiuto per il debug. Immagino che sarebbe un interruttore in web.config ma dal momento che ASP.NET MVC 4 è ancora in fase beta al momento non ci sono molte informazioni là fuori. Apprezzeremmo se qualcuno potesse aiutare o indicare i post del blog giusti ecc.Come disabilitare la minificazione Javascript/CSS in ASP.NET MVC 4 Beta

+5

Solo io, o è ridicolo che questa non è un'impostazione di configurazione? – Jordan

+10

@Jeff: Ruby on Rails ha i propri limiti, così come ogni piattaforma. –

risposta

18

In Global.asax.cs

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

Questo è ora cambiato nella versione più recente, vedere questa risposta per i dettagli: http://stackoverflow.com/a/11270224 – Michael

+0

@ Michael: Sì, ma la risposta è corretta * per beta * come l'OP richiesto :-) I ho ancora un sito Web MVC 4 beta che deve ancora essere aggiornato e felice di aver trovato questa risposta :-) –

4

Un'altra opzione sarebbe quella di creare un helper HTML che potreste usare per creare lo script e i tag di collegamento. Ecco quello che ho implementato per il Javascript, che può anche essere fatto per il 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 quello che dovete fare è chiamare a vostro parere:

<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 sarà renderizza gli script come riferimenti separati o usa la nuova funzione di raggruppamento/minificazione a seconda di quale sia l'impostazione di debug nel tuo web.config. Ho usato parte del codice da http://codecutout.com/resource-minify-bundling come riferimento quando creavo il mio helper se volevi vedere altri esempi. Il loro aiutante è scritto un po 'meglio, lanciando eccezioni quando vengono forniti argomenti non validi, ecc ... Non sono ancora riuscito a pulire il mio.

4

È possibile registrare i propri bundle nello Global.asax e utilizzare la classe NoTransform se non si desidera che il contenuto venga ridotto.

Personalmente non voglio che il mio copione si trasformi del tutto. Creo solo due directory di script. Uno con le versioni degli script di debug e uno con le versioni minified originariamente scaricate.

Il minificatore di MVC 4 out of the box (JsMinify) interrompe jQuery 1.7.1 per Opera, quindi non voglio utilizzarlo. Ho appena messo le seguenti righe nel mio Global.asax: Application_Start() metodo:

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

Con questo in luogo posso semplicemente aggiungere uno di due linee 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> 

Naturalmente potremmo diventare un po 'più eccentrici con questo al suo posto. Potremmo generare un solo bundle e, in base al tipo di costruzione, selezionare quali file includere.

3

Dopo la chiamata a EnableDefaultBundles() in Global.asax, si può fare questo ...

 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 abbastanza (modificando lo stato impostato dal sistema), ma è molto meno codice rispetto a tutti gli altri suggerimenti , consente comunque di utilizzare il comportamento di raggruppamento standard e non comporta alcuna modifica delle visualizzazioni.

0

Provare una nuova estensione per System.Web.Optimization - Bundle Transformer. In Bundle Transformer sono state implementate numerose opportunità per semplificare il debug (vedere documentation).

1

Invece di sostituire le istanze di JsMinify e CssMinify, è possibile utilizzare le interfacce. Questa opzione non era disponibile nelle versioni precedenti poiché il secondo parametro costruttore era un tipo anziché 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 anche la pena notare, per gli script che vengono spediti con le versioni minified e non minified esempio jQuery, si può utilizzare un metodo di supporto facoltativamente strip il ".min" per DEBUG per facilitare il debugging:

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")); 
+0

Questo ferma la concatenazione di js e il minifying? È anche fastidioso eseguire il debug di un singolo file js gigante. – Alex

0

Un'altra alternativa (testato 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 
    } 
} 
3

sulle 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(...); 
Problemi correlati