2013-11-09 7 views
2

Вот мой index.html:экспресс-преуменьшать приводит к ошибкам с угловым

<script src="/app/bower_components/angular/angular.js"></script> 
<script src="/app/bower_components/angular-route/angular-route.js"></script> 
<script src="/app/bower_components/angular-resource/angular-resource.js"></script> 
<script src="/app/bower_components/angular-cookies/angular-cookies.js"></script> 
<script src="/app/bower_components/angular-sanitize/angular-sanitize.js"></script> 

В моей экспресс-конфигурации, у меня есть:

app.use(minify()); 
app.use('/app', express["static"](path.resolve('app'))); 
app.use('/public', express["static"](path.resolve('public'))); 

Если я Minify, я получаю ошибку в моем AngularJS код:

Failed to instantiate module appApp due to: [$injector:unpr] Unknown provider: e 

Если я не преуменьшаю, все в порядке. Что я делаю не так?

ответ

8

Сначала попробуйте запустить ngmin (https://github.com/btford/ngmin).

Это «преминистратор», который пытается обеспечить минимальную безопасность всех ваших услуг. Вы можете прочитать больше о проблемах с минификацией здесь: http://docs.angularjs.org/tutorial/step_05 (под записку о минификации)

Короче говоря, нагнетание зависимости углового ожидает услуги, чтобы иметь конкретное имя (например, $ рамки). Но министры меняют эти имена, чтобы сделать их короче, что отбрасывает инъекцию зависимостей (приводя к ошибке, которую вы видите, - большая подсказка, что это проблема увеличения, заключающаяся в том, что ошибка говорит, что она не может найти службу «e», . «e» является именно таким сокращенным именем, которое приводит к результатам минимизации)

Таким образом, как описывают документы, вы можете использовать стиль, подобный следующему, где поставщики указаны в строках (которые безопасны от минимизации) и затем вводится в соответствующий переменный параметр в позиции внутри массива, а не по имени.

phonecatApp.controller('PhoneListCtrl', ['$scope', '$http', function($scope, $http) {...}]); 

Вы можете сделать это вручную, но ngmin легкий способ обрабатывать все это автоматически, поскольку документы ngmin описывают, преобразование:

angular.module('whatever').controller('MyCtrl', function ($scope, $http) { ... }); 

в мин-сейф:

angular.module('whatever').controller('MyCtrl', ['$scope', '$http', function ($scope, $http) { ... }]); 
+0

** устарело ** AngularJS Pre-minifier -> use ng-annotate -> https://github.com/olov/ng-annotate –

1

Использование следующего кода, чтобы избежать name-mangling в процессе минимизации может помочь.

app.use(require('express-minify')({ mangle: false })); 

Пользователь Github в this pull request нашел, что это помогло им.

Смежные вопросы