10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @...

27
Make it Better, Do it Faster! 10 astuces pour améliorer les performances de son application AngularJS 26/05/14

description

10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Transcript of 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @...

Page 1: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Make it Better, Do it Faster!

10 astuces pour améliorer les performancesde son application AngularJS

26/05/14

Page 2: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Euh… mais t’es qui toi exactement ?

Jonathan MeissManager équipe front-end chez Meetic

@JohnMeiss

Page 3: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Mon appli rame quand je veux afficher une longue liste via ngRepeat

Problème #1

Page 4: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

4

<ul> <li ng-repeat="item in items | startFrom:currentPage*20 | limitTo:20"> {{item.name}} </li> </ul>

Astuce #1 : limitTo (pagination)

« Réduire le nombre d’éléments à afficher dans une listepermet de réduire le temps de rendering. »

Page 5: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

5

<ul infinite-scroll="addMoreItems()"> <li ng-repeat="item in items"> {{item.name}} </li></ul>

Astuce #2 : ngInfiniteScroll

« Charger uniquement les premiers éléments d’une listepermet de réduire le temps de rendering. »

http://binarymuse.github.io/ngInfiniteScroll<>

Page 6: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

6

<ul> <li bindonce ng-repeat="item in items" bo-text="item.name"></li> </ul>

Astuce #3 : Bindonce

« Passé les 2000 watchers, la page peut commencer à ramer.Avec bindonce, cette liste n’a plus qu’un seul watcher ! »

https://github.com/Pasvaz/bindonce<>

Page 7: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

7

<ul> <li ng-repeat="item in filteredItems()">{{item.name}}</li> </ul>

Astuce #4 : pas de fonction inline !« Besoin de filtrer la liste dans un contrôleur ?

N’utilisez pas une fonction pour récupérer la liste filtrée ! »

ngRepeat évalue l’expression à chaque $digest,ce qui est fait très fréquemment.

<ul> <li ng-repeat="item in items">{{item.name}}</li> </ul>

Page 8: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

<li ng-repeat="item in items"> {{item.name | myHeavyFilter}} </li>

Astuce #5 : utiliser track by (>= 1.2)Mise à jour d’une liste :

Angular supprime et recrée chaque élément dans le DOM

Mise à jour d’une liste :Angular fait un diff des deux listes et ne créé / supprime que les éléments non 

identiques.

<li ng-repeat="item in items track by item.id"> {{item.name | myHeavyFilter}} </li>

Page 9: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Mon appli rame quand j’utilise ngIf ou ngShow

Problème #2

Page 10: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

10

<div ng-click="toggle = !toggle">Click</div> <div ng-if="toggle" ng-repeat="item in oldItems">{{item.name}}</div> <div ng-if="!toggle" ng-repeat="item in newItems">{{item.name}}</div>

Astuce #6 : bien utiliser ngShow

« ngShow rend l’élément dans le DOMmême si il n’est pas visible. »

<div ng-click="toggle = !toggle">Click</div> <div ng-show="toggle" ng-repeat="item in oldItems">{{item.name}}</div> <div ng-show="!toggle" ng-repeat="item in newItems">{{item.name}}</div>

Page 11: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

11

<li ng-repeat="item in items" ng-click="expand = !expand"> {{item.name}} <span ng-show="expand">{{item.description}}</span> </li>

Astuce #7 : bien utiliser ngIf

« Contrairement à ngShow,ngIf empêche le rendering de l’élément dans le DOM »

<li ng-repeat="item in items" ng-click="expand = !expand"> {{item.name}} <span ng-if="expand">{{item.description}}</span> </li>

Page 12: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Et si on optimisait aussi les requêtes ?

Page 13: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

13

$resource('/users', {}, { query: { method: ’GET’, cache: true, isArray: true } });

Astuce #8 : cache HTTP

« Activer le cache HTTP, permet de mettre en cache la requêteEt ainsi accélérer le prochain affichage de la page »

Page 14: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

14

Astuce #9 : $q.all()

« $q.all() permet de paralléliser les promisespuis de traiter chacun des résultats en même temps,

tout en choisissant l’ordre de traitement des réponses. »

Page 15: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Qu’est-ce qu’une application « performante » ??

Mais au fait…

Page 16: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Ce qui est important,ce ne sont pas les millisecondespassées à afficher une page mais

C’est La Performance Utilisateur

Page 17: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

17

.when('/accounts', { templateUrl: 'views/accounts/index.html’, resolve: { accountList: ['apiV1', function (apiV1) { return apiV1.accountList().$promise; }] } });

Astuce #10 : resolve

ngRouter attend que toutes les dépendances appelées dans resolve soient résolues avant d’instancier le contrôleur puis

changer de route.

Page 18: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Est-ce que ça veut dire que je dois utiliser resolve pour chaque route ?

Page 19: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Application synchrone!

Page bloquée = utilisateur mécontent

Pas toujours nécessaire (données cachées)

Page blanche

Surtout pas !

!

!

!

Page 20: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Tout est une question de perception

Montrez à votre utilisateur qu’une action est en cours……ce bon vieux spinner (HttpInterceptor est votre ami)

Page 21: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Tout est une question de perception

Mais ne le mettez pas à chaque fois non plus ! …l’utilisateur considère une action comme étant instantanée si elle prend moins de 100ms

Page 22: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Tout est une question de perceptionLa technique de « l’apéro »……donnez-lui quelque chose à grignoter pendant que l’application est en train de mijoter

Page 23: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Et pour aller plus loin… ?

Page 24: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

24

Astuce #troll : pour les vues complexes, utilisez…

Optimizing AngularJS: 1200ms to 35ms

https://github.com/scalyr/angular<>

Page 25: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Et un grand merci à mon collègue @jorisCalabreseà qui j’ai salement pompé ces magnifiques picto dessinés à la main !

Merci.

@JohnMeiss

Page 26: 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic

Est-ce qu’on vous a dit qu’on recrutedes ninjas dev front-end ?