查找"未知提供程序"错误的原因

Bre*_*tin 40 minify angularjs

我收到以下错误:

Error: [$injector:unpr] Unknown provider: nProvider <- n
Run Code Online (Sandbox Code Playgroud)

我知道这是由缩小过程引起的,我理解为什么.但是,是否有一种简单的方法可以确定哪个文件实际导致了问题?

ans*_*sen 28

Angular 1.3.x有一个ng-strict-di指令,它与ng-app指令放在同一个元素上.此元素会导致您的应用在未注释依赖项时抛出错误.虽然它仍然没有给你违规代码的行号,但它确实为你提供了带有参数的函数(即函数($ scope,myServiceName)),这个函数非常独特,你可以很快找到它.代码编辑.

该指令的一个很好的概述:ng-strict-di.


ark*_*ark 7

我理解这个问题而且我有一个答案,它只是有点令人费解.

我发现问题的方法是重命名所有标识符以使它们都是唯一的,然后你在编译的javascript中找到一些有用的东西,希望能指出你的罪魁祸首.

下载我修改后的uglify版本(拉请求等待...)

brew install node 如果您没有安装节点.

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

现在用你new.min.js的应用程序替换已编译的js 并加载你的应用程序以重现问题,现在你应该得到像n4536这样的依赖注入错误

如果你的编辑器很棒超长线你可以加载new.min.js,寻找n4536并希望这将帮助你找出罪魁祸首.

如果不是这样可以打印一些关于问题的背景. egrep -o '.{199}n4536.{99}' new.min.js

  • 当您应用[修复]时,此解决方案有效(https://github.com/arkarkark/UglifyJS/pull/1) (2认同)

pac*_*age 6

Angular的注入器有3种方法可以解决依赖关系:

1.从函数参数名称中推断依赖关系.这在所有角度的例子中最常用,例如

app.controller('MyController', function($scope, MyService) { ... });
Run Code Online (Sandbox Code Playgroud)

在这种情况下,注入器将函数转换为字符串,解析参数名称并查找与该名称匹配的服务/工厂/任何其他内容.

2.内联注释.您可能还会遇到以下语法:

app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使注入器更容易,因为您明确说明了所需的依赖项名称.名称用引号括起来,js minifiers不修改代码中的字符串.

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

function MyController($scope, MyService) {...}
MyController.$inject = ['$scope', 'MyService'];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们还明确声明了依赖关系.

我的猜测是你正在使用解决方案.1.一旦minifier更改了隐式定义的依赖项的名称,注入器就不再知道你的函数的依赖性是什么.要克服这个问题,您应该使用第二种或第三种方式来注释依赖项.

  • 请重读我的问题.我问如何跟踪错误的来源. (8认同)
  • 但是,它没有回答如何追踪来源的问题. (3认同)