19

Acabo de migrar un proyecto ASP.NET MVC 3 a MVC 4/.NET 4.0, e instalé el paquete NuGet Microsoft.AspNet.Web.Optimization para admitir la agrupación y la minificación de CSS y JavaScript. Tengo bastante bundling/minificación funcionando, el problema es que es siempre habilitado. Aunque la aplicación está en modo de depuración, como se configuró en Web.config, todas las inclusiones de JavaScript están minimizadas. Como se puede ver en el siguiente fragmento de XML, el modo de depuración está habilitada en Web.config:Aplicación ASP.NET MVC 4 con agrupación y minificación, ¿por qué está activada la minificación en el modo de depuración?

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

Un extracto de la configuración de mi paquete:

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 incluye son prestados en el HTML como por ejemplo:

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

¿Alguien tiene alguna pista de por qué la minificación se habilita en mi caso? No sé qué es lo que me falta aquí. Para solucionarlo, creé una aplicación de prueba ASP.NET MVC 4 de Internet y pude verificar que CSS/JavaScript hizo no obtener minimizado en modo de depuración para este proyecto.

EDIT:

En mi archivo _Layout.cshtml me hacen los estilos/scripts como este:

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

, gracias a Hao, me doy cuenta de que he olvidado como prefijo para los nombres de lotes con "~ /".

+0

Esta pregunta puede ser útil. [Cómo deshabilitar la minificación de Javascript/CSS en 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 Las respuestas a esa pregunta parecen ser para la minificación incondicionalmente incapacitante? Solo quiero que la minificación condicional estándar funcione. – aknuds1

Respuesta

17

La bandera roja es con las etiquetas de enlace/script prestados en el código HTML:

Estos deben contener un código hash versión si está utilizando secuencias de comandos/Style.Render, es decir

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

Para obtener el comportamiento de depuración/liberación que las plantillas de MVC4 están utilizando, debe usar los métodos Script/Style.Render también. Al llamar a estos métodos, se debe pasar de haces de caminos virtuales, en su ejemplo:

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

En el modo de depuración, no debe someterse a las etiquetas de enlace/script que señalan en el paquete (que siempre será minified/incluido). En su lugar, debería obtener etiquetas de script/enlace a los recursos individuales en modo de depuración.

+1

Gracias por eso. Pero, ¿no debería @ Scripts.Render (...) lanzar una excepción si no se le da una ruta virtual? ¿Cuándo le gustaría escribir @ Scripts.Render ("/ bundles/jquery"), es decir, sin el "~"? –

+0

No se limita a las URL del paquete, sino que también mostrarán las etiquetas de script/enlace en URL arbitrarias (tanto relativas como absolutas). La idea a más largo plazo era que estos ayudantes gestionaran la gestión de activos en general en lugar de simplemente ser ayudantes específicos del paquete. –

+1

Bien, gracias por aclarar. Pero hoy perdimos medio día porque alguien se olvidó de poner el "~". –

2

Acabo de pasar esto en un nuevo proyecto ASP.NET MVC. Tenía el <compilation debug="true" targetFramework="4.5.1" /> establecido en verdadero en web.config y todavía obtenía resultados minificados.

La solución

BundleConfig.cs (en App_Start) tiene una línea en la parte inferior BundleTable.EnableOptimizations = true; que fue anulando mi configuración de web.config ....

quitar la línea y/o configurarlo a falso y obtuve mis scripts como sin unificar/desagregados según lo deseado en el entorno de depuración.

Recomiendo eliminar la línea ya que esto anulará web.config. Establecer esto en web.config tiene la ventaja de usar las transformaciones web.config para que pueda crear configuraciones diferentes para implementar en diferentes entornos.

Para obtener más información sobre este http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification ver y leer la sección de control Agrupación y Minificación (a mitad de camino por el artículo).

+1

Este fue el problema para Me parece que la plantilla predeterminada para BundleConfig.cs ha cambiado en algún lugar a lo largo del tiempo. Estoy seguro de que nunca solía estar allí – ScottG

Cuestiones relacionadas