找出“未知供应商”错误的原因

我收到以下错误:

Error: [$injector:unpr] Unknown provider: nProvider <- n 

我知道这是由缩小过程造成的,我明白为什么 。 但有没有一种简单的方法来确定哪个文件实际上导致问题?

Angular 1.3.x有一个ng-strict-di指令,与ng-app指令放在同一个元素上。 此元素会导致您的应用程序在没有注释依赖关系时抛出错误。 虽然它仍然没有给出你的代码行号,但它给你的函数的参数(即函数($范围,myServiceName)),这是希望独特的,你可以很快find一个好代码编辑。

这个指令很好的概述: ng-strict-di 。

我理解这个问题,我有一个答案,只是稍微复杂。

我发现问题的方式是重命名所有的标识符,使它们都是唯一的,然后在编译后的JavaScript中find一些有用的东西,这将有助于指向你的罪魁祸首。

下载我修改后的uglify版本(pull request pending …)

如果没有brew install node ,请创buildbrew install node

./bin/uglifyjs --unique_ids original.min.js >new.min.js

现在用new.min.jsreplace你编译的js,并加载你的应用程序来重现这个问题,现在你应该得到一个dependency injection错误,如n4536

如果你的编辑器超棒,你可以加载new.min.js,寻找n4536,希望能帮助你识别罪魁祸首。

如果没有,这将打印一些问题的背景。 egrep -o '.{199}n4536.{99}' new.min.js

Angular的注入器有三种方法来解决你的依赖:

1.推断函数参数名称的依赖关系 。 这是最常用的所有angular的例子,例如

 app.controller('MyController', function($scope, MyService) { ... }); 

在这种情况下,注入器强制转换为string函数,分析参数名称并查找服务/工厂/任何其他名称匹配的名称。

2.内嵌注释 。 您可能也会遇到这样的语法:

 app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]); 

在这种情况下,由于您明确指定了所需的依赖关系的名称,因此可以使其更容易。 名称用引号引起来,js缩写词不修改代码中的string。

3.内嵌注释作为属性 。 如果将控制器定义为函数,则可以在特殊属性$inject设置注释:

 function MyController($scope, MyService) {...} MyController.$inject = ['$scope', 'MyService']; 

在这种情况下,我们也显式声明依赖关系。

我的猜测是你使用的解决scheme没有。 一旦minifier改变了隐式定义的依赖关系的名称,注入器不再知道你的函数的依赖关系是什么。 为了克服这个问题,你应该使用第二种或第三种方式来注释依赖关系。

虽然如果你不知道去哪里看,似乎没有什么好的方法来debugging这些直接投资问题,但是我知道我的投资并不那么显而易见,那就是:

 App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies']) .config(servicesConfig) .run(($rootScope, $location) -> $rootScope.location = $location) 

需要是:

 App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies']) .config(servicesConfig) .run(['$rootScope', '$location', ($rootScope, $location) -> $rootScope.location = $location])