Тратя время на попытки выяснить, почему минификация не работает.
Я внедрил через объект массива мои поставщики перед функцией в соответствии с многочисленными предложениями в Интернете, но все еще "Неизвестный поставщик: aProvider <- a"
Обычный:
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);
}])
Уменьшено:
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);
}])
Любое предложение будет очень признательно!
javascript
angularjs
minify
uglifyjs
BPWРазработка
источник
источник
]
? (до закрытия)
)Ответы:
Я сталкивался с этой проблемой раньше с Grunt.js Uglify .
Один из вариантов - выжимать
uglify: { options: { mangle: false },
Который, как я полагаю, запускает функции регулярного выражения «как строки» и минимизирует их.
Например:
angular.module("imgur", ["imgur.global","imgur.album"]);
Станет:
angular.module("a", ["a.global","a.album"]);
Отключите его - эта функция плохо работает с Angular.
Редактировать:
Чтобы быть более точным, как объясняет @JoshDavidMiller:
Uglify искажает
mangle
только переменные, что и является причиной проблемы AngularJS. То есть проблема в инъекции, а не в определении.function MyCtrl($scope, myService)
будет искаженоfunction MyCtrl(a, b)
, но определение службы внутри строки никогда не должно измениться.ng-min
перед бегомuglify
решает эту проблему.источник
dist
сборку, в которой будет указанная ошибка зависимости «Неизвестный поставщик». Установкаmangle: false
решила проблему. (примечание: речь шла только проблема вgrunt
построенномdist
не разработчик дружественнойapp
сборки)mangle: true
самом деле калечить « как струны»? Я почти уверен, что он искажает только переменные , что и является причиной проблемы AngularJS. То есть проблема в инъекции, а не в определении.function MyCtrl($scope, myService)
будет искаженоfunction MyCtrl(a, b)
, но определение службы внутри строки никогда не должно изменяться. Бегng-min
перед бегомuglify
решает эту проблему, не так ли?ng-min
теперь устарел в пользуng-annotate
Проблема
Из AngularJS: Плохие части :
Решение
Вы можете использовать
ng-annotate
для автоматического добавления аннотаций, необходимых для минимизации:ng-annotate
работает быстрее и стабильнее, чемngmin
(который теперь устарел), и имеет плагины для многих инструментов:grunt-ng-annotate
gulp-ng-annotate
browserify-annotate
Начиная с AngularJS 1.3 есть также новый параметр в
ngApp
называетсяngStrictDi
:источник
ngStrictDi
(что-то вроде<div ng-app="myApp" ng-strict-di />
) и использоватьgulp-ng-annotate
даже в своей среде разработки, чтобы вы легко отслеживали эти ошибки минификации.У меня такая же ошибка. Однако для меня проблема заключается в объявлении контроллера директив. Вам следует сделать это вместо этого.
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
источник
controller: function ($scope) {}
обозначения.mangle: false
предлагается в других ответах, потому что мы все еще хотим иметь возможность искажать имена.У меня была аналогичная проблема с использованием grunt, ngmin и uglify.
Я запустил процесс в следующем порядке: concat, ngmin, uglify
Я продолжал получать ошибку $ injector от angular, пока не добавил в uglify options mangle: false - тогда все было исправлено.
Я также попытался добавить исключения для uglify следующим образом:
options: { mangle: { except: ['jQuery', 'angular'] } }
Но без толку ...
Вот мой gruntFile.js для дальнейшего пояснения:
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']);
};
источник
Предложение AndrewM96
ng-min
верное.Выравнивание и пустое пространство имеют значение как для Uglify, так и для Angular.
источник
uglify
. В нашем процессе сборки мы использовали оба (ng-min
раньшеuglify
), и у нас все еще была проблема с uglified js.У меня была аналогичная проблема. И решил это следующим образом. Нам нужно запустить модуль Gulp под названием gulp-ng-annotate, прежде чем запускать uglify. Итак, мы устанавливаем этот модуль
Затем выполните требование в Gulpfile.js
ngannotate = require(‘gulp-ng-annotate’)
И в вашей задаче usemin сделайте что-то вроде этого
Это решило проблему для меня.
[РЕДАКТИРОВАТЬ: исправленные опечатки]
источник
mg-annotate
, всегда естьng-annotate
В Uglify есть возможность отключить искажение определенных файлов:
options: { mangle: { except: ['jQuery', 'angular'] } }
https://github.com/gruntjs/grunt-contrib-uglify#reserved-identifiers
источник
Это очень сложно отладить, потому что многие службы названы одинаково (в основном e или a). Это не решит ошибку, но предоставит вам имя неразрешенной службы. которая позволит вам отследить в некорректном выводе местоположение в коде и, наконец, позволит вам решить проблему:
Зайдите в
lib/scope.js
Uglify2 (node_modules/grunt-contrib-uglify/node_modules/uglify-js/lib/scope.js
) и замените строкуthis.mangled_name = this.scope.next_mangled(options);
с участием
this.mangled_name = this.name + "__debugging_" + counter++
источник