12

Chcę porady ekspertów na temat łączenia i minimalizowania ASP.NET MVC. Mam w moich plikach skryptu projektu, które mają zarówno wersje nieskasowane (.js) i minified (.min.js). Mam włączone je w moim skryptu wiązki następująco:Łączenie i minimalizowanie ASP.NET - w tym już minified pliki dla pakietów produkcyjnych i niezminiaturowanych plików do rozwoju

bundles.Add(new ScriptBundle("~/bundles/layout").Include(
        "~/Scripts/jquery-{version}.js", 
        "~/Scripts/lib/errorhandling.js", 
        "~/Scripts/lib/errorhandling.min.js", 
        "~/Scripts/vendor/modernizr.custom.js", 
        "~/Scripts/vendor/modernizr.custom.min.js", 
        "~/Scripts/toastr.js", 
        "~/Scripts/toastr.min.js")); 

Wydaje się, że wiązka rzeczywiście zawiera tylko raz w pliku skryptu, a nie dwa razy. Potwierdziłem to zarówno dla rozwoju, jak i produkcji. (Na marginesie, w fazie rozwojowej, to znaczy, gdy debug = true, pakiety nie są renderowane, ale pliki są dołączane jako oddzielne znaczniki skryptów. Jest to również pożądane zachowanie dla mnie.)

Moje pytania to:

(1) Czy jest to najlepszy i zalecany sposób dołączania już zminimalizowanych plików do konfiguracji produkcji i nieopracowanych plików do programowania?

(2) Czy ASP.NET próbuje zminimalizować cały pakiet w produkcji (mimo że jest już zminimalizowany)? Jeśli tak, jaki jest najlepszy sposób, aby uniemożliwić program ASP.NET próbę zminimalizowania pakietu?

Z góry dzięki!

Odpowiedz

17

Nie ma potrzeby uwzględniania w wersji skróconej wersji pakietu skryptów. Domyślnie MVC wyszuka odpowiedni plik z rozszerzeniem .min.js i uwzględni go (nie jest do końca pewien, czy spróbuje dalej zminimalizować). Jeśli nie, tworzy miniaturową wersję. Można to sprawdzić poprzez dodanie następujących do BundleConfig.cs

using System.Web.Optimization; 

następnie dodanie następujących po zakończeniu przesłonić debug=true w rozwoju

BundleTable.EnableOptimizations = true; 

Od MS documentation

Ramy pakietowa następuje kilka wspólnych konwencje takie jak:

  • Wybierz plik ".min" do wydania, gdy istnieją "FileX.min.js" i "FileX.js" .
  • Wybór wersji ".min" do debugowania.
  • Ignorowanie plików "-vsdoc" (takich jak jquery-1.7.1-vsdoc.js), które są używane tylko przez technologię IntelliSense .
+0

Ciekawe, sam nauczyłem się czegoś, nie zdawałem sobie sprawy, że framework wybrałby .min wersja automatycznie. Chyba powinienem spędzić trochę czasu w dokumentach osobiście. Zawsze brałem pakowanie w wartości nominalnej. – codenheim

+0

Minimalne pliki często zawierają komentarze do map źródłowych: /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. jquery.org/license // @ sourceMappingURL = jquery-1.10.2.min.map */ Jeśli użyję pakietu, pozostaną w pakiecie. Czy to problem? Jeśli użyję ScriptBundle, ASP.NET je usunie. Czy powinienem zachować te komentarze w pakiecie, czy też powinny one zostać usunięte? –

+0

W takim przypadku użycie metody Bundle() zamiast ScriptBundle() w już zminiaturyzowanych wersjach jest sposobem obejścia tego. Przynajmniej to jeden sposób. – codenheim

5

Minimum, czy nie, funkcja sprzedaży pakietowej jest przydatna do logicznego grupowania skryptów i css, które łączą się w całość i jako jedno miejsce do kontrolowania rzeczy. Generuje również unikalne adresy URL, dzięki czemu eliminuje problemy z pamięcią podręczną przeglądarki.

Jeśli użyjesz ScriptBundle, silnik spróbuje zminimalizować (z wyjątkiem sytuacji, gdy ustawisz debug = true, jak pokazano).

Możesz wyłączyć minifikację, ale zachować łączenie, używając tylko pakietu() zamiast obiektu ScriptBundle(). Patrz odpowiedź Martina tutaj:

ASP.NET Bundles how to disable minification

Tak na marginesie, przy użyciu wstępnie minified pliki Bundle(), w przeciwieństwie do ScriptBundle() zachowa nagłówki licencji. Z licencją MIT JQuery, przynajmniej przewiduje, że nie powinno być usunięte. Nie wiem, jak interpretować fakt, że domyślny szablon Microsoft MVC używa ScriptBundle().

+0

Twoja ostatnia uwaga, czy to znaczy, że MVC zminimalizuje skrypt, nawet jeśli znajduje się wersja min.js? Mam dziwne dane wyjściowe z angular.js i angular.min.js powracają błędy minifikacji, chociaż chcę tylko, aby używały wstępnie minifikowanej wersji dostarczonej – obaylis

Powiązane problemy