2010-01-20 221 views
36

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

与ASP.Net的更恼人的一个方面工作时对我来说,Visual Studio为空白间距放置空格而不是制表符,这增加了最终HTML的大小。我原本以为只是简单地将Visual Studio设置改为使用制表符,但随后我的团队中的其他人仍然会以空格覆盖空格。

我的问题有两个方面:第一,如果使用空格或制表符,有一种方法可以改变每个项目的设置(如果是的话,它甚至是值得的),第二,是否有一种方法可以简单地将所有生成时的意见?

+0

可能重复(http://stackoverflow.com/questions/255008/minify-html-output-of-asp-net-application) – obayhan 2015-05-06 09:55:07

回答

37

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

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

+1

1。无论如何,你应该在传输时压缩你的输出,然后当你有一个标签和几个空格将有效地使用相同的带宽。 – bobince 2010-01-20 20:32:10

+0

这两个过滤器将在MVC文件夹层次结构中进入哪里? – 2010-04-02 01:10:20

+23

-1因为这不是问题的答案。 – 2014-10-06 21:55:35

6

This link作品(来自您提供的相关链接)。它有一个解决方案,可以让你用一个缩小你的HTML代替WebRazorHostFactory

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

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

这部分通常被置于Views\Web.config

+3

不适用于MVC4。如果你需要MVC4支持,请参阅https://github.com/Chebur9tina/HtmlOptimizerMvc4 – Cheburek 2013-10-23 13:55:26

10
+0

我已经使用过你的包并且工作得很好!但只能在IIS服务器上,而不能在本地机器上使用。 – rkawano 2015-04-13 23:12:43

+1

@rkawano,你可以: 1.安装[WebMarkupMin.Core](http://www.nuget.org/packages/WebMarkupMin.Core/)包,并使用WebMarkupMin作为.NET应用程序库(使用'HtmlMinifier','XhtmlMinifier'和'XmlMinifier'类)。 2.安装[Web Essentials 2013](https://visualstudiogallery.msdn.microsoft.com/56633663-6799-41d7-9df7-0f2a504ca361)并使用上下文菜单命令“Web Essentials”>“Minify HTML file(s )'缩小HTML文件的大小。 命令行版本的WebMarkupMin尚不存在。 – 2015-04-14 08:21:15

+0

使用disableMinificationInDebugMode =“false”将它设置为在本地IIS上缩小!非常感谢! – rkawano 2015-04-16 00:01:58

5

谷歌的PageSpeed一定会喜欢这样:

我挣扎与此一段时间,我发现的几件事情的组合的最佳方式:

你可以使用我的助手类MinifyHtmlAttribute on GitHubGist。它使用Zeta Producer Html Compressor,尽量减少HTML和与System.Web.Optimization的捆绑销售,以尽量减少内联JavaScript和CSS(对关键的CSS 0.0)

Zeta Producer Html Compressor NuGet Package

一个.NET谷歌的HtmlCompressor库来缩小的端口HTML来源 代码。

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

希望有人认为这有用。

0

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

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

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

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