1. ホーム
  2. javascript

[解決済み] AngularJS Strict DIモードのメリットは何ですか?

2022-02-12 01:58:29

質問

最近、AngularJSのStrict DIモードというのを知りました。これを使用する目的は何ですか?特にモバイルデバイスで使用すると、パフォーマンスが大幅に向上するのでしょうか?

自分のコードに適用してみましたが、コードを書くときにアノテーションは一切していません。しかし、私のコードはminifyされ、ビルド時にng-annotateされるようになっています。しかし、私のコードに Strict DI モードを追加した後も、"Explicit annotation required" というエラーが発生するのはなぜですか?

どうすればいいですか?

Strict DI Modeは基本的に、実行時にminificationに準拠していないコードが見つかるとエラーを投げます。ただし、そのコードが正しく、論理的・構文的な誤りがない場合もあることに注意してください。

ドキュメントを引用すること。

<ブロッククオート

この属性が app 要素に存在する場合、インジェクタは "strict-di" モードで作成されます。これは、アプリケーションが 明示的な関数アノテーションを使用しない (依存性注入のガイドで説明されているように、(したがって、minificationに適さない)、これらのバグのルートを追跡するために有用なデバッグ情報を支援します。

例えば、このコードは以下の理由でエラーを引き起こします。 ($scope, $http, $filter) を使用して明示的に注入されていません。 $inject に渡すか、あるいは .controller(A,B) メソッドの第2フィールドとして配列を指定します。

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){
     //...
}]);

質問に対する答えとしては、これを使うことによってパフォーマンスが大幅に向上することはありません。ただ、minifiable error safenessを与えるだけです。というのも、minificationは変数名を変更するので、例えば $scope 明示的なアノテーションがない場合