angular1.3から追加される(そう)strict-diモードについて覚書
ng-strict-diとは?
ng-strict-di
とはng-app
directive と一緒に付加することで、 injectorをstrict-di
モードにすることができるng-appのオプションです。何を解決するか
strict-di
モードを利用することで、Dependency Annotationのつけ忘れを防ぎます。strict-diモードとangularのminify問題
angularのDependency Annotation
AngularJSのDIには大きく分けて3つの注釈が存在します。 AngularJSではこの注釈(annotation)を利用して名前解決をし、Service等のDIを行っています。
- functionのパラメータ名による暗黙的な注釈
$inject
プロパティを利用した注釈- inline arrayを利用した注釈
functionのパラメータ名による暗黙的な注釈
パラメータ名による暗黙的な注釈は以下のようにパラメータ名を利用してDIを行います。
function MyController($scope) { } //angularは$scopeという変数名を利用しscopeオブジェクトを代入する
$inject
プロパティを利用した注釈
$inject
プロパティは注入対象に対してstring arrayとともに付加することで、 名前解決をし、代入を行います。var MyController = function(renamed$scope, renamedGreeter) { ... } MyController['$inject'] = ['$scope', 'greeter']; //renamed$scopeにはscopeオブジェクトが代入される
inline arrayを利用した注釈
inline arrayは注入対象をangularに登録する際に一緒に指定する方法です。
someModule.factory('greeter', ['$window', function(renamed$window) { // ... }]);
暗黙的な注釈の問題点
一見暗黙的な代入は記述量も少なく便利なのですが一つ大きな問題があります。 それはminify時に変数名が変わる可能性がある(と言うよりだいたい変わる)点です。
minify前
function MyController($scope) { } //angularは$scopeという変数名を利用しscopeオブジェクトを代入する
minify後
function A(a) { } //minifyにより変数名が変わってしまう
このため、minifyをする予定がある場合は後半二つの明示的に注釈する方法が一般的に取られます。 ただ確実にこの注釈を行っているかチェックを行う方法はありません。 というかよく忘れます。
strict-diモード
これらの問題を解決するのがstrict-diモードっぽいです。 strct-diモードは
ng-app
が付いているタグにng-strict-di
属性を付けることでstrict-diモードになります。 <body ng-app="ngStrictTestApp" ng-strict-di>
0 件のコメント:
コメントを投稿