2015-11-03 53 views
16

最近我遇到了AngularJS嚴格DI模式。使用它的好處是什麼&?特別是在移動設備上使用它,我們是否會獲得顯着的性能提升?AngularJS嚴格DI模式的好處是什麼?

我嘗試將它應用於我的代碼,並且在編寫代碼時我沒有做任何註釋。但是,我有我的代碼來縮小,並在構建過程中ng-annotate。但是爲什麼在我將嚴格DI模式添加到我的代碼之後,我仍然收到錯誤提示「需要顯式註釋」?

+2

我相信其中一個主要優點是非嚴格代碼無法縮小,因爲它依賴於在運行時檢查變量名稱。 – CollinD

+0

您使用哪些構建工具? –

+0

@OlaviSau我使用gulp-ng-annotate和gulp-uglify作爲我的構建工具 – user1995781

回答

24

嚴格的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而沒有顯式註釋,則縮寫會更改變量名稱,從而破壞您的代碼。

5

角度嚴格DI強制代碼最小化。

當您的代碼被縮小時,參數的名稱被縮短,這會打破角度的DI。爲了解決這個問題,角度添加了兩個(也許更多)替代方法來添加依賴關係。

也許最常用的方法和ng-annotate使用的方法是放置數組而不是函數作爲第二個參數。依賴關係是字符串在數組中最後一個元素之前的字符串,它是依賴項名稱。

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

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

你的ng-annotate可能在角度檢查之前沒有運行。確保你沒有與註釋一起運行uglify,明確地做它之前。如果你的代碼拋出錯誤,那麼最有可能的地方就是沒有做出註釋。

+0

爲了清楚起見,'ng-annotate'是一個構建工具,將採取隱式依賴注入並添加內聯數組註釋。所以你可以寫'angular.module('myApp',[]).controller('myCtrl',function($ q){...});'並且'ng-annotate'運行後,它會變成:'angular.module('myApp',[]).controller('myCtrl',['$ q',function($ q){}]);'。 – Tommy

3

良好的做法是使用strict-di。調用不使用顯式函數註釋的函數時,應用程序必須運行失敗。這意味着必須聲明使用的方法。使用ng-strict-di將確保該應用程序正在確認依賴注入指南,如果不是,則將無法運行。

您可以通過使用ng-strict-di實現這一目標:

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

查看開發人員指南: https://docs.angularjs.org/guide/di

+1

是的,但_why_?說準則如此說不是一種解釋。任何方式,其他都已經解釋過,這是因爲縮小會破壞變量名稱,所以依賴注入器不知道它們是什麼,所以你需要明確的註釋字符串,因爲它們不會被破壞。 – Sammi

2

您還可以添加嚴格二是這樣的:

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

當使用角流星es6類型的應用程序。