最近我遇到了AngularJS Strict DI模式。目的是什么?使用它的好处?我们是否会通过在移动设备上使用它来获得显着的性能提升?
我尝试将它应用于我的代码,在编写代码时我没有做任何注释。但是,我的代码要缩小,并在构建期间进行ng-annotate。但是为什么在我将严格的DI模式添加到我的代码后,我仍然会收到错误说"需要显式注释"?
答案 0 :(得分:32)
严格的DI模式在运行时发现一段不符合缩小的代码时,基本上会抛出错误;但请注意,代码可能是正确的,没有逻辑语法错误。
引用文档:
如果app元素上存在此属性,则将在" strict-di"中创建注入器。模式。这意味着应用程序将无法调用不使用显式函数注释(因此不适合缩小)的函数,如“依赖注入指南”中所述,有用的调试信息将有助于跟踪这些错误的根源。
例如,此代码会触发错误,因为($scope, $http, $filter)
未使用$inject
显式注入,或者将.controller(A,B)
方法作为第二个字段提供给angular.module("myApp", [])
// BadController cannot be invoked, because
// the dependencies to be injected are not
// explicitly listed.
.controller("BadController", function($scope, $http, $filter) {
// ...
});
方法。
angular.module("myApp", [])
.controller("GoodController1", GoodController1);
GoodController1.$inject = ["$scope", "$http", "$filter"];
function GoodController1($scope, $http, $filter){}
右片段:
angular.module("myApp", [])
.controller("GoodController1",
["$scope", "$http", "$filter", function ($scope, $http, $filter){
//...
}]);
或:
$scope
为了回答您的问题,使用它并没有显着的性能提升。它只授予您微小的错误安全性。这是因为缩小会更改变量名称,例如在没有显式注释的情况下使用HTTP Post
时会破坏代码。
答案 1 :(得分:6)
Angular strict DI强制执行代码可缩小性。
当您的代码缩小时,参数的名称会缩短,从而打破角度的DI。为了解决这个问题,angular已经添加了两个(现在可能更多)替代方法来添加依赖关系。
也许最常见的方式和ng-annotate使用的方法是将数组而不是函数作为第二个参数。依赖关系是数组中最后一个元素之前的字符串,字符串是依赖项名称。
controller.$inject(['$scope']);
angular.module('app', ['dependency']).controller('myCtrl', ['myFirstDep',
function(willBeInjectedHere){}])
你的ng-annotate可能在angular进行检查之前没有运行。确保你没有和注释一起运行uglify,明确地执行它。如果你的代码抛出错误,那么很可能在某处没有注释。
答案 2 :(得分:6)
您还可以像这样添加strict-di:
angular.bootstrap(document, ['app'], {
strictDi: true
});
使用角度meteor es6类应用程序时。
答案 3 :(得分:4)
良好做法是使用strict-di
。调用不使用显式函数注释的函数时,App必须无法运行。这意味着必须声明所使用的方法。使用ng-strict-di
将确保应用程序使用依赖项注入准则进行确认,否则将无法运行。
您可以使用ng-strict-di
:
<html ng-app="myApp" ng-strict-di>
参见开发者指南: https://docs.angularjs.org/guide/di