unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

AngularJSのminify対策(ng-annotate)

AngularJSのDI

AngularJSのDI(Dependency Injection)は、コントローラーに必要なオブジェクトを注入(定義しておいた変数にセットして)くれる機能です。
このとき、変数に注入すべきオブジェクトは変数名を見て決定しています。

例えば下記のコードでは、$scopeという変数名を見てスコープオブジェクト(https://docs.angularjs.org/guide/scope)を$scope変数にセットしています。

app.controller('MyCtrl', function($scope) {
    ...
});

minifyにより発生する問題

便利な機能ですが、この仕組みはminifyと相性が悪いのです。
minifyによって変数名が書き換わると、何を注入すべきかがわからなくなってしまいます。

a.controller('MyCtrl', function(s) {
    ...
});

$scopeがsに変わってしまい、これではスコープオブジェクトと紐付けられません。

この問題に対処するため、AngularJSではannotation(文字列として注入すべきオブジェクトの名称を渡す)機能が用意されています。(文字列はminifyしても変化しないため。)

a.controller('MyCtrl', ['$scope', function($scope) {
    ...
}]);

ng-annotate

ひとまずannotationで問題は解決できますが、DI対象が増えるとコードのメンテナンス性が悪くなってしまいます。(うっかり順番を間違えたり…。)
そこで、ng-annotateの登場です。DI宣言部分に@ngInjectを記述すると、annotationを自動生成してくれます。(あたりまえですがminifyの実行前に実施します。)

/* @ngInject */
app.controller('MyCtrl', function($scope) {
    ...
});

参考