39

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

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

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

4

5 に答える 5

45

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

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

于 2010-01-20T20:10:52.513 に答える
13

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

于 2014-09-16T11:39:26.187 に答える
6

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

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

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

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

于 2013-04-01T00:29:28.907 に答える
6

Google Pagespeedはこれを気に入るはずです:

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

GitHubGistで私のヘルパークラスMinifyHtmlAttributeを使用できますZeta Producer Html Compressorを使用してHTMLを最小化し、System.Web.Optimization's Bundlingを使用して、インラインjavascriptとCSSを最小化します(重要なcss 0.0の場合)

ゼータプロデューサーHtmlコンプレッサーNuGetパッケージ

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

これで、インラインcssとjavascriptも縮小されて、htmlを圧縮および縮小できます。素晴らしい!;)

誰かがこれが役に立つと思うことを願っています。

于 2016-01-08T13:09:46.547 に答える
0

これは古い質問ですが、他の誰かに利益をもたらす場合に備えて、ソリューションを投入します。

ほとんどの部分で機能する正規表現を使用した「縮小」フィルターがありました。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);
    }
}
于 2017-03-25T00:59:16.237 に答える