Подтвердить что ты не робот

Минимизировать вывод HTML из приложения ASP.Net MVC

Это, вероятно, дубликат этого вопроса, но единственный ответ - мертвая ссылка:
Измените вывод Html приложения ASP.NET

При работе с ASP.Net одним из наиболее неприятных аспектов для меня является тот факт, что Visual Studio помещает пробелы вместо вкладок для белого интервала, что увеличивает размер окончательного HTML. Первоначально я думал об простом изменении настроек Visual Studio, чтобы использовать вкладки, но тогда другие в моей команде все равно будут накладываться на пробелы.

Мой вопрос в два раза: во-первых, есть способ изменить параметр для каждого проекта, если используются пробелы или вкладки (и это даже стоит того, если это так), а во-вторых, есть способ просто минимизировать все представления при сгенерировании?

4b9b3361

Ответ 1

Включение GZIP будет иметь гораздо больший эффект, чем минимизация вашего HTML. В любом случае.

Выполнение минимизации во время выполнения может повредить ваши серверы (при условии, что вы не используете кеширование). Может быть хорошей идеей минимизировать разметку Asp.Net во время развертывания. Таким образом, у вас все еще есть неминифицированная версия кода в вашем репозитории кода и мини-версия на сервере. Подумайте о процессе развертывания, в котором вы вызываете HTML minifier (например, этот инструмент Дина Юма выглядит многообещающим) на всех .aspx файлы.

Ответ 3

Эта ссылка работает (из связанной ссылки, которую вы предоставляете). У этого есть решение, которое позволяет вам заменить WebRazorHostFactory на то, что минимизирует ваш HTML.

Чтобы он работал, вы должны добавить следующее в свой Web.config файл:

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

Этот раздел обычно помещается в Views\Web.config.

Ответ 4

Google Pagespeed понравится:

Я боролся некоторое время с этим, и лучший способ, который я нашел, - это комбинация нескольких вещей:

Вы можете использовать мой класс помощника MinifyHtmlAttribute в GitHub Gist. Он использует Zeta Producer Html Compressor, чтобы свести к минимуму HTML и с помощью System.Web.Optimization Bundling, чтобы свести к минимуму встроенный JavaScript и CSS (для вашего критического css 0.0)

Zeta Producer Html Компрессор NuGet Package

. NET-порт Googles. Библиотека HtmlCompressor для минимизации источника HTML. код.

Теперь вы можете сжать и уменьшить свой html с помощью встроенного css и javascript, который также будет уменьшен! Потрясающие!;)

Надеюсь, что кто-то найдет это полезным.

Ответ 5

Это старый вопрос, но я буду подбрасывать свое решение, если оно принесет пользу кому-то другому.

У меня был фильтр "minification", в котором использовались регулярные выражения, которые работали по большей части. Это случилось, когда дело дошло до сохранения пробелов в тегах pre и textarea. В конце концов я столкнулся с стеной несколько дней назад из-за этого, поэтому я потратил около трех дней на чтение того, что другие пытались и опробовали мои идеи. В конце концов, я решил разобрать HTML с помощью HtmlAgilityPack и удалить там узлы пробелов. Поскольку пробелы в элементах pre и textarea не считались пробелами по HAP, это сработало в мою пользу и делало именно то, что я хотел. У меня были проблемы с самого начала, потому что HTML отправлялся в куски, но я разрешил его, буферизируя его до тех пор, пока он не будет завершен. Здесь мой код в случае, если это выгодно кому-то другому.

Обратите внимание, что этот фильтр работает для меня в моем приложении (ASP.NET MVC 5). В идеале, во время публикации необходимо сделать минимализацию, чтобы избежать необходимости в таких фильтрах. Наконец, @naivists в своем ответе утверждает, что GZIP, сжимающий ответ, будет иметь лучший эффект, чем минимизация, но я немного не согласен с ним. Да, это будет, но минимизация действительно уменьшает реакцию, когда-либо так слегка поверх этого. Там, где он действительно сияет, это стиль с использованием CSS, потому что теперь вам не нужно беспокоиться о том, как набегать на пробелы и перетаскивать элементы, а также использовать атрибут margin/padding/positioning для исправления.

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