Die verdammteste Zeit haben, um herauszufinden, warum die Minifizierung nicht funktioniert.
Ich habe über ein Array-Objekt meine Provider vor der Funktion nach zahlreichen Vorschlägen im Web injiziert und trotzdem "Unbekannter Provider: aProvider <- a".
Regulär:
var app = angular.module('bpwApp', ['ui.bootstrap', 'ui', 'myTabs'])
.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider){
$routeProvider.
when('/', {templateUrl: 'partials/home.jade', controller: HomeCtrl});
$locationProvider.html5Mode(true);
}])
Minimiert:
var app = angular.module('bpwApp', ['ui.bootstrap', 'ui', 'myTabs'])
.config(['$routeProvider', '$locationProvider', function(a, b){
a.
when('/', {templateUrl: 'partials/home.jade', controller: HomeCtrl});
b.html5Mode(true);
}])
Jeder Vorschlag wäre sehr dankbar!
javascript
angularjs
minify
uglifyjs
BPWDevelopment
quelle
quelle
]
? (vor dem Schließen)
)Antworten:
Ich bin zuvor mit dem Uglify- Plugin von Grunt.j auf dieses Problem gestoßen .
Eine der Optionen ist Mangle
Was meiner Meinung nach Regex-Funktionen auf "Like-Strings" ausführt und sie minimiert.
Beispielsweise:
Würde werden:
Deaktivieren Sie es --- diese Funktion spielt mit Angular nicht gut.
Bearbeiten:
Genauer gesagt erklärt @JoshDavidMiller:
Verunstalten
mangle
nur wie Variablen, was tatsächlich das AngularJS-Problem verursacht. Das heißt, das Problem liegt in der Injektion und nicht in der Definition.function MyCtrl($scope, myService)
würde entstellt werdenfunction MyCtrl(a, b)
, aber die Service-Definition innerhalb einer Zeichenfolge sollte niemals geändert werden.ng-min
vor dem Laufenuglify
löst dieses Problem.quelle
dist
Build erstellt, der den erwähnten Abhängigkeitsfehler "Unbekannter Anbieter" aufweisen würde. Die Einstellungmangle: false
löste das Problem. (Hinweis: Das Problem war nur ein Problem in der erstelltengrunt
,dist
nicht der entwicklerfreundlichenapp
Build)mangle: true
wirklich "wie Saiten"? Ich bin mir ziemlich sicher, dass es nur wie Variablen verstümmelt , was tatsächlich das AngularJS-Problem verursacht. Das heißt, das Problem liegt in der Injektion und nicht in der Definition.function MyCtrl($scope, myService)
würde entstellt werdenfunction MyCtrl(a, b)
, aber die Service-Definition innerhalb einer Zeichenfolge sollte niemals geändert werden. Laufenng-min
vor dem Laufenuglify
löst dieses Problem, nein?ng-min
ist jetzt zugunsten vonng-annotate
Problem
Von AngularJS: Die schlechten Teile :
Lösung
Sie können
ng-annotate
zum automatischen Hinzufügen von Anmerkungen, die zum Minimieren erforderlich sind, Folgendes verwenden:ng-annotate
ist schneller und stabiler alsngmin
(was jetzt veraltet ist) und es hat Plugins für viele Tools:grunt-ng-annotate
gulp-ng-annotate
browserify-annotate
Ab AngularJS 1.3 gibt es auch einen neuen Parameter
ngApp
namensngStrictDi
:quelle
ngStrictDi
(so etwas wie<div ng-app="myApp" ng-strict-di />
) zu aktivieren undgulp-ng-annotate
sogar in Ihrer Entwicklungsumgebung zu verwenden, damit Sie diese Minifizierungsfehler leicht aufspüren können.Ich habe den gleichen Fehler bekommen. Für mich ist das Problem jedoch die Controller-Deklaration der Direktiven. Sie sollten dies stattdessen tun.
https://github.com/angular/angular.js/pull/3125
quelle
controller: function ($scope) {}
Notation verwendet.mangle: false
in anderen Antworten vorgeschlagen, da wir weiterhin in der Lage sein möchten, Namen zu entstellen.Ich hatte ein ähnliches Problem mit grunt, ngmin und uglify.
Ich habe den Prozess in dieser Reihenfolge ausgeführt: concat, ngmin, uglify
Ich habe weiterhin den $ injoror-Fehler von Angular erhalten, bis ich in der uglify options mangle hinzugefügt habe: false - dann wurde alles behoben.
Ich habe auch versucht, die Ausnahmen hinzuzufügen, um so zu uglifizieren:
Aber ohne Erfolg ...
Hier ist meine gruntFile.js zur weiteren Verdeutlichung:
};
quelle
AndrewM96 Vorschlag von
ng-min
ist richtig.Die Ausrichtung und der Leerraum sind sowohl für Uglify als auch für Angular von Bedeutung.
quelle
uglify
. In unserem Build-Prozess verwenden wir beide (ng-min
vorheruglify
) und hatten immer noch ein Problem mit dem hässlichen js.Ich hatte ein ähnliches Problem. Und löste es folgendermaßen. Wir müssen ein Gulp-Modul namens gulp-ng-annotate ausführen, bevor wir uglify ausführen. Also installieren wir dieses Modul
Führen Sie dann die Anforderungen in Gulpfile.js aus
Und in Ihrer Usemin-Aufgabe machen Sie so etwas
Das hat es für mich gelöst.
[EDIT: Tippfehler behoben]
quelle
mg-annotate
ist immerng-annotate
Uglify bietet eine Option zum Deaktivieren des Mangelns für bestimmte Dateien:
https://github.com/gruntjs/grunt-contrib-uglify#reserved-identifiers
quelle
Dies ist sehr schwierig zu debuggen, da viele Dienste den gleichen Namen haben (meistens e oder a). Dadurch wird der Fehler nicht behoben, sondern Sie erhalten den Namen des nicht aufgelösten Dienstes , mit dem Sie in der hässlichen Ausgabe den Speicherort im Code ermitteln und schließlich das Problem beheben können:
Gehen Sie in
lib/scope.js
Uglify2 (node_modules/grunt-contrib-uglify/node_modules/uglify-js/lib/scope.js
) und ersetzen Sie die Zeilemit
quelle