2010-01-20 9 views
36

Esto es probablemente un duplicado de la pregunta a continuación, pero la única respuesta es un vínculo roto:
Minify Html output of ASP.NET Applicationsalida Minify HTML desde una aplicación ASP.Net MVC

Cuando se trabaja con ASP.Net uno de los aspectos más molestos para mí es el hecho de que Visual Studio pone espacios en lugar de pestañas para espacios en blanco que aumenta el tamaño del HTML final. Originalmente pensé en simplemente cambiar la configuración de Visual Studio para usar pestañas en su lugar, pero otros en mi equipo terminarían superponiendo espacios de todos modos.

Mi pregunta es doble: primero hay una manera de cambiar la configuración de un proyecto si se usan espacios o pestañas (y vale la pena si es así) y segundo, ¿hay alguna manera de simplificar simplemente todos las vistas cuando se generan?

+0

posible duplicado de [salida Minify HTML de ASP.NET Aplicación] (http://stackoverflow.com/questions/255008/minify-html-output-of-asp-net-application) – obayhan

Respuesta

37

Enabling GZIP tendrá mucho más efecto que minificar su HTML, de todos modos.

Hacer la minificación en tiempo de ejecución podría dañar sus servidores (suponiendo que no utilice el almacenamiento en caché). Puede ser una buena idea minar su marcado Asp.Net durante la implementación. De esta forma, todavía tiene una versión de código no minificado en su repositorio de código y una versión minimizada en el servidor. Piense en un proceso de implementación en el que invoque un minificador HTML (por ejemplo, this tool by Dean Hume parece prometedor) en todos los archivos .aspx.

+1

1. Deberías estar comprimiendo tu salida en la transferencia de todos modos, y cuando lo estés, una pestaña y algunos espacios tomarán efectivamente el mismo ancho de banda. – bobince

+0

¿Dónde irían los dos filtros dentro de la jerarquía de carpetas MVC? –

+23

-1 porque esta no es la respuesta a la pregunta. –

6

This link funciona (del enlace relacionado que proporcione). Tiene una solución que le permite reemplazar el WebRazorHostFactory por uno que minimiza su HTML.

Para que funcione, hay que añadir lo siguiente en su archivo Web.config:

<system.web.webPages.razor> 
    <host factoryType="Omari.Web.Mvc.WhiteSpaceCleaningMvcWebRazorHostFactory, WhiteSpaceCleanerForWebFormsAndMVC3" /> 
</system.web.webPages.razor> 

En esta sección se coloca generalmente en Views\Web.config.

+3

? No funciona con MVC4. Consulte https://github.com/Chebur9tina/HtmlOptimizerMvc4 si necesita soporte MVC4 – Cheburek

10

Te recomiendo que pruebes WebMarkupMin.Mvc. La documentación está disponible en - http://webmarkupmin.codeplex.com/documentation

+0

¡He utilizado su paquete y funcionó de maravilla! Pero solo en el servidor IIS, no en la máquina local. – rkawano

+1

@rkawano, puede: 1. Instalar el paquete [WebMarkupMin.Core] (http://www.nuget.org/packages/WebMarkupMin.Core/) y usar WebMarkupMin como una biblioteca en sus aplicaciones .NET (use 'HtmlMinifier',' XhtmlMinifier' y 'XmlMinifier' classes directamente). 2. Instale [Web Essentials 2013] (https://visualstudiogallery.msdn.microsoft.com/56633663-6799-41d7-9df7-0f2a504ca361) y use el comando de menú contextual 'Web Essentials'>' Minify HTML file (s)) 'para la minificación de archivos HTML. La versión de línea de comandos de WebMarkupMin aún no existe. –

+0

Con disableMinificationInDebugMode = "false" estableciéndolo minified en Local IIS también! Muchas gracias! – rkawano

5

Google Pagespeed amará esto:

Luché por un tiempo con esto y la mejor manera que encontré fue una combinación de un par de cosas:

Puede usa mi Helper Class MinifyHtmlAttribute on GitHubGist. Utiliza el Zeta Producer Html Compressor para minimizar el HTML y con System.Web.Optimization 's Agrupación, para minimizar línea Javascript y CSS (para su css crítica 0,0)

Zeta Producer Html Compressor NuGet Package

Un .NET puerto de biblioteca HtmlCompressor de Google para minify HTML fuente código.

¡Ahora puede comprimir y minificar su html con css en línea y javascript también siendo minimizado! ¡Increíble!;)

Espero que alguien encuentre esto útil.

0

Esta es una vieja pregunta, pero lanzaré mi solución en caso de que beneficie a otra persona.

Tenía un filtro de "minificación" usando expresiones regulares que funcionaban en su mayor parte. Falló a la hora de persistir en el espacio en blanco en las etiquetas pre y textarea. Terminé golpeando una pared hace unos días por eso, así que pasé unos tres días leyendo lo que otros probaron y probando mis ideas. Al final me decidí a analizar el HTML usando HtmlAgilityPack y eliminar los nodos de espacio en blanco de allí. Debido a que el espacio en blanco en pre y textarea elementos no fue considerado espacio en blanco por HAP funcionó a mi favor e hizo exactamente lo que yo quería. Tuve problemas al principio porque el HTML se enviaba en fragmentos, pero lo resolví guardándolo hasta que se completó. Aquí está mi código en caso de que sea beneficioso para otra persona.

Tenga en cuenta que este filtro funciona para mí en mi aplicación (ASP.NET MVC 5). Idealmente, la minificación debe hacerse durante la publicación para evitar la necesidad de filtros como este. Por último, @naivists en su respuesta afirma que GZIP comprimiendo la respuesta tendrá un mejor efecto que la minificación, pero estoy un poco en desacuerdo con él. Sí, lo hará, pero la minificación reduce la respuesta muy ligeramente además de eso. Donde realmente brilla es cuando se diseña con CSS porque ahora no tiene que preocuparse por los espacios en blanco de los elementos en blanco y mal colocado y tener que usar el margen/relleno/engaño de posicionamiento para corregirlo.

[AttributeUsage(AttributeTargets.Class, Inherited = false)] 
internal sealed class MinifyHtmlAttribute : 
    ActionFilterAttribute { 
    public override void OnActionExecuted(
     ActionExecutedContext filterContext) { 
     if (filterContext == null 
      || filterContext.IsChildAction) { 
      return; 
     } 

     filterContext.HttpContext.Response.Filter = new MinifyHtmlStream(filterContext.HttpContext); 
    } 
} 

internal sealed class MinifyHtmlStream : 
    MemoryStream { 
    private readonly MemoryStream BufferStream; 
    private readonly HttpContextBase Context; 
    private readonly Stream FilterStream; 

    public MinifyHtmlStream(
     HttpContextBase httpContextBase) { 
     BufferStream = new MemoryStream(); 
     Context = httpContextBase; 
     FilterStream = httpContextBase.Response.Filter; 
    } 

    public override void Flush() { 
     BufferStream.Seek(0, SeekOrigin.Begin); 

     if (Context.Response.ContentType != "text/html") { 
      BufferStream.CopyTo(FilterStream); 

      return; 
     } 

     var document = new HtmlDocument(); 

     document.Load(BufferStream); 

     var spans = document.DocumentNode.Descendants().Where(
      d => 
       d.NodeType == HtmlNodeType.Element 
       && d.Name == "span").SelectMany(
      d => d.ChildNodes.Where(
       cn => cn.NodeType == HtmlNodeType.Text)).ToList(); 

     // Some spans have content that needs to be trimmed. 
     foreach (var span in spans) { 
      span.InnerHtml = span.InnerHtml.Trim(); 
     } 

     var nodes = document.DocumentNode.Descendants().Where(
      d => 
       (d.NodeType == HtmlNodeType.Text 
       && d.InnerText.Trim().Length == 0) 
       || (d.NodeType == HtmlNodeType.Comment 
       && d.InnerText.Trim() != "<!DOCTYPE html>")).Select(
      d => d).ToList(); 

     foreach (var node in nodes) { 
      node.Remove(); 
     } 

     document.Save(FilterStream); 
    } 

    public override void Write(
     byte[] buffer, 
     int offset, 
     int count) { 
     BufferStream.Write(buffer, offset, count); 
    } 
} 
Cuestiones relacionadas