minification - Minificar el resultado HTML de una aplicación ASP.Net MVC
c# mvc bundle (5)
Esta es una vieja pregunta, pero lanzaré mi solución en caso de que beneficie a alguien más.
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 pre
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
elementos pre
y textarea
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);
}
}
Es probable que sea un duplicado de la pregunta siguiente, pero la única respuesta es un vínculo inactivo:
Minificar la salida HTML de la aplicación ASP.NET
Cuando trabajo 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 el espaciado blanco, lo 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 cada proyecto si se usan espacios o pestañas (y si vale la pena si es así) y, en segundo lugar, ¿hay alguna manera de simplificar todas las vistas cuando se generan? ?
Te recomiendo que pruebes WebMarkupMin.Mvc . La documentación está disponible en - http://webmarkupmin.codeplex.com/documentation
Permitir GZIP tendrá mucho más efecto que minificar tu HTML, de todos modos.
Hacer minificación en tiempo de ejecución podría dañar tus servidores (suponiendo que no uses 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 de HTML (por ejemplo, esta herramienta de Dean Hume parece prometedora) en todos los archivos .aspx
.
Este enlace funciona (desde el enlace relacionado que proporcione). Tiene una solución que le permite reemplazar WebRazorHostFactory
por uno que minimiza su HTML.
Para que funcione, debe agregar lo siguiente en su archivo Web.config
:
<system.web.webPages.razor>
<host factoryType="Omari.Web.Mvc.WhiteSpaceCleaningMvcWebRazorHostFactory, WhiteSpaceCleanerForWebFormsAndMVC3" />
</system.web.webPages.razor>
Esta sección generalmente se ubica en Views/Web.config
.
A Google Pagespeed le encantará esto:
Luché por un tiempo con esto y la mejor manera que encontré fue una combinación de algunas cosas:
Puedes usar mi clase de MinifyHtmlAttribute
en GitHub Gist . Utiliza el Zeta Producer Html Compressor para minimizar el HTML y con System.Web.Optimization
''s Bundling, para minimizar JavaScript y CSS en línea (para su css crítico 0.0)
Paquete Zeta Producer Html Compressor NuGet
Un puerto .NET de la biblioteca HtmlCompressor de Google para minificar el código fuente HTML.
¡Ahora puedes comprimir y minificar tu html con css en línea y javascript también siendo minimizado! ¡Increíble! ;)
Espero que alguien encuentre esto útil.