19

Ho appena migrato un progetto ASP.NET MVC 3 in MVC 4/.NET 4.0 e installato il pacchetto NuGet Microsoft.AspNet.Web.Optimization per supportare il raggruppamento e la minimizzazione di CSS e JavaScript. Ho praticamente lavorato in bundle/minification, il problema è che è sempre abilitato. Anche se l'app è in modalità di debug, come configurato in Web.config, tutti i JavaScript inclusi sono miniati. Come si può vedere dal frammento di XML di seguito, la modalità di debug è abilitata in web.config:Applicazione ASP.NET MVC 4 con bundling e minification, perché la minificazione è abilitata in modalità di debug?

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
    ... 
    </compilation> 
    ... 
</system.web> 

Un estratto della mia configurazione bundle:

public class BundleConfig 
{ 
    public static void RegisterBundles(BundleCollection bundles) 
    { 
     ... 

     bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
        "~/Scripts/jquery-1.*", 
        "~/Scripts/jquery.form.js", 
        "~/Scripts/jquery.format.js")); 

     bundles.Add(new StyleBundle("~/Content/css").Include(
      "~/Content/Site.css")); 

     ... 
    } 
} 

CSS/JavaScript include sono resi in HTML come ad esempio:

<link href="/content/css" rel="stylesheet" type="text/css"> 
<script src="/bundles/jquery" type="text/javascript"></script> 

Qualcuno ha qualche idea sul motivo per cui la minificazione viene abilitata nel mio caso? Sono in perdita per ciò che mi manca qui. Per risolvere il problema ho creato un'applicazione Internet ASP.NET MVC 4 di prova e ho potuto verificare che CSS/JavaScript non ha non in modalità debug per questo progetto.

EDIT:

Nel mio file _Layout.cshtml rendo gli stili/script come questo:

@Styles.Render("content/css") 
@Scripts.Render("bundles/jquery") 

Grazie a Hao, mi rendo conto che ho dimenticato di precedere i nomi del bundle con "~ /".

+0

Questa domanda può essere utile. [Come disabilitare la minzione Javascript/CSS in ASP.NET MVC 4] (http://stackoverflow.com/questions/9373071/how-to-disable-javascript-css-minification-in-asp-net-mvc-4? rq = 1) – jrummell

+0

@jrummell Le risposte a questa domanda sembrano essere la disattivazione incondizionata della minificazione? Voglio solo che la minificazione condizionale standard funzioni. – aknuds1

risposta

17

La bandiera rossa è con i tag di collegamento/script resi nel codice HTML:

Questi dovrebbe contenere un codice hash versione se si utilizza Script/Style.Render, cioè

< script src="/bundles/jquery?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"/> 

Per ottenere il comportamento di debug/release utilizzato dai modelli MVC4, è necessario utilizzare anche i metodi Script/Style.Render. Quando si chiamano questi metodi, è necessario passare percorsi fascio virtuali, nel tuo esempio:

@Styles.Render("~/content/css") 
@Scripts.Render("~/bundles/jquery") 

In modalità di debug, non si dovrebbe ottenere i tag link/di script che punta a un fascio (che sarà sempre ridotte di/in bundle). Invece dovresti ottenere tag script/link sulle singole risorse in modalità debug.

+1

Grazie per quello. Ma non dovrebbe @ Scripts.Render (...) lanciare un'eccezione se non viene fornito un percorso virtuale? Quando vorresti scrivere @ Scripts.Render ("/ bundles/jquery") senza il "~"? –

+0

Non si limita agli URL di bundle, ma renderanno i tag script/link a URL arbitrari (sia relativi che assoluti). L'idea più a lungo termine era che questi aiutanti gestissero la gestione delle risorse in generale, piuttosto che limitarsi a fornire aiuti specifici. –

+1

Ok, grazie per aver chiarito. Ma oggi abbiamo sprecato mezza giornata perché qualcuno si era dimenticato di inserire "~". –

2

Ho appena avuto questo risultato su un nuovissimo progetto ASP.NET MVC. Ho avuto il <compilation debug="true" targetFramework="4.5.1" /> impostato su true in web.config e stava ancora ottenendo l'output minified.

La correzione

BundleConfig.cs (in App_Start) ha una linea in fondo BundleTable.EnableOptimizations = true; che è stato il mio override impostazione web.config ....

rimuovere la riga e/o impostarlo a false e ho ottenuto i miei script come non terminati/disaggregati come desiderato in ambiente di debug.

Mi raccomando di rimuovere la linea poiché questo sovrascriverà web.config. L'impostazione di questo in web.config ha il vantaggio di utilizzare le trasformazioni di web.config in modo da poter creare impostazioni diverse per la distribuzione in ambienti diversi.

Per ulteriori informazioni su questo, vedere http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification e leggere la sezione Controllo e riduzione (circa a metà dell'articolo).

+1

Questo era il problema per mi sembra che il modello predefinito per BundleConfig.cs sia cambiato da qualche parte nel tempo. Sono sicuro che non è mai stato lì dentro – ScottG