2010-01-20 222 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); 
    } 
}