В чем преимущество режима AngularJS Strict DI?

Недавно я столкнулся с режимом AngularJS Strict DI. Какова цель и польза от его использования? Будем ли мы добиваться значительного улучшения производительности, используя его особенно на мобильных устройствах?

Я пытаюсь применить его к моему коду, и я не делал никаких комментариев при написании кода. Тем не менее, у меня есть мой код, который следует минимизировать, и ng-annotate во время сборки. Но почему это после того, как я добавил режим Strict DI в свой код, я до сих пор получаю сообщение об ошибке "Явная аннотация"?

Ответы

Ответ 1

Строгий режим 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){
     //...
}]);

Чтобы ответить на ваш вопрос, нет значительного улучшения производительности, используя его. Это только предоставит вам безопасную погрешность. Это потому, что minification изменяет имена переменных, нарушающих ваш код, когда, например, вы используете $scope без явной аннотации.

Ответ 2

Angular strict DI обеспечивает минимизацию кода.

Когда ваш код уменьшен, имена параметров сокращаются, что прерывает angular DI. Чтобы противостоять этой проблеме, angular добавил два (возможно, больше) альтернативных способов добавления зависимостей.

Возможно, наиболее распространенным способом и тем, который используется ng-annotate, является размещение в качестве второго параметра массива вместо функции. Зависимость - это строка перед последним элементом в массиве, строка - имена зависимостей.

controller.$inject(['$scope']);

angular.module('app', ['dependency']).controller('myCtrl', ['myFirstDep',
function(willBeInjectedHere){}])

Ваш ng-аннотат, вероятно, не работает до того, как angular проверяет. Убедитесь, что вы НЕ запускаете uglify вместе с аннотацией, сделайте это явно ПЕРЕД. Если ваш код бросает ошибку, то, скорее всего, есть где-то, что аннотация не была сделана.

Ответ 3

Хорошая практика заключается в использовании strict-di. Приложение должно не запускаться при вызове функций, которые не используют явную аннотацию функций. Это означает, что используемые методы должны быть объявлены. Использование ng-strict-di гарантирует, что приложение будет подтверждено с помощью руководства по инъекции зависимостей и не будет работать, если нет.

Вы можете достичь этого, используя ng-strict-di:

<html ng-app="myApp" ng-strict-di>

Ответ 4

Вы также можете добавить strict-di, как это:

 angular.bootstrap(document, ['app'], {
        strictDi: true
    });

при использовании angular приложений типа meteor es6.