27

C'è un modo per personalizzare il modo in cui la funzionalità di minimizzazione di Asp.Net MVC4 & minimizza i file js?Mvc4 bundling, minification e servizi AngularJS

Significato, non voglio disattivare completamente il minification, ma "as is" interrompe semplicemente AngularJs.

Da AngularJs utilizza DI CIO e approccio per l'iniezione di servizi nel controller, il seguente:

function MyController($scope) { } 

volta ridotte di, diventa:

function MyController(n) { } 

Normalmente questo non sarebbe un problema, ma AngularJs usa i nomi dei parametri per capire quale servizio iniettare. Quindi $ scope dovrebbe rimanere $ scope, così come qualsiasi altro parametro in controller angolari. Tutto il resto, come le variabili locali, ecc, dovrebbe essere minimizzato normalmente.

Non riesco a trovare alcuna documentazione chiara su come configurare il minification di Mvc4, e sembra piuttosto stupido che sia "tutto o niente" quindi penso che mi manchi qualcosa.

Grazie.

+0

Tecnicamente un duplicato di http://stackoverflow.com/questions/13032721/system-web-optimization-making-function-argument-names-stay-the-same-for-certain, anche se non penso che il la risposta ha un senso – drzaus

+0

Questa domanda è stata duplicata anche da http://stackoverflow.com/questions/17410012/customizing-net-4-5-bundler-minifier – drzaus

risposta

45

In realtà è possibile (e dovrebbe!) Scrivere il codice AngularJS in modo che sia "minification safe". I dettagli sono descritti nella sezione "Dipendenza Annotazione" di http://docs.angularjs.org/guide/di ma in breve, per i controller definiti a livello globale è possibile scrivere:

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

Si prega di notare che i controllori definiti a livello globale sono inquinanti namespace globale (vedi this per maggiori dettagli) e dovrebbe essere evitato. Se si dichiara un controllore su un livello di modulo si può fare minification-safe così:

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

L'inquinamento dello spazio dei nomi globale era un altro problema che avrei affrontato presto, quindi sembra che la soluzione sia la classico "due piccioni con una fava". Grazie. –

+0

Grazie !!! Questo ha funzionato per me :) –

1

se ancora desidera controllare cosa minify e cosa no (o se si desidera includere una versione già minified da il plugin fornitore) basta dichiarare due fasci, e minify solo uno di loro sul vostro 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

Penso che tu intenda il contrario: devi rimuovere esplicitamente la trasformazione minify con 'dontMinify.Transforms.Clear()' – drzaus

1

per quelli di voi che non vogliono/non può essere mandato a quel paese di scrivere la "minimizzazione-safe "sintassi angolare-DI, e non mi interessa che i nomi delle variabili vengano offuscati, ho usato BundleTransfomer insieme al minificatore Yui Js - disponibile tramite nuget:

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

Fornisce un controllo MOLTO a grana fine su minificazione/offuscamento. Nel mondo angolare, basta impostare l'offuscata JavaScript nella sezione yui web.config su false.

Problemi correlati