最近我遇到了AngularJS嚴格DI模式。使用它的好處是什麼&?特別是在移動設備上使用它,我們是否會獲得顯着的性能提升?AngularJS嚴格DI模式的好處是什麼?
我嘗試將它應用於我的代碼,並且在編寫代碼時我沒有做任何註釋。但是,我有我的代碼來縮小,並在構建過程中ng-annotate。但是爲什麼在我將嚴格DI模式添加到我的代碼之後,我仍然收到錯誤提示「需要顯式註釋」?
最近我遇到了AngularJS嚴格DI模式。使用它的好處是什麼&?特別是在移動設備上使用它,我們是否會獲得顯着的性能提升?AngularJS嚴格DI模式的好處是什麼?
我嘗試將它應用於我的代碼,並且在編寫代碼時我沒有做任何註釋。但是,我有我的代碼來縮小,並在構建過程中ng-annotate。但是爲什麼在我將嚴格DI模式添加到我的代碼之後,我仍然收到錯誤提示「需要顯式註釋」?
嚴格的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
而沒有顯式註釋,則縮寫會更改變量名稱,從而破壞您的代碼。
角度嚴格DI強制代碼最小化。
當您的代碼被縮小時,參數的名稱被縮短,這會打破角度的DI。爲了解決這個問題,角度添加了兩個(也許更多)替代方法來添加依賴關係。
也許最常用的方法和ng-annotate使用的方法是放置數組而不是函數作爲第二個參數。依賴關係是字符串在數組中最後一個元素之前的字符串,它是依賴項名稱。
controller.$inject(['$scope']);
angular.module('app', ['dependency']).controller('myCtrl', ['myFirstDep',
function(willBeInjectedHere){}])
你的ng-annotate可能在角度檢查之前沒有運行。確保你沒有與註釋一起運行uglify,明確地做它之前。如果你的代碼拋出錯誤,那麼最有可能的地方就是沒有做出註釋。
爲了清楚起見,'ng-annotate'是一個構建工具,將採取隱式依賴注入並添加內聯數組註釋。所以你可以寫'angular.module('myApp',[]).controller('myCtrl',function($ q){...});'並且'ng-annotate'運行後,它會變成:'angular.module('myApp',[]).controller('myCtrl',['$ q',function($ q){}]);'。 – Tommy
良好的做法是使用strict-di
。調用不使用顯式函數註釋的函數時,應用程序必須運行失敗。這意味着必須聲明使用的方法。使用ng-strict-di
將確保該應用程序正在確認依賴注入指南,如果不是,則將無法運行。
您可以通過使用ng-strict-di
實現這一目標:
<html ng-app="myApp" ng-strict-di>
查看開發人員指南: https://docs.angularjs.org/guide/di
是的,但_why_?說準則如此說不是一種解釋。任何方式,其他都已經解釋過,這是因爲縮小會破壞變量名稱,所以依賴注入器不知道它們是什麼,所以你需要明確的註釋字符串,因爲它們不會被破壞。 – Sammi
您還可以添加嚴格二是這樣的:
angular.bootstrap(document, ['app'], {
strictDi: true
});
當使用角流星es6類型的應用程序。
我相信其中一個主要優點是非嚴格代碼無法縮小,因爲它依賴於在運行時檢查變量名稱。 – CollinD
您使用哪些構建工具? –
@OlaviSau我使用gulp-ng-annotate和gulp-uglify作爲我的構建工具 – user1995781