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
manglesolo 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-minantes de ejecutaruglifyresuelve este problema.fuente
distcompilación que tendría el error de dependencia mencionado "Proveedor desconocido". La configuraciónmangle: falseresolvió el problema. (nota: el problema fue solo un problema en la compilacióngruntconstruida,distno en laappcompilación amigable para el desarrollador)mangle: trueRealmente 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-minantes de ejecutaruglifyresuelve este problema, ¿no?ng-minahora está en desuso a favor deng-annotateProblema
Desde AngularJS: The Bad Parts :
Solución
Puede usar
ng-annotatepara agregar automáticamente las anotaciones necesarias para minificar:ng-annotatees más rápido y estable quengmin(que ahora está en desuso) y tiene complementos para muchas herramientas:grunt-ng-annotategulp-ng-annotatebrowserify-annotateA partir de AngularJS 1.3 también hay un nuevo parámetro
ngAppllamadongStrictDi:fuente
ngStrictDi(algo así como<div ng-app="myApp" ng-strict-di />) y usargulp-ng-annotateincluso 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: falsesugiere 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-mines 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-minantesuglify) 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-annotatesiempreng-annotateUglify 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.jsUglify2 (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