Сократите вывод HTML из приложения ASP.Net MVC - PullRequest
36 голосов
/ 20 января 2010

Вероятно, это дубликат приведенного ниже вопроса, но единственным ответом является неработающая ссылка:
Сократить вывод Html приложения ASP.NET

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

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

Ответы [ 5 ]

37 голосов
/ 20 января 2010

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

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

10 голосов
/ 16 сентября 2014

Рекомендую попробовать WebMarkupMin.Mvc . Документация доступна по адресу - http://webmarkupmin.codeplex.com/documentation

6 голосов
/ 01 апреля 2013

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

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

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

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

5 голосов
/ 08 января 2016

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

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

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

Пакет NuGet для компрессора HTML Zeta Producer

Порт .NET библиотеки Google HtmlCompressor для минимизации источника HTML Код.

Теперь вы можете сжимать и минимизировать ваш html с помощью встроенных CSS и javascript, которые также минимизируются !! Круто! ;)

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

0 голосов
/ 25 марта 2017

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

У меня был фильтр минификации с использованием регулярных выражений, который работал по большей части. Сбой при сохранении пробелов в тегах pre и textarea. Я закончил тем, что ударил стену несколько дней назад из-за этого, поэтому я потратил около трех дней, читая то, что другие пробовали, и испытывая мои идеи. В конце я остановился на анализе HTML-кода с помощью HtmlAgilityPack и удалении из него узлов с пробелами. Поскольку пробелы в элементах 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...