web-dev-qa-db-ja.com

ASP.Net MVCアプリケーションからのHTML出力を縮小する

これはおそらく以下の質問の複製ですが、唯一の答えはデッドリンクです:
ASP.NETアプリケーションの最小限のHTML出力

ASP.Netで作業するとき、私にとってより厄介な側面の1つは、Visual Studioがタブの代わりに空白を配置するため、最終的なHTMLのサイズが大きくなることです。最初はVisual Studioの設定を変更して代わりにタブを使用することを考えていましたが、チームの他のメンバーはとにかくスペースでオーバーレイしてしまいます。

私の質問は2つあります。1つ目は、プロジェクトごとの設定で、スペースまたはタブが使用されている場合に変更する方法があり(使用されている場合でも価値がある)、次に、生成時にすべてのビューを単純に縮小する方法があります。 ?

37
mynameiscoffey

GZIPを有効にする とにかく、HTMLを縮小するよりもはるかに効果があります。

実行時に縮小を行うと、サーバーが損傷する可能性があります(キャッシュを使用しない場合)。展開中にAsp.Netマークアップを最小化することをお勧めします。このようにして、コードリポジトリにコードの非縮小バージョンがあり、サーバーに縮小バージョンがあります。すべての.aspxファイルに対してHTMLミニファイア(たとえば Dean Humeによるこのツール は有望に見える)を呼び出すデプロイメントプロセスを考えてみてください。

41
naivists

WebMarkupMin.Mvc を試すことをお勧めします。ドキュメントは- http://webmarkupmin.codeplex.com/documentation で入手できます。

11
Andrey Taritsyn

このリンク は機能します(提供する関連リンクから)。 WebRazorHostFactoryをHTMLを縮小するものに置き換えることができるソリューションがあります。

これを機能させるには、Web.configファイルに以下を追加する必要があります。

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

このセクションは通常、Views\Web.configに配置されます。

6
lante

Google Pagespeedはこれを気に入っています:

私はこれにしばらく苦労しました、そして私が見つけた最良の方法はいくつかのことの組み合わせでした:

私のヘルパークラス MinifyHtmlAttribute onGitHubGist を使用できます。 Zeta Producer Html Compressor を使用してHTMLを最小化し、System.Web.Optimizationのバンドル、インラインJavaScriptとCSSを最小限に抑える(重要なCSS 0.0の場合)

Zeta Producer Html Compressor NuGetパッケージ

GoogleのHtmlCompressorライブラリの.NETポート。HTMLソースコードを縮小します。

これで、インラインcssとjavascriptも縮小してHTMLを圧縮および縮小できます!!驚くばかり! ;)

誰かがこれが便利だと思ってください。

6
Aldracor

これは古い質問ですが、他の人にメリットがある場合に備えて、私の解決策を投げます。

ほとんどの部分で機能する正規表現を使用した「縮小」フィルターがありました。 preおよびtextareaタグ内の空白を保持することになると失敗しました。それが原因で数日前に壁にぶつかってしまったので、他の人が試したものを読んだり、自分のアイデアを試したりするのに約3日かかりました。最後に、HtmlAgilityPackを使用してHTMLを解析し、そこから空白ノードを削除することにしました。 pre要素とtextarea要素の空白は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);
    }
}
0
Gup3rSuR4c