4 performance tips voor AngularJS apps

4 performance tips voor AngularJS apps

Dit artikel is ouder dan vier jaar. De inhoud kan verouderd zijn, vooral bij technische voorbeelden of verwijzingen naar tooling.

Two-way binding heeft webdevelopment veranderd. 'live' laten zien aan gebruikers wat er gebeurt en 'live' verwerken van de input van gebruikers zorgen voor de gebruikers voor een prettige ervaring. Een ander voordeel is dat jij als developer nauwelijks code in de view-layer van je applicatie hoeft te schrijven om waarden aan te passen of gebruikersinvoer te verwerken.

Een groot nadeel van two-way binding is performance. Het gebruik van two-way binding voegt bij de meeste projecten zo veel gemak toe dat mindere performance wordt geaccepteerd. Dit zou echter niet moeten betekenen dat we zonder performance in ons achterhoofd webapplicaties schrijven. Er zijn een aantal punten waar je als developer altijd rekening mee moet houden.

1. Het aantal watchers

De digestcycle wordt vanaf de rootscope naar alle childscopes uitgevoerd. Per scope wordt er gekeken naar veranderingen door middel van watchers. Zo nodig wordt de UI aangepast en voeren controllers functies uit om de nieuwe waardes te verwerken. Maar ook vice versa, updates in de UI moeten resulteren in een aangepast model in code.

De digestcycle wordt uitgevoerd bij

  • Events, zoals ng-click
  • $interval
  • $timeout
  • $digest.apply()

Om de digestcycle snel te houden moeten het aantal watchers worden beperkt. Elke watchable item in de watchlist is een expressie die moet worden uitgevoerd. Elke expressie minder is voordelig. Bij gebruik van veel directives is het mogelijk dat de digestcycle meerdere keren per seconden wordt uitgevoerd. Dit resulteert in een overbelaste cpu en een minder snelle browser. Vooral bij oudere browsers is dit snel merkbaar.

Watchers worden geactiveerd bij

  • {{ }} expressies in de view
  • Directives zoals ng-repeat
  • Variables op de scope
  • Filters in de view en in de controller
  • $scope.$watch

2. One-time binding

Bij one-time binding wordt de waarde van de expressie niet opnieuw vastgesteld bij elke digestcycle. Zoals de naam zegt wordt de expressie eenmalig uitgevoerd, dit is op het moment dat de view voor de eerste keer wordt geladen. De waarde op het scherm wordt bij een verandering van een model in de controller niet veranderd.

3. Vervang ngHide met ngIf wanneer dat kan

Verminder het aantal watchers in een view door ngHide te vervangen door ngIf. Expressies binnen wachters binnen een ngHide worden bij elke digestcycle opnieuw uitgevoerd. Ook wanneer dom elementen niet zichtbaar zijn voor de gebruiker. Doordat ngIf actief dom elementen verwijdert uit de view (en weer terugplaatst) worden watchers binnen ngIf niet uitgevoerd.

4. Ga voorzichtig om met ngRepeat

NgRepeat is een zware expressie. Per item in een lijst zijn er niet alleen veel nieuwe watchable items, maar ook de dom wordt bij elke digestcycle opnieuw getekend. Bij een geneste ngRepeat zullen te snel veel watchable items in de view komen.

Zorg ervoor dat een ngRepeat niet gevuld wordt met een te lange array. Gebruik bijvoorbeeld paginering bij lange array's

Performance meten

Gebruikt de Chrome plugin AngularJS Batarang om het aantal watchers te meten. Ook krijg je met deze tool inzicht in de duur van het uitvoeren van de digestcycle.

Of gebruik ngStats binnen elke andere browser. Door onderstaande code via de browserconsole uit te voeren krijg je direct inzicht in het aantal watchers.

(function() {var a = document.createElement("script");a.src = "https://rawgit.com/kentcdodds/ng-stats/master/dist/ng-stats.js";a.onload=function(){window.showAngularStats()};document.head.appendChild(a)})();

Reacties

Er zijn nog geen reacties, laat je reactie achter.

Laat een reactie achter

Heb je een aanvulling, vraag of eigen ervaring bij dit artikel? Deel hem hieronder.

Reacties worden eerst kort gecontroleerd voordat ze zichtbaar zijn.

Bekijk alle artikelen

The difference between debounce and throttle

Debounce and throttle are powerful techniques, but only if you really understand what they do. I often ask about them in tech interviews, and to my surprise, many developers (even seniors) struggle to explain the difference. The good news is: it’s actually quite simple. In this post, I’ll break down both techniques and share some practical use cases. If you are unfamiliar with the techniques and are asked about them too in your interview…

Continue reading

Validatiemeldingen tonen met AngularJS

Vaak krijg ik de vraag hoe het toch komt dat AngularJS velden valideert en foutmeldingen toont voordat een gebruiker iets heeft ingevuld in het webformulier. AngularJS blinkt juist uit in het opzetten van formulieren en het zou dus gemakkelijk moeten zijn om dat aan te passen. Gelukkig is dat zo, maar je zal wel de basis werking van AngularJS formulieren moeten begrijpen. States van een AngularJS formulier Elk formulier van AngularJS houdt…

Lees verder

AngularJS: Het verschil tussen Components en Directives

AngularJS is een uitstekend framework om snel client-side apps mee te maken. Het MVC framework biedt controllers, services, factories, views, directives en componenten. Servies, controllers en views hebben een duidelijke functie binnen de app, maar components en directives hebben veel gemeen. Belangrijkste kenmerken Components heeft een template maakt een component (nieuw DOM element) is technisch een directive Directives voegt gedrag toe…

Lees verder