SlideShare uma empresa Scribd logo
1 de 27
Make it Better, Do it Faster!
10 astuces pour améliorer les performances
de son application AngularJS
26/05/14
Euh… mais t’es qui toi exactement ?
Jonathan Meiss
Manager équipe front-end chez Meetic
@JohnMeiss
Mon appli rame quand je veux
afficher une longue liste via ngRepeat
Problème #1
<ul>
<li ng-repeat="item in items | startFrom:currentPage*20 | limitTo:20">
{{item.name}}
</li>
</ul>
4
Astuce #1 : limitTo (pagination)
« Réduire le nombre d’éléments à afficher dans une liste
permet de réduire le temps de rendering. »
<ul infinite-scroll="addMoreItems()">
<li ng-repeat="item in items">
{{item.name}}
</li>
</ul>
5
Astuce #2 : ngInfiniteScroll
« Charger uniquement les premiers éléments d’une liste
permet de réduire le temps de rendering. »
http://binarymuse.github.io/ngInfiniteScroll
<>
<ul>
<li bindonce ng-repeat="item in items" bo-text="item.name"></li>
</ul>
6
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
<>
<ul>
<li ng-repeat="item in filteredItems()">{{item.name}}</li>
</ul>
7
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>
<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>
Mon appli rame quand j’utilise ngIf
ou ngShow
Problème #2
<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>
10
Astuce #6 : bien utiliser ngShow
« ngShow rend l’élément dans le DOM
mê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>
<li ng-repeat="item in items" ng-click="expand = !expand">
{{item.name}}
<span ng-show="expand">{{item.description}}</span>
</li>
11
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>
Et si on optimisait aussi les
requêtes ?
$resource('/users', {}, {
query: {
method: ’GET’,
cache: true,
isArray: true
}
});
13
Astuce #8 : cache HTTP
« Activer le cache HTTP, permet de mettre en cache la requête
Et ainsi accélérer le prochain affichage de la page »
14
Astuce #9 : $q.all()
« $q.all() permet de paralléliser les promises
puis de traiter chacun des résultats en même temps,
tout en choisissant l’ordre de traitement des réponses. »
Qu’est-ce qu’une application
« performante » ??
Mais au fait…
Ce qui est important,
ce ne sont pas les millisecondes
passées à afficher une page mais
C’est La Performance Utilisateur
.when('/accounts', {
templateUrl: 'views/accounts/index.html’,
resolve: {
accountList: ['apiV1', function (apiV1) {
return apiV1.accountList().$promise;
}]
}
});
17
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.
Est-ce que ça veut dire que je
dois utiliser resolve pour
chaque route ?
Application synchrone
!
Page bloquée =
utilisateur mécontent
Pas toujours nécessaire
(données cachées)
Page blanche
Surtout pas !
!
!
!
Tout est une question de perception
Montrez à votre utilisateur
qu’une action est en cours…
…ce bon vieux spinner
(HttpInterceptor est votre ami)
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
Tout est une question de perception
La technique de « l’apéro »…
…donnez-lui quelque chose à grignoter pendant que l’application est en train
de mijoter
Et pour aller plus loin… ?
24
Astuce #troll : pour les vues complexes,
utilisez…
Optimizing AngularJS: 1200ms to 35ms
https://github.com/scalyr/angular
<>
Et un grand merci à mon collègue @jorisCalabrese
à qui j’ai salement pompé ces magnifiques picto dessinés à la main !
Merci.
@JohnMeiss
Est-ce qu’on vous a dit qu’on recrute
des ninjas dev front-end ?
27
Ressources
• http://tech.small-improvements.com/2013/09/10/angularjs-performance-with-
large-lists/
• http://stackoverflow.com/questions/15643467/how-to-speed-up-an-angularjs-
application
• http://blog.stackfull.com/2013/02/angularjs-virtual-scrolling-part-1/

Mais conteúdo relacionado

Destaque

Html5 : stockage local & synchronisation
Html5 : stockage local & synchronisationHtml5 : stockage local & synchronisation
Html5 : stockage local & synchronisationgoldoraf
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 
La france face à la mondialisation
La france face à la mondialisationLa france face à la mondialisation
La france face à la mondialisationPierre Cattoire, MBA
 
Analyse financière des comptes du club mediterrannée
Analyse financière des comptes du club mediterrannéeAnalyse financière des comptes du club mediterrannée
Analyse financière des comptes du club mediterrannéePierre Cattoire, MBA
 
Press book Paris Tribal 2015
Press book Paris Tribal 2015Press book Paris Tribal 2015
Press book Paris Tribal 2015Agence Colonnes
 
Présentation projet tourisme responsable circuit Cambodge by Vision Ethique
Présentation projet tourisme responsable circuit Cambodge by Vision EthiquePrésentation projet tourisme responsable circuit Cambodge by Vision Ethique
Présentation projet tourisme responsable circuit Cambodge by Vision EthiqueCaroline Debonnaire
 
Pitch GoudronBlanc - 14/05/2012
Pitch GoudronBlanc - 14/05/2012Pitch GoudronBlanc - 14/05/2012
Pitch GoudronBlanc - 14/05/2012GoudronBlanc
 
Empresas y sociedades en colombia
Empresas y sociedades en colombiaEmpresas y sociedades en colombia
Empresas y sociedades en colombiasergio3004
 
Carré Rive Gauche - Vernissage Métamorphoses
Carré Rive Gauche - Vernissage MétamorphosesCarré Rive Gauche - Vernissage Métamorphoses
Carré Rive Gauche - Vernissage MétamorphosesAgence Colonnes
 

Destaque (20)

Html5 : stockage local & synchronisation
Html5 : stockage local & synchronisationHtml5 : stockage local & synchronisation
Html5 : stockage local & synchronisation
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
Características de las TIC
Características de las TICCaracterísticas de las TIC
Características de las TIC
 
La france face à la mondialisation
La france face à la mondialisationLa france face à la mondialisation
La france face à la mondialisation
 
Analyse financière des comptes du club mediterrannée
Analyse financière des comptes du club mediterrannéeAnalyse financière des comptes du club mediterrannée
Analyse financière des comptes du club mediterrannée
 
Press book Paris Tribal 2015
Press book Paris Tribal 2015Press book Paris Tribal 2015
Press book Paris Tribal 2015
 
Sistema 1
Sistema 1Sistema 1
Sistema 1
 
Ma Vacance En France
Ma Vacance En FranceMa Vacance En France
Ma Vacance En France
 
GO! ANIMATE.
GO! ANIMATE.GO! ANIMATE.
GO! ANIMATE.
 
Proyecto. Mi Querido Viejo
Proyecto. Mi Querido ViejoProyecto. Mi Querido Viejo
Proyecto. Mi Querido Viejo
 
Présentation projet tourisme responsable circuit Cambodge by Vision Ethique
Présentation projet tourisme responsable circuit Cambodge by Vision EthiquePrésentation projet tourisme responsable circuit Cambodge by Vision Ethique
Présentation projet tourisme responsable circuit Cambodge by Vision Ethique
 
Webinar Eenox Compario 17 avril 2013
Webinar Eenox Compario 17 avril 2013Webinar Eenox Compario 17 avril 2013
Webinar Eenox Compario 17 avril 2013
 
Pop
PopPop
Pop
 
Equipos y estadios
Equipos y estadiosEquipos y estadios
Equipos y estadios
 
Yulma ruiz acevedo
Yulma ruiz acevedoYulma ruiz acevedo
Yulma ruiz acevedo
 
Diaporama projet
Diaporama projetDiaporama projet
Diaporama projet
 
Pitch GoudronBlanc - 14/05/2012
Pitch GoudronBlanc - 14/05/2012Pitch GoudronBlanc - 14/05/2012
Pitch GoudronBlanc - 14/05/2012
 
Empresas y sociedades en colombia
Empresas y sociedades en colombiaEmpresas y sociedades en colombia
Empresas y sociedades en colombia
 
Lugares turisticos del ecuador
Lugares turisticos del ecuadorLugares turisticos del ecuador
Lugares turisticos del ecuador
 
Carré Rive Gauche - Vernissage Métamorphoses
Carré Rive Gauche - Vernissage MétamorphosesCarré Rive Gauche - Vernissage Métamorphoses
Carré Rive Gauche - Vernissage Métamorphoses
 

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

Workshop angular2
Workshop angular2 Workshop angular2
Workshop angular2 sihemhcine
 
Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Clément Dubois
 
Android-Tp2: liste et adaptateurs
Android-Tp2: liste et adaptateursAndroid-Tp2: liste et adaptateurs
Android-Tp2: liste et adaptateursLilia Sfaxi
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Maxime Bernard
 
1-Introduction JQuery.pptx
1-Introduction JQuery.pptx1-Introduction JQuery.pptx
1-Introduction JQuery.pptxlaabid1
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Tarik Zakaria Benmerar
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Netvibes
 
Paris Android User Group
Paris Android User GroupParis Android User Group
Paris Android User Groupnaholyr
 
Introduction à Angularjs
Introduction à AngularjsIntroduction à Angularjs
Introduction à AngularjsRossi Oddet
 
Cocoheads react native + redux par Nicolas Fontaine
Cocoheads   react native + redux par Nicolas FontaineCocoheads   react native + redux par Nicolas Fontaine
Cocoheads react native + redux par Nicolas FontaineIdean France
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0adrienhautot
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPKristen Le Liboux
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 

Semelhante a 10 astuces pour améliorer les performances de son application AngularJS - ngParis - Meetup #11 @ Meetic (20)

Workshop angular2
Workshop angular2 Workshop angular2
Workshop angular2
 
Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)Le futur de AngularJS (2.0)
Le futur de AngularJS (2.0)
 
Cours 2 les composants
Cours 2 les composantsCours 2 les composants
Cours 2 les composants
 
Android-Tp2: liste et adaptateurs
Android-Tp2: liste et adaptateursAndroid-Tp2: liste et adaptateurs
Android-Tp2: liste et adaptateurs
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?
 
1-Introduction JQuery.pptx
1-Introduction JQuery.pptx1-Introduction JQuery.pptx
1-Introduction JQuery.pptx
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007
 
TP_1.pdf
TP_1.pdfTP_1.pdf
TP_1.pdf
 
Paris Android User Group
Paris Android User GroupParis Android User Group
Paris Android User Group
 
Introduction à Angularjs
Introduction à AngularjsIntroduction à Angularjs
Introduction à Angularjs
 
Cocoheads react native + redux par Nicolas Fontaine
Cocoheads   react native + redux par Nicolas FontaineCocoheads   react native + redux par Nicolas Fontaine
Cocoheads react native + redux par Nicolas Fontaine
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0
 
Manualjquery
ManualjqueryManualjquery
Manualjquery
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
Mini Projet
Mini Projet Mini Projet
Mini Projet
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 

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

  • 1. Make it Better, Do it Faster! 10 astuces pour améliorer les performances de son application AngularJS 26/05/14
  • 2. Euh… mais t’es qui toi exactement ? Jonathan Meiss Manager équipe front-end chez Meetic @JohnMeiss
  • 3. Mon appli rame quand je veux afficher une longue liste via ngRepeat Problème #1
  • 4. <ul> <li ng-repeat="item in items | startFrom:currentPage*20 | limitTo:20"> {{item.name}} </li> </ul> 4 Astuce #1 : limitTo (pagination) « Réduire le nombre d’éléments à afficher dans une liste permet de réduire le temps de rendering. »
  • 5. <ul infinite-scroll="addMoreItems()"> <li ng-repeat="item in items"> {{item.name}} </li> </ul> 5 Astuce #2 : ngInfiniteScroll « Charger uniquement les premiers éléments d’une liste permet de réduire le temps de rendering. » http://binarymuse.github.io/ngInfiniteScroll <>
  • 6. <ul> <li bindonce ng-repeat="item in items" bo-text="item.name"></li> </ul> 6 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 <>
  • 7. <ul> <li ng-repeat="item in filteredItems()">{{item.name}}</li> </ul> 7 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>
  • 8. <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>
  • 9. Mon appli rame quand j’utilise ngIf ou ngShow Problème #2
  • 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> 10 Astuce #6 : bien utiliser ngShow « ngShow rend l’élément dans le DOM mê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>
  • 11. <li ng-repeat="item in items" ng-click="expand = !expand"> {{item.name}} <span ng-show="expand">{{item.description}}</span> </li> 11 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>
  • 12. Et si on optimisait aussi les requêtes ?
  • 13. $resource('/users', {}, { query: { method: ’GET’, cache: true, isArray: true } }); 13 Astuce #8 : cache HTTP « Activer le cache HTTP, permet de mettre en cache la requête Et ainsi accélérer le prochain affichage de la page »
  • 14. 14 Astuce #9 : $q.all() « $q.all() permet de paralléliser les promises puis de traiter chacun des résultats en même temps, tout en choisissant l’ordre de traitement des réponses. »
  • 15. Qu’est-ce qu’une application « performante » ?? Mais au fait…
  • 16. Ce qui est important, ce ne sont pas les millisecondes passées à afficher une page mais C’est La Performance Utilisateur
  • 17. .when('/accounts', { templateUrl: 'views/accounts/index.html’, resolve: { accountList: ['apiV1', function (apiV1) { return apiV1.accountList().$promise; }] } }); 17 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.
  • 18. Est-ce que ça veut dire que je dois utiliser resolve pour chaque route ?
  • 19. Application synchrone ! Page bloquée = utilisateur mécontent Pas toujours nécessaire (données cachées) Page blanche Surtout pas ! ! ! !
  • 20. Tout est une question de perception Montrez à votre utilisateur qu’une action est en cours… …ce bon vieux spinner (HttpInterceptor est votre ami)
  • 21. 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
  • 22. Tout est une question de perception La technique de « l’apéro »… …donnez-lui quelque chose à grignoter pendant que l’application est en train de mijoter
  • 23. Et pour aller plus loin… ?
  • 24. 24 Astuce #troll : pour les vues complexes, utilisez… Optimizing AngularJS: 1200ms to 35ms https://github.com/scalyr/angular <>
  • 25. Et un grand merci à mon collègue @jorisCalabrese à qui j’ai salement pompé ces magnifiques picto dessinés à la main ! Merci. @JohnMeiss
  • 26. Est-ce qu’on vous a dit qu’on recrute des ninjas dev front-end ?

Notas do Editor

  1. Filtrer une liste via des filter et non dans le controller
  2. SANS track by : - Angular génère un $$hashKey par objet - Si mise à jour de la liste : nouveau $$hashKey pour chaque élément même si ils sont identiques Donc tous les éléments sont supprimés et recréés dans le DOM => coûteux surtout si vous appliquez un filtre ou une directive à chaque élément AVEC track by : - Angular utilise l’ID de l’objet - Si mise à jour de la liste : Angular fait un diff de la liste et ne supprime pas / recréé pas les éléments identiques
  3. Autre exemple : un menu qu’on fait apparaître en cliquant sur un bouton. Utiliser ngShow et pas ngIf, surtout si on rajoute une animation ngShow compile des directives
  4. ngIf empêche la compilation des directives
  5. Exemple : calculer la somme des âges des membres de Meetic en requêtant chacun des profils Permet d’éviter l’imbrication de callbacks et donc le synchronisme
  6. On évite ainsi d’afficher une page non complète et que l’utilisateur ait la sensation que l’application rame