27

Czy istnieje sposób, aby dostosować sposób, w jaki pakiet ASP.Net MVC4 wiążący & minimalizuje pliki js?Usługi wiązek, minimalizacji i AngliJS Mvc4

To znaczy, nie chcę całkowicie wyłączać minifikacji, ale "jak jest", to po prostu łamie AngularJs.

Od angularjs używa DI i IoC podejście do wstrzykiwania usługi w kontrolerach, co następuje:

function MyController($scope) { } 

Po minified staje:

function MyController(n) { } 

Normalnie nie byłoby problemu, ale angularjs używa nazw parametrów, aby zrozumieć, która usługa należy wstrzykiwać. Zatem zakres $ powinien pozostać w zakresie $, a także jakikolwiek inny parametr w kontrolerach kątowych. Cała reszta, jak zmienne lokalne itp., Powinna być normalnie zminimalizowana.

Nie mogę znaleźć żadnej jasnej dokumentacji, jak skonfigurować zminimalizowanie Mvc4, i wydaje się raczej głupie, że jest "wszystko albo nic", więc myślę, że czegoś brakuje.

Dzięki.

+0

Technicznie duplikat http://stackoverflow.com/questions/13032721/system-web-optimization-making-function-argument-names-stay-the-same-for-certain, chociaż nie sądzę, że odpowiedź ma sens. – drzaus

+0

To pytanie powielone również przez http://stackoverflow.com/questions/17410012/customizing-net-4-5-bundler-minifier – drzaus

Odpowiedz

45

Właściwie możesz (i powinieneś!) Napisać kod AngularJS, aby był "bezpieczny dla minimalizacji". Szczegóły opisano w sekcji „Zależność dopiskiem” z http://docs.angularjs.org/guide/di ale w skrócie, dla zdefiniowanych globalnie kontrolerów można napisać:

MyController.$inject = ['$scope'];

Pamiętaj, że zdefiniowane globalnie kontrolery są zanieczyszczenia globalnej przestrzeni nazw (patrz this więcej szczegółów) i należy ich unikać. Jeśli zadeklarujesz kontrolera na poziomie modułu można je minifikacji bezpieczny, a także:

angular.module('mymodule', []).controller('MyController', ['$scope', function($scope){ 
//controller code goes here 
}]); 
+1

Globalne zanieczyszczenie przestrzeni nazw było kolejnym problemem, który miałem wkrótce rozwiązać, więc wydaje się, że klasyczne "dwie ptactwo z jednym kamieniem". Dziękuję Ci. –

+0

Dzięki! To zadziałało dla mnie :) –

1

jeśli nadal chcesz kontrolować co minify a co nie (lub jeśli chcesz to już minified wersję według sprzedawca wtyczki) po prostu zadeklarować dwie wiązki, a tylko minify jeden z nich na swoim BundleConfig.cs:

var dontMinify = new Bundle("~/bundles/toNotMinify").Include(
         "~/Scripts/xxxxx.js"); 
bundles.Add(dontMinify); 

var minify = new Bundle("~/bundles/toNotMinify").Include(
         "~/Scripts/yyyyyy.js"); 
minify.Transforms.Add(new JsMinify()); 
bundles.Add(minify); 
+3

Myślę, że masz na myśli odwrotność - musisz jawnie usunąć transformację minify za pomocą 'dontMinify.Transforms.Clear()' – drzaus

1

dla tych z was, którzy nie chcą/nie mogą być arsed napisać „minifikacji-safe "składnia-DI" i nie dbają o to, że zmienne nazwy są zaciemniane, użyłem BundleTransfomer wraz z minifizerem Yui Js - dostępnym przez nuget:

Install-Package BundleTransformer.Core 
Install-Package BundleTransformer.Yui 

Daje bardzo dokładną kontrolę nad zminimalizowaniem/zaciemnianiem. W kanciastym świecie po prostu ustaw zaciemnienie Jawascript w sekcji yui web.config na wartość false.