AngularJS進行效能調優的7個建議_AngularJS

來源:互聯網
上載者:User

 AnglarJS作為一款優秀的Web架構,可大大簡化前端開發的負擔。近日Sebastian Fröstl在一篇博文《AngularJS Performance Tuning for Long Lists》中表示AnglarJS在處理包含複雜資料結構的大型列表時,其運行速度會非常慢。他在文中同時分享瞭解決方案。下面為該文的譯文。

  AnglarJS很棒,但當處理包含複雜資料結構的大型列表時,其運行速度就會非常慢。這是我們將核心管理頁面遷移到AngularJS過程中遇到的問題。這些頁面在顯示500行資料時本應該工作順暢,但首個方法的渲染時間竟花費了7秒,太可怕了。

  後來,我們發現了在實現過程中存在兩個主要效能問題。一個與“ng-repeat ”指令有關,另一個與過濾器有關。

  下文將分享我們通過不同的方法解決效能問題的經驗,希望可以給你帶來啟示。

  一、AngularJS 中的ng-repeat在處理大型列表時,速度為什麼會變慢?

  AngularJS中的ng-repeat在處理2500個以上的雙向資料繫結時速度會變慢。這是由於AngularJS通過“dirty checking”函數來檢測變化。每次檢測都會花費時間,所以包含複雜資料結構的大型列表將降低你應用的運行速度。

  二、提高效能的先決條件

  時間記錄指令

  為了測量一個列表渲染所花費的時間,我們寫了一個簡單的程式,通過使用“ng-repeat”的屬性“$last”來記錄時間。時間存放在TimeTracker服務中,這樣時間記錄就與伺服器端的資料載入分開了。

  // Post repeat directive for logging the rendering time angular.module('siApp.services').directive('postRepeatDirective', ['$timeout', '$log', 'TimeTracker', function($timeout, $log, TimeTracker) { return function(scope, element, attrs) { if (scope.$last){ $timeout(function(){ var timeFinishedLoadingList = TimeTracker.reviewListLoaded(); var ref = new Date(timeFinishedLoadingList); var end = new Date(); $log.debug("## DOM rendering list took: " + (end - ref) + " ms"); }); } }; } ]); // Use in HTML: …

  Chrome開發人員工具的時間軸(Timeline)屬性

  在Chrome開發人員工具的時間軸標籤中,你可以看見事件、每秒內瀏覽器幀數和記憶體配置。“memory”工具用來檢測記憶體流失,及頁面所需的內 存。當畫面播放速率每秒低於30幀時就會出現頁面閃爍問題。“frames”工具可協助瞭解渲染效能,還可顯示出一個JavaScript任務所花費的CPU時 間。

  三、通過限制列表的大小進行基本的調優

  緩解該問題,最好的辦法是限制所顯示列表的大小。可通過分頁、添加無限捲軸來實現。

  分頁

  分頁,我們可以使用AngularJS的“limitTo”過濾器(AngularJS1.1.4版本以後)和“startFrom”過濾器。可以通過限制顯示列表的大小來減少渲染時間。這是減少渲染時間最高效的方法。

  // Pagination in controller $scope.currentPage = 0; $scope.pageSize = 75; $scope.numberOfPages = function() { return Math.ceil($scope.displayedItemsList.length/ $scope.pageSize); }; // Start from filter angular.module('app').filter('startFrom', function() { return function(input, start) { return input.slice(start); }; // Use in HTML // Pagination buttons{{$index + 1}}

  如果你不能/不想使用分頁,但過濾過程又很慢,這時一定要檢查前五步,並使用“ng-show”隱藏掉多餘的列表元素。

  無限捲軸

  如果你希望進一步瞭解該方法,可訪問 http://binarymuse.github.io/ngInfiniteScroll/

  四、七大調優法則

  1. 渲染沒有資料繫結的列表

  這是最明顯的解決方案,因為資料繫結是效能問題最可能的根源。如果你只想顯示一次列表,並不需要更新、改變資料,放棄資料繫結是絕佳的辦法。不過可惜的是,你會失去對資料的控制權,但除了該法,我們別無選擇。進一步瞭解: https://github.com/Pasvaz/bindonce。

  2.不要使用內聯方法計算資料

  為了在控制器中直接過濾列表,不要使用可獲得過濾連結的方法。“ng-repeat”會評估每個 [$digest(http://docs.angularjs.org/api/ng.$rootScope.Scope運算式。在我們的案例中,“filteredItems()”返回過濾連結。如果評估過程很慢,它將迅速降低整個應用的速度。

  //這並不是一個好方法,因為要頻繁地評估。

  //這是要採用的方法

  3.使用兩個列表(一個用來進行視圖顯示,一個作為資料來源)

  將要顯示的列表與總的資料列表分開,是非常有用的模型。你可以對一些過濾進行預先處理,並將存於緩衝中的連結應用到視圖上。下面案例展示了基本實現過程。filteredLists變數儲存著緩衝中的連結,applyFilter方法來處理映射。

  /* Controller */ // Basic list var items = [{name:"John", active:true }, {name:"Adam"}, {name:"Chris"}, {name:"Heather"}]; // Init displayedList $scope.displayedItems = items; // Filter Cache var filteredLists['active'] = $filter('filter)(items, {"active" : true}); // Apply the filter $scope.applyFilter = function(type) { if (filteredLists.hasOwnProperty(type){ // Check if filter is cached $scope.displayedItems = filteredLists[type]; } else { /* Non cached filtering */ } } // Reset filter $scope.resetFilter = function() { $scope.displayedItems = items; } /* View */Select active

  {{item.name}}

  4.在其他模板中使用ng-if來代替ng-show

  如果你用指令、模板來渲染額外的資訊,例如通過點擊來顯示清單項目的詳細資料,一定要使用 ng-if(AngularJSv. 1.1.5以後)。ng-if可阻止渲染(與ng-show相比)。所以其它DOM和資料繫結可根據需要進行評估。

以上內容給大家詳解了AngularJS進行效能調優的7個建議,希望大家喜歡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.