| Пятница, 15 февраля, 2013
Метки: ASP.NET MVC, Bundling, Minifying Комментарии: 0
Пакетирование и минификация (bundling and minifying) в ASP.NET открывают новые возможности для оптимизации веб-сайтов и помогают экономить трафик. Как и другие способы улучшения производительности пакетирование и минификация не идеальны и имеют свои ограничения. В данной статье мы покажем как это работает в ASP.NET MVC.
Пакетирование помогает скачивать странице сайта файлы одного типа одним запросом, вместо того, чтобы скачивать каждый файл по отдельности. Используя меньше запросов страницы скачивают файлы стилей и скриптов. Минификация делает файлы меньше по размеру, удалая например пробелы.
Вместе оба приема уменьшают количество запросов и байтов при открытии страницы браузером.
В приложениях ASP.NET MVC 4 в директории App_Start находится файл BundleConfig.cs. Этот файл содержит класс BundleConfig, который имеет только один метод – RegisterBundles(). В этом методе скачиваемые файлы объединяются в пакеты.
public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( "~/Scripts/jquery-ui-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( "~/Content/themes/base/jquery.ui.core.css", "~/Content/themes/base/jquery.ui.resizable.css", "~/Content/themes/base/jquery.ui.selectable.css", "~/Content/themes/base/jquery.ui.accordion.css", "~/Content/themes/base/jquery.ui.autocomplete.css", "~/Content/themes/base/jquery.ui.button.css", "~/Content/themes/base/jquery.ui.dialog.css", "~/Content/themes/base/jquery.ui.slider.css", "~/Content/themes/base/jquery.ui.tabs.css", "~/Content/themes/base/jquery.ui.datepicker.css", "~/Content/themes/base/jquery.ui.progressbar.css", "~/Content/themes/base/jquery.ui.theme.css")); }
В примере файлы разбиты на группы и объединены в пакеты, каждый пакет скачивается как отдельный файл. Следовательно, c сервера будут получены следующие файлы.
Если внимательно посмотреть на определения файлов, то видно, что можно не только задавать имя файла, но и путь к нему. Специальное поле для подстановки {version} в имени файла означает, что имя может содержать номер версии. Этот шаблон особенно удобен для jQuery, так как данная библиотека часто обновляется. Когда обновляются файлы jQuery, новые файлы содержат новые номера версии. И так как файлы различаются только номерами версий, для обновленных файлов пакет будет создаваться без проблем без дополнительных действий со стороны разработчика.
Необходимо запомнить, что в режиме отладки пакетирование отключено по умолчанию. Для его включения нужно добавить в начале метода RegisterBundles():
BundleTable.EnableOptimizations = true;
Откроем представление _Layout.cshtml , и посмотрим, как подключаются пакеты:
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/jquery")
Хотя зарегистрировано пакетов больше, подключены только те, которые действительно необходимы.
Как видно в примере выше, пакеты скриптов и пакеты стилей создаются с помощью разных классов. Класс ScriptBundle предназначен для файлов скриптов, файлы других типов не нужно туда добавлять. То же самое можно сказать про класс StyleBundle. Оба этих класса наследуются от общего класса Bundle.
Минификация работает довольно хитро. Классы пакетирования сами не выполняют оптимизацию файлов. Все, что они делают, это добавляют нужный минификатор в свои коллекции преобразования. Существуют два класса минификации, которые находятся в пространстве имен System.Web.Optimization:
Именно эти классы делают всю работу по уменьшению файлов. Любой разработчик может написать свою реализацию минификатора. И если сохранен тот же стиль, как и во встроенных классах, то объекту пакетирования можно указать свой минификатор.
Случается, что CssMinify не может обработать некоторые файлы. В случае таких проблем объекты пакетирования пишут комментарии в обрабатываемые файлы. Эти отчеты создаются в начале файлов. Поэтому нужно иметь возможность отключать минификацию, но в то же время функции пакетирования должны работать.
Есть два способа сделать это:
Приведем несколько подсказок, касающихся работы пакетирования.
Итак, пакетирование и минификация - полезные приемы для оптимизации загрузки веб-страниц. Пакеты просты в использовании и позволяют расширять свои возможности. Почти все шаблоны ASP.NET MVC используют пакетирование. Благодаря простому и гибкому API можно держать под контролем все нюансы создания пакетов файлов. Есть возможность создавать собственные типы пакетов и определять преобразования файлов с собственной реализацией.
Copyright © CodeHint.ru 2013-2024 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля