Bundling and Minification w ASP MVC 4
Bundling i Minification to dwie techniki które można użyć w ASP MVC 4 w celu poprawy czasu ładowania stron. Bundling i Minification poprawia czas ładowania przez zmniejszenie liczby żądań do serwera i zmniejszenie rozmiaru wymaganych składników (takich jak CSS i JavaScript.)
We wcześniejszych wersjach obydwie techniki można było zaimplementować używając zewnętrznych bibliotek. Wbudowane rozwiązanie rozwiązuje ten problem i spełnia swoje zadania w bardzo dobry sposób. Poniższy rysunek to okno programu Firebug przedstawiające sporą liczbę odwołań do serwera.
Aby zredukować liczbę odwołań do serwera, należy skorzystać z mechanizmu Bundling który ułatwia łączenie wielu plików w jeden pakiet. Można tworzyć pakiety CSS, JavaScript i inne. Mniejsza liczba plików oznacza mniej żądań HTTP i może przyspieszyć ładowanie stron. Minification wykonuje różnorodne optymalizacje kodu dla skryptów lub CSS, takich jak usunięcie niepotrzebnych białych znaków i komentarzy oraz skrócenie nazwy zmiennych do jednego znaku. Tak więc nie potrzeba tworzyć osobnych plików z rozszerzeniem min.js. Poniższa ilustracja przedstawia ten sam widok ale przy wykorzystaniu mechanizmu Bundling i Minification.
Jak widać liczba żądań drastycznie spadła.
Użycie tego mechanizmu jest proste. Należy otworzyć App_Start\BundleConfig.cs i zmodyfikować metodę RegisterBundles, która jest używana do tworzenia, rejestracji i konfiguracji wiązań. Poniższy kod przedstawia część metody 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/js").Include( "~/bundles/jquery", "~/bundles/jqueryui", "~/bundles/jqueryval", )); }
– „{version}” oznacza pobranie odpowiedniej wersji pliku znajdującej się w katalogu Scripts. Jeżeli korzystamy z mechanizmu Nuget do aktualizacji jQuery to nie musimy zmieniać kodu metody RegisterBundles, ponieważ użycie {version} skutkuje użyciem nowej wersji biblioteki jQuery.
-„*” w „~/Scripts/jquery.validate*” oznacza pobranie wszystkich plików zaczynających się od jquery.validate.
Podobnie działa tworzenie paczek css:
public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new StyleBundle("~/Content/site-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.spinner.css", "~/Content/themes/base/jquery.ui.tooltip.css", "~/Content/themes/base/jquery.ui.theme.css")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css", "~/Content/themes/base/css")); }
Paczki mogą być także łączone (np. „~/bundles/js”). Możliwe jest także wykorzystanie sieci CDN:
bundles.Add(new ScriptBundle("~/bundles/jquery", "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js").Include( "~/Scripts/jquery-{version}.js"));
Powyższy kod wykorzystuje CDN w wersji Release a w Debug lokalną wersje.
Użycie paczki jest bardzo proste, sprowadza się do wywołania metod Styles.Render (dla stylów) lub Scripts.Render (dla skryptów) których parametrami jest nazwa paczki:
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/js")
Funkcja Bundling i Minification jest włączona lub wyłączona przez ustawienie wartości atrybutu debug w elemencie compilation w pliku Web.config. W poniższym XML, debug jest ustawiona na true, w takim przypadku mechanizm Bundling i Minification jest wyłączony.