从ASP.Net MVC应用程序中缩小HTML输出

这可能是以下问题的重复,但唯一的答案是死链接:
Minify ASP.NET应用程序的Html输出

使用ASP.Net时,对我来说比较烦人的一个方面是,Visual Studio将空格而不是制表符分隔为白色间距,从而增加了最终HTML的大小。 我原本以为只是改变Visual Studio设置来使用制表符,但是然后我的团队中的其他人仍然会最终叠加空格。

我的问题有两个方面:第一,如果使用空格或者制表符,每个项目的设置都有改变的方法(如果是这样的话,那么这个方法是否值得呢),第二,有没有办法在生成时简单地缩小所有的视图?

无论如何, 启用GZIP将比缩小您的HTML效果更多。

在运行时做小型化会损害你的服务器(假设你不使用caching)。 在部署过程中分享您的Asp.Net标记可能是一个好主意。 这样,您的代码库中仍然有一个非缩小版本的代码,在服务器上还有一个缩小版本。 考虑一下在所有的.aspx文件中调用HTML minifier的部署过程(例如, Dean Hume的这个工具看起来很有前途)。

我build议你尝试WebMarkupMin.Mvc 。 文档可以在http://webmarkupmin.codeplex.com/documentation中find

此链接工作(从您提供的相关链接)。 它有一个解决scheme,让你replaceWebRazorHostFactory一个最小化你的HTML。

要使其工作,您必须在您的Web.config文件中添加以下内容:

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

这部分通常放在Views\Web.config

Google Pagespeed会喜欢这个:

我苦苦挣扎了一段时间,而我发现的最好的方式是几件事的结合:

您可以在GitHub Gist上使用我的Helper类MinifyHtmlAttribute 。 它使用Zeta Producer Html Compressor来最小化HTML和System.Web.Optimization的捆绑,以最小化内联JavaScript和CSS(对于您的关键CSS 0.0)

Zeta生产者Html压缩机NuGet包裹

Google的HtmlCompressor库的.NET端口,用于缩小HTML源代码。

现在你可以压缩和缩小你的HTML与内联的CSS和JavaScript被缩小以及! 真棒! ;)

希望有人认为这有用。

这是一个古老的问题,但我会抛出我的解决scheme,以防其他人受益。

我有一个“缩小”filter使用大部分工作的正则expression式。 它在保留pretextarea标签中的空格时失败了。 前几天我碰到了一堵墙,因此我花了大约三天的时间阅读别人的尝试,并尝试了我的想法。 最后,我决定使用HtmlAgilityPackparsingHTML,并从那里删除空白节点。 因为pretextarea元素中的空白不被HAP认为是空白的,所以它对我有利,而且完全符合我的要求。 我在开始时遇到了麻烦,因为HTML是以块的forms发送的,但是我通过缓冲来解决它,直到它完成。 这是我的代码,以防其他人受益。

请注意,这个filter适用于我的应用程序(ASP.NET MVC 5)。 理想情况下,应该在发布期间进行缩小处理,以避免需要这样的filter。 最后,他的回答中的@naivists指出,GZIP压缩这个反应的效果比缩小更好,但是我略微不同意他的看法。 是的,它会的,但是缩小确实会减less对此的反应。 在使用CSS进行样式devise的时候,它真正的亮点在于,现在您不必担心空白的撞击和放置元素,而必须使用边距/填充/定位技巧来纠正它。

 [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); } }