Объединение и минификация статических ресурсов в ASP.NET Core

Авторы: Скотт Адди (Scott Addie) и Дэвид Пайн (David Pine)

В этой статье объясняются преимущества применения объединения и минификации, в том числе сведения о том, как эти функции можно использовать для веб-приложений ASP.NET Core.

Что такое объединение и минификация

Объединение и минификации — это два различных способа оптимизации производительности, которые можно применить в веб-приложении. Вместе объединение и минификация позволяют повысить производительность за счет сокращения числа запросов к серверу и уменьшения размера запрашиваемых статических ресурсов.

Объединение и минификация в первую очередь ускоряют загрузку первой страницы. После запроса веб-страницы браузер кэширует статические ресурсы (JavaScript, CSS и изображения). Следовательно, объединение и минификация не улучшают производительность при запросе одной и той же страницы или страниц на одном сайте, запрашивающем одни и те же ресурсы. Если заголовок Expires неправильно задан в ресурсах, а объединение и минификация не используются, эвристика обновления браузера помечает ресурсы как устаревшие через несколько дней. Кроме того, браузер требует запрос проверки для каждого ресурса. В этом случае объединение и минификация обеспечивают повышение производительности даже после запроса первой страницы.

Объединение

Объединение позволяет объединить несколько файлов в один файл. Объединение сокращает количество запросов к серверу, необходимых для преобразования веб-ресурса, например веб-страницы для просмотра. Можно создать любое количество отдельных пакетов специально для CSS, JavaScript и т. д. Меньше файлов означает меньше HTTP-запросов из браузера на сервер или из службы, предоставляющей приложение. Это приводит к повышению производительности загрузки первой страницы.

Минификация

Минификация удаляет из кода ненужные символы, не затрагивая его функциональность. В результате значительно уменьшается размер запрашиваемых ресурсов (например, CSS, изображений и файлов JavaScript). К обычным побочным эффектам минификации относятся сокращение имен переменных до одного символа и удаление комментариев и ненужных пробелов.

Рассмотрим следующую функцию JavaScript:

AddAltToImg = function (imageTagAndImageID, imageContext) {
  ///<signature>
  ///<summary> Adds an alt tab to the image
  // </summary>
  //<param name="imgElement" type="String">The image selector.</param>
  //<param name="ContextForImage" type="String">The image context.</param>
  ///</signature>
  var imageElement = $(imageTagAndImageID, imageContext);
  imageElement.attr('alt', imageElement.attr('id').replace(/ID/, ''));
}

Минификация сокращает функцию до следующего:

AddAltToImg=function(t,a){var r=$(t,a);r.attr("alt",r.attr("id").replace(/ID/,""))};

Помимо удаления комментариев и ненужных пробелов, были переименованы следующие имена параметров и переменных:

Исходная Переименовано
imageTagAndImageID t
imageContext a
imageElement r

Влияние объединения и минификации

В следующей таблице описаны различия между отдельной загрузкой ресурсов и использованием объединением и минификации для типичного веб-приложения.

Действие Без О/М С О/М Сокращение
Запросы файлов 18 7 61 %
Передаваемые байты (КБ) 265 156 41 %
Время загрузки (мс) 2360 885 63 %

Время загрузки улучшилось, но в этом примере выполнялось локально. Значительное повышение производительности достигается при использовании объединения и минификации в отношении ресурсов, передаваемых по сети.

Тестовое приложение, используемое для создания цифр в предыдущей таблице, демонстрирует типичные улучшения, которые могут не применяться к данному приложению. Мы рекомендуем протестировать приложение, чтобы определить, дает ли объединение и минификации улучшенное время загрузки.

Выбор стратегии объединения и минификации

Платформа ASP.NET Core совместима с WebOptimizer, решением с открытым кодом для объединения и минификации. Инструкции по настройке и примеры проектов см. на странице, посвященной WebOptimizer. В ASP.NET Core нет собственного решения для объединения и минификации.

Сторонние средства, такие как Gulp и Webpack, обеспечивают автоматизацию рабочих процессов для объединения и минификации, а также анализ кода и оптимизацию изображений. Используя объединение и минификации, до развертывания приложения создаются минифицированные файлы. Объединение и минификация до развертывания обеспечивают преимущества снижения нагрузки на сервер. Однако важно признать, что объединение и минификации повышает сложность сборки и работает только со статическими файлами.

Объединение и минификация на основе среды

Объединенные и минифицированные файлы приложения рекомендуется использовать в рабочей среде. Во время разработки исходные файлы упрощают отладку приложения.

Укажите, какие файлы следует включить на страницы, используя в своих представлениях вспомогательное приложение тегов среды. Вспомогательное приложение тегов среды отображает свое содержимое только при выполнении в определенных средах.

Следующий тег environment отображает необработанные файлы CSS при выполнении в среде Development:

<environment include="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

Следующий тег environment отображает объединенные и минифицированные файлы CSS при выполнении в среде, отличной от Development. Например, выполнение в Production или Staging запускает визуализацию этих таблиц стилей:

<environment exclude="Development">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

Дополнительные ресурсы