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);
}
}
posible duplicado de [salida Minify HTML de ASP.NET Aplicación] (http://stackoverflow.com/questions/255008/minify-html-output-of-asp-net-application) – obayhan