代码之家  ›  专栏  ›  技术社区  ›  mynameiscoffey

缩小ASP.NET MVC应用程序的HTML输出

  •  36
  • mynameiscoffey  · 技术社区  · 15 年前

    这可能是以下问题的副本,但唯一的答案是一个死链接:
    Minify Html output of ASP.NET Application

    在使用ASP.NET时,我最讨厌的一个方面是Visual Studio为增加最终HTML大小的白色间距放置了空格而不是制表符。最初我只想简单地更改Visual Studio设置以使用制表符,但我的团队中的其他人最终还是会使用空格进行覆盖。

    我的问题有两个方面:第一,如果使用空格或制表符,每个项目设置上是否有一种方法可以更改(如果使用,是否值得更改);第二,是否有一种方法可以在生成时简单地缩小所有视图?

    5 回复  |  直到 8 年前
        1
  •  37
  •   Community CDub    8 年前

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

    在运行时进行缩小操作可能会损害服务器(假设不使用缓存)。在部署期间,最好将ASP.NET标记最小化。这样,代码存储库中仍然有一个非缩小版本的代码,服务器上还有一个缩小版本。设想一个部署过程,在这个过程中调用一个HTML小型化器(例如, this tool by Dean Hume 看起来很有前途)。 .aspx 文件夹。

        2
  •  10
  •   Andrey Taritsyn    11 年前
        3
  •  6
  •   lante    12 年前

    This link 工作(从您提供的相关链接)。它有一个解决方案可以让您替换 WebRazorHostFactory 缩小你的HTML。

    要使其工作,必须在 Web.config 文件:

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

    此部分通常放置在 Views\Web.config .

        4
  •  5
  •   Aldracor    9 年前

    google pagespeed会喜欢:

    我为此挣扎了一段时间,我发现最好的方法是结合一些事情:

    你可以使用我的助手类 MinifyHtmlAttribute on GitHub Gist . 它使用 Zeta Producer Html Compressor 最小化HTML和 System.Web.Optimization 的绑定,以最小化内联javascript和css(对于关键的css 0.0)

    Zeta Producer Html Compressor NuGet Package

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

    现在,您可以压缩和缩小您的HTML与内联的CSS和javascript也被缩小!!太棒了! ;)

    希望有人能发现这一点。

        5
  •  0
  •   Gup3rSuR4c    8 年前

    这是一个古老的问题,但我会考虑我的解决方案,以防它对其他人有利。

    我有一个“缩小”过滤器,它使用的正则表达式在很大程度上起作用。它在保留空白时失败了 pre textarea 标签。几天前我因为撞到了一堵墙,所以我花了大约三天的时间阅读别人的尝试,并尝试我的想法。最后,我决定使用htmlagilityPack解析HTML,并从中删除空白节点。因为空白在 之前 特克斯塔利亚 HAP并不认为元素是空白的,它对我有好处,并且完全按照我的意愿来做。一开始我确实遇到了麻烦,因为HTML是分块发送的,但是我通过缓冲它直到完成来解决这个问题。这是我的代码,以防它对其他人有益。

    请注意,此筛选器在我的应用程序(ASP.NET MVC 5)中对我有效。理想情况下,应该在发布期间进行缩小,以避免需要这样的过滤器。最后,@navists在他的回答中说,gzip压缩响应比缩小效果更好,但我有点不同意他。是的,它会的,但是缩小确实会稍微降低响应。它真正闪光的地方是当样式与CSS,因为现在你不必担心空格颠簸和错位的元素,并必须使用边缘/填充/定位技巧来纠正它。

    [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);
        }
    }
    
    推荐文章