【问题标题】:Minify HTML output from an ASP.Net MVC Application缩小 ASP.Net MVC 应用程序的 HTML 输出
【发布时间】:2011-01-07 10:50:24
【问题描述】:

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

在使用 ASP.Net 时,对我来说更烦人的方面之一是 Visual Studio 将空格而不是制表符用于空白,这会增加最终 HTML 的大小。我最初只是想简单地将 Visual Studio 设置更改为使用选项卡,但我团队中的其他人最终仍然会被空格覆盖。

我的问题有两个方面:首先,如果使用空格或制表符,是否有办法在每个项目设置上进行更改(如果这样,是否值得);其次,有没有办法简单地缩小所有视图何时生成?

【问题讨论】:

标签: asp.net asp.net-mvc minify asp.net-mvc-views


【解决方案1】:

无论如何,Enabling GZIP 比缩小 HTML 的效果要好得多。

在运行时进行缩小可能会损害您的服务器(假设您不使用缓存)。在部署期间缩小 Asp.Net 标记可能是个好主意。这样,您的代码存储库中仍然有一个非缩小版本的代码,并且在服务器上还有一个缩小版本。考虑一个部署过程,您在所有 .aspx 文件上调用 HTML 压缩器(例如,this tool by Dean Hume 看起来很有希望)。

【讨论】:

  • +1。无论如何,您应该在传输时压缩您的输出,然后当您是一个制表符和几个空格时,将有效地占用相同的带宽。
  • 这两个过滤器在 MVC 文件夹层次结构中的位置?
  • @ErçinDedeoğlu,是的,在撰写本文时,StackOverflow 提供解决方法提示很常见。目前,每个人都希望得到所有问题的准确答案,但我应该到处删除答案吗?
  • 即使我启用了 GZIP,google PageSpeed Insights 也会告诉我缩小 HTML,这样我可以减少 13%。我想两个都穿。
  • @qub1n 我做了同样的 GZIP,即使在谷歌 PageSpeed Insights 告诉我缩小 HTML 之后,我可以减少 18%。如何缩小 HTML?
【解决方案2】:

This link 有效(来自您提供的相关链接)。它有一个解决方案,可让您将WebRazorHostFactory 替换为缩小 HTML 的解决方案。

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

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

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

【讨论】:

【解决方案3】:

【讨论】:

  • 我用过你的包,效果很好!但只在 IIS 服务器上,不在本地机器上。
  • @rkawano,您可以: 1. 安装WebMarkupMin.Core 包并在您的.NET 应用程序中使用WebMarkupMin 作为库(直接使用HtmlMinifierXhtmlMinifierXmlMinifier 类) . 2. 安装Web Essentials 2013 并使用上下文菜单命令Web Essentials > Minify HTML file(s) 来缩小HTML 文件。 WebMarkupMin 的命令行版本尚不存在。
  • 使用 disableMinificationInDebugMode="false" 设置它也在本地 IIS 上缩小!非常感谢!
  • 我如何让它在我的本地机器上使用这个:github.com/Taritsyn/WebMarkupMin/wiki/…
  • @nmit026,将 Web 应用程序切换到发布模式 - github.com/Taritsyn/WebMarkupMin/wiki/…
【解决方案4】:

Google Pagespeed 会喜欢这个:

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

你可以使用我的助手类MinifyHtmlAttribute on GitHubGist。它使用Zeta Producer Html Compressor 来最小化 HTML,并使用System.Web.Optimization 的捆绑来最小化内联 javascript 和 CSS(对于您的关键 css 0.0)

Zeta Producer Html Compressor NuGet Package

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

现在您可以使用内联 css 和 javascript 来压缩和缩小您的 html!太棒了! ;)

希望有人觉得这很有用。

【讨论】:

    【解决方案5】:

    这是一个老问题,但我会提出我的解决方案,以防其他人受益。

    我有一个使用正则表达式的“缩小”过滤器,大部分情况下都有效。在 pretextarea 标签中保留空白时失败了。几天前我最终因为它碰壁了,所以我花了大约三天时间阅读其他人的尝试并尝试我的想法。最后,我决定使用 HtmlAgilityPack 解析 HTML 并从那里删除空白节点。因为 pretextarea 元素中的空白不被 HAP 视为空白,所以它对我有利,并且完全符合我的要求。一开始我确实遇到了麻烦,因为 HTML 是分块发送的,但我通过缓冲它直到它完成来解决它。这是我的代码,以防对其他人有益。

    请注意,此过滤器适用于我的应用程序 (ASP.NET MVC 5)。理想情况下,应该在发布期间进行缩小以避免需要像这样的过滤器。最后,@naivists 在他的回答中指出,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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2017-02-06
      • 2012-11-15
      • 2011-10-27
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2021-01-17
      相关资源
      最近更新 更多