javascript – 角度缩小构建后如何修复注入器错误?

前端之家收集整理的这篇文章主要介绍了javascript – 角度缩小构建后如何修复注入器错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在发言之前,我读到它提出了建议,但仍然导致错误.看看简短的代码
function IndexController($scope,$route,$routeParams,$location){
  $scope.sfv = project.version.name;
}
angular.module("TkwebMobile",['ngRoute','ngCookies'])
  .controller('IndexController',['$scope','$route','$routeParams','$location',IndexController]);

只有这个和错误仍然存​​在.我正在使用grunt来“uglify”,而且我也使用“concat”将代码统一在“lib”中.甚至我在Angular文档中使用了“注入”.

Uncaught Error: [$injector:modulerr] Failed to instantiate module TkwebMobile due to:
Error: [$injector:unpr] Unknown provider: a

这是grunt concat的问题吗? (咕噜-的contrib-的concat)

解决方法

这是由于您的缩小,特别是缩小和修改变量名称的选项.

Angular根据参数名称确定要注入函数的值.例如…

angular.factory('MyFactory',function($location) {...});

…将导致angular查找名为’$location’的任何依赖项,然后使用作为其参数传递的$location值调用您的函数.

当你缩小你的javascript时,启用了一个名为mangle的选项,那么变量名称就会被破坏.以前的功能将变成这个……

angular.factory('MyFactory',function(a) {...});

Angular在源代码中不再具有正确的参数名称,因为$location现在是a.这节省了javascript的大小,但完全破坏了Angular的隐式依赖解析.您可以通过以下两种方式之一解决此问题.

第一个是角度为您提供的功能.

angular.factory('MyFactory',['$location',function(a) {...}]);

您在数组中提供参数的名称,数组的最后一个元素是将参数注入的函数.这样,你在代码调用你的参数并不重要,并且minifier永远不会改变字符串文字,所以Angular总是知道你想要什么.

另一种方法是,如果你不想失去不必使用数组表示法的便利,那就是关闭你的minifier上的mangle设置.这显然意味着你不会缩小到相同的程度,但问问自己是否真的值得这些额外的字节.

中间的房子是使用像ngMin这样的东西,允许将数组符号注释到代码中,然后继续缩小.这是两个世界上最好的imo,但增加了部署客户端js的复杂性.

编辑

关闭grunt中的mangle行为的正确设置是……

uglify: {
  options: {
    report: 'min',mangle: false
  }
}

但ngAnnotate包可以避免这种情况.有关详细信息,请参阅here. (ngAnnotate是接管ngMin的包)

猜你在找的JavaScript相关文章