Минимизировать вывод HTML из приложения ASP.Net MVC
Это, вероятно, дубликат этого вопроса, но единственный ответ - мертвая ссылка:
Измените вывод Html приложения ASP.NET
При работе с ASP.Net одним из наиболее неприятных аспектов для меня является тот факт, что Visual Studio помещает пробелы вместо вкладок для белого интервала, что увеличивает размер окончательного HTML. Первоначально я думал об простом изменении настроек Visual Studio, чтобы использовать вкладки, но тогда другие в моей команде все равно будут накладываться на пробелы.
Мой вопрос в два раза: во-первых, есть способ изменить параметр для каждого проекта, если используются пробелы или вкладки (и это даже стоит того, если это так), а во-вторых, есть способ просто минимизировать все представления при сгенерировании?
Ответы
Ответ 1
Включение GZIP будет иметь гораздо больший эффект, чем минимизация вашего HTML. В любом случае.
Выполнение минимизации во время выполнения может повредить ваши серверы (при условии, что вы не используете кеширование). Может быть хорошей идеей минимизировать разметку Asp.Net во время развертывания. Таким образом, у вас все еще есть неминифицированная версия кода в вашем репозитории кода и мини-версия на сервере. Подумайте о процессе развертывания, в котором вы вызываете HTML minifier (например, этот инструмент Дина Юма выглядит многообещающим) на всех .aspx
файлы.
Ответ 2
Я рекомендую вам попробовать WebMarkupMin.Mvc. Документация доступна по адресу http://webmarkupmin.codeplex.com/documentation
Ответ 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);
}
}