Pasar el tiempo más divertido tratando de descubrir por qué la minificación no funciona.
He inyectado a través de un objeto de matriz a mis proveedores antes de la función según numerosas sugerencias en la web y, sin embargo, todavía "Proveedor desconocido: aProvider <- a"
Regular:
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);
}])
Minificado:
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);
}])
¡Cualquier sugerencia sería muy agradecida!
javascript
angularjs
minify
uglifyjs
BPWDesarrollo
fuente
fuente
]
? (antes del cierre)
)Respuestas:
Me encontré con este problema antes con el complemento Grunt.js Uglify .
Una de las opciones es mangle
uglify: { options: { mangle: false },
Lo que creo que ejecuta funciones de expresiones regulares en "cadenas similares" y las minimiza.
Por ejemplo:
angular.module("imgur", ["imgur.global","imgur.album"]);
Se convertiría:
angular.module("a", ["a.global","a.album"]);
Desactívelo: esta función no funciona bien con Angular.
Editar:
Para ser más precisos, como explica @JoshDavidMiller:
Uglify
mangle
solo modifica variables similares, que es lo que realmente causa el problema de AngularJS. Es decir, el problema está en la inyección y no en la definición.function MyCtrl($scope, myService)
se estropearíafunction MyCtrl(a, b)
, pero la definición de servicio dentro de una cadena nunca debería modificarse.ng-min
antes de ejecutaruglify
resuelve este problema.fuente
dist
compilación que tendría el error de dependencia mencionado "Proveedor desconocido". La configuraciónmangle: false
resolvió el problema. (nota: el problema fue solo un problema en la compilacióngrunt
construida,dist
no en laapp
compilación amigable para el desarrollador)mangle: true
Realmente destroza "como cuerdas"? Estoy bastante seguro de que solo se estropea como variables , que es lo que realmente causa el problema de AngularJS. Es decir, el problema está en la inyección y no en la definición.function MyCtrl($scope, myService)
se estropearíafunction MyCtrl(a, b)
, pero la definición de servicio dentro de una cadena nunca debería modificarse. Ejecutarng-min
antes de ejecutaruglify
resuelve este problema, ¿no?ng-min
ahora está en desuso a favor deng-annotate
Problema
Desde AngularJS: The Bad Parts :
Solución
Puede usar
ng-annotate
para agregar automáticamente las anotaciones necesarias para minificar:ng-annotate
es más rápido y estable quengmin
(que ahora está en desuso) y tiene complementos para muchas herramientas:grunt-ng-annotate
gulp-ng-annotate
browserify-annotate
A partir de AngularJS 1.3 también hay un nuevo parámetro
ngApp
llamadongStrictDi
:fuente
ngStrictDi
(algo así como<div ng-app="myApp" ng-strict-di />
) y usargulp-ng-annotate
incluso en su entorno de desarrollo para que pueda rastrear fácilmente estos errores de minificación.Tengo el mismo error. Sin embargo, para mí, el problema es la declaración del controlador de las directivas. Deberías hacer esto en su lugar.
myModule.directive('directiveName', function factory(injectables) { var directiveDefinitionObject = { templateUrl: 'directive.html', replace: false, restrict: 'A', controller: ["$scope", "$element", "$attrs", "$transclude", "otherInjectables", function($scope, $element, $attrs, $transclude, otherInjectables) { ... }] }; return directiveDefinitionObject; });
https://github.com/angular/angular.js/pull/3125
fuente
controller: function ($scope) {}
notación.mangle: false
sugiere en otras respuestas, porque todavía queremos poder modificar los nombres.Tuve un problema similar al usar grunt, ngmin y uglify.
Ejecuté el proceso en este orden: concat, ngmin, uglify
Seguí obteniendo el error $ injector de angular hasta que agregué las opciones de uglify mangle: false, luego todo se solucionó.
También intenté agregar las excepciones para uglify así:
options: { mangle: { except: ['jQuery', 'angular'] } }
Pero fue en vano...
Aquí está mi gruntFile.js para mayor aclaración:
module.exports = function(grunt) { 'use strict'; // Configuration goes here grunt.initConfig({ pkg: require('./package.json'), watch: { files: ['scripts/**/*.js', 'test/**/*spec.js', 'GruntFile.js'], tasks: ['test', 'ngmin'] }, jasmine : { // Your project's source files src : ['bower_components/angular/angular.js', 'bower_components/angular-mocks/angular-mocks.js', 'scripts/app.js', 'scripts/**/*.js' ], // Your Jasmine spec files options : { specs : 'test/**/*spec.js', helpers: 'test/lib/*.js' } }, concat: { dist : { src: ['scripts/app.js', 'scripts/**/*.js'], dest: 'production/js/concat.js' } }, ngmin: { angular: { src : ['production/js/concat.js'], dest : 'production/js/ngmin.js' } }, uglify : { options: { report: 'min', mangle: false }, my_target : { files : { 'production/app/app.min.js' : ['production/js/ngmin.js'] } } }, docular : { groups: [], showDocularDocs: false, showAngularDocs: false } }); // Load plugins here grunt.loadNpmTasks('grunt-ngmin'); grunt.loadNpmTasks('grunt-docular'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jasmine'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-connect'); // Define your tasks here grunt.registerTask('test', ['jasmine']); grunt.registerTask('build', ['concat', 'ngmin', 'uglify']); grunt.registerTask('default', ['test', 'build', 'watch']);
};
fuente
La sugerencia de AndrewM96
ng-min
es correcta.La alineación y el espacio en blanco son importantes para Uglify y Angular.
fuente
uglify
. En nuestro proceso de compilación usamos ambos (ng-min
antesuglify
) y todavía teníamos un problema con el js feo.Tuve un problema similar. Y lo resolvió de la siguiente manera. Necesitamos ejecutar un módulo Gulp llamado gulp-ng-annotate antes de ejecutar uglify. Entonces instalamos ese módulo
Luego haga el requerimiento en Gulpfile.js
ngannotate = require(‘gulp-ng-annotate’)
Y en tu tarea usemin haz algo como esto
Eso me resolvió.
[EDITAR: errores tipográficos corregidos]
fuente
mg-annotate
siempreng-annotate
Uglify tiene una opción para deshabilitar la manipulación de archivos específicos:
options: { mangle: { except: ['jQuery', 'angular'] } }
https://github.com/gruntjs/grunt-contrib-uglify#reserved-identifiers
fuente
Esto es muy difícil de depurar porque muchos servicios tienen el mismo nombre (principalmente e o a). Esto no resolverá el error, pero le proporcionará el nombre del servicio no resuelto que le permite rastrear, en la salida desagradable, la ubicación en el código y finalmente le permite resolver el problema:
Vaya a
lib/scope.js
Uglify2 (node_modules/grunt-contrib-uglify/node_modules/uglify-js/lib/scope.js
) y reemplace la líneathis.mangled_name = this.scope.next_mangled(options);
con
this.mangled_name = this.name + "__debugging_" + counter++
fuente