2012-03-11 15 views
14

Comencé a utilizar la agrupación y la minificación incluidas con MVC4 Beta. Tengo algunos problemas con esto:MVC4 Beta Minificación y agrupamiento: ordenación de archivos y depuración en el navegador

Por un lado, si utilizo el paquete clásico <script src="Folder/js" type="text/javascript"/>, parece que tengo que cambiar el nombre de mis archivos para asegurarme de que están empaquetados en el orden correcto.

  • Digamos que tengo tres archivos javascript: "ants.js", "", "bugs.js insects.js"
  • ants.js depende de bugs.js
  • bugs.js depende insects.js
  • La agrupación por defecto parece agruparlos en orden alfabético.
  • Para que se agrupen correctamente, tengo que cambiarles el nombre a: "0.insects.js", "1.bugs.js", "2.ants.js"
  • Eso es realmente hackish y tiene que ser una manera más limpia.

El siguiente problema que tengo es la depuración. Me gusta pasar por el javascript en mis navegadores de prueba, ¿hay alguna forma de desactivar solo la minificación en el modo DEBUG?

EDITAR: Para ser claros, sé que puedo crear paquetes y registrarlos desde C#, parece realmente feo tener que hacerlo de esa manera.

+0

pregunta relacionada - http://stackoverflow.com/questions/9373071/how-to-disable-javascript-css-minification-in-asp-net-mvc-4 – resnyanskiy

Respuesta

11

Para obtener temporalmente el uso de salida no miniaturizada este

public class NonMinifyingJavascript : IBundleTransform 
{ 
    public void Process(BundleContext context, BundleResponse bundle) 
    { 
     if(bundle == null) 
     { 
      throw new ArgumentNullException("bundle"); 
     } 

     context.HttpContext.Response.Cache.SetLastModifiedFromFileDependencies(); 

     foreach(FileInfo file in bundle.Files) 
     { 
      HttpContext.Current.Response.AddFileDependency(file.FullName); 
     } 

     bundle.ContentType = "text/javascript"; 
     //base.Process(context, bundle); 
    } 
} 

si querías basado totalmente en un entorno de configuración, imagino que podría crear una IBundle transformar que los delegados a éste o JsMinify dependiendo de su configuración establecer

con el fin de controlar el orden de los archivos JavaScript que necesita para utilizar el BundleFileSetOrdering

var javascriptBundle = new Bundle("~/site/js", new NonMinifyingJavascript()); 

     //controls ordering for javascript files, otherwise they are processed in order of AddFile calls 
     var bootstrapOrdering = new BundleFileSetOrdering("bootstrap"); 
     //The popover plugin requires the tooltip plugin 
     bootstrapOrdering.Files.Add("bootstrap-tooltip.js"); 
     bootstrapOrdering.Files.Add("bootstrap-popover.js"); 
     BundleTable.Bundles.FileSetOrderList.Add(bootstrapOrdering); 
     javascriptBundle.AddDirectory("~/Scripts", "bootstrap-*.js"); 
+0

Esto hace exactamente lo que necesito hacer, que es una mierda que no se puede hacer un poco más abierto con menú, pero Tomaré lo que pueda conseguir. –

1

Me encontré con este mismo problema ayer y no pude encontrar una buena solución con el nuevo espacio de nombres System.Web.Optimization. Hubo algunos enlaces rotos de MSDN, por lo que el hecho de que todo esté en beta significa que puede cambiar, pero estoy divagando ...

Siempre puede cargar los scripts de forma diferente durante el desarrollo que en la producción. Fácil de hacer con un AppSetting:

@if (System.Configuration. 
    ConfigurationManager.AppSettings["BundleResources"] != null) 
{ 
    @* load the css & js using bundles *@ 
} 
else 
{ 
    @* load the css & js files individually*@ 
} 

A continuación, puede activar/desactivar la materia optimización comentando un appSetting en web.config:

<appSettings> 
    ... 
    <!--<add key="BundleResources" value="uhuh" />--> 
    ... 
</appSettings> 
+0

Yeesh, eso es subóptima. Parece que acaban de hacer la funcionalidad y aún no han tenido que usarla. No me puedo imaginar que siga así por mucho tiempo. –

+0

incidentemente, estaba haciendo algo similar a esto con las directivas del compilador como '@ {#if DEBUG}' simplemente parecía feo. –

+0

jajaja, sí, ya he visto algunos lugares donde han cambiado la API (nueva JsMinify() en lugar de typeof (JsMinify)). No me puedo imaginar que seguirá así por mucho tiempo. Si la agrupación/minificación es importante, es posible que también desee consultar RequestReduce como anunció Matt. – danludwig

2

también podrían echar un vistazo a RequestReduce. Agrupa sus scripts y CSS sin ningún tipo de codificación o configuración al observar cómo están distribuidos en su página y agrupando de acuerdo con eso. También le permite turn off bundling and minification a través de web.config o para solicitudes individuales a través de un paramétrico de querystring: RRFilter=disabled.

+1

Eso es realmente interesante, y puedo terminar usando algo así. Una parte de mí realmente quiere seguir con lo que está empaquetado con MVC 4, sin embargo. –

+1

Si le sirve de consuelo, esto es lo que se usa en muchas de las propiedades de MSDN/Technet, incluidos MSDN Blogs para agrupar/minificar. –

+0

Jaja .. Me alegro de que hayas entendido que necesito consolar ... porque lo hice. Estoy algo decepcionado con esta nueva funcionalidad de wiz-bang. –

7

utilizo el MVC NoTransform predeterminado en lugar del NonMinifyingJavascript propuesto por chrisortman. Hasta donde yo sé, hace lo mismo. Pero aún no es óptimo. Idealmente, quiero una etiqueta de script para cada archivo de script idividual cuando quiero depurar. Esto hace que la depuración sea mucho más fácil con VS11, que me gusta usar (un depurador para poder depurar js y C# en una sesión de depuración). así que creé este pequeño ayudante:

@helper RenderScriptTags(string virtualPath) 
{ 
    if (Minify /* some appsetting */) 
    { 
     <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(virtualPath)"></script> 
    } 
    else 
    { 
     foreach (var file in System.Web.Optimization.BundleResolver.Current.GetBundleContents(virtualPath)) 
     { 
      <script src="@Url.Content(file)"></script> 
     } 
    } 
} 

@RenderScriptTags("~/libraries") 

tengo una sola aplicación página, así que tengo esto en mi archivo principal cshtml, pero puede ser fácilmente generalizado moviendo esto a un método de extensión HtmlHelper. ¡Funciona bien!

Este código también tiene en cuenta la BundleFileSetOrdering Si ha establecido una!

+0

¡¡¡Bonito !!! :) ¡muy útil! – MojoDK

Cuestiones relacionadas