moyenne 96 KB en 2011, 175KB en 2014 ! En moyenne 24% du poids de la page ! 56% des pages comptent +de 20 tags <script> (juillet 2014) (Top 1000 sites) webperformancetoday.com, dareboost.com
Temps au bout duquel l’utilisateur récupère le 1er byte de data • Un TTFB important peut indiquer des problèmes backend : • Serveur • Base de données • Content delivery • … • TTFB important = Bad UX
l’opération (rappel : TWT moyen 1 sec (2014) • Requests : nombre de requêtes HTTP effectuées • Bytes in : poids des ressources nécessaire au load de la page (rappel : poids moyen 1093 KB)
Pour qu’une réponse paraisse instantanée, elle doit intervenir dans un délai de quelques centièmes de secondes. Au-delà d’une seconde, l’engagement de l’utilisateur pour la tâche initiale diminue. »
requêtes Piste 1 : Mise en cache avec .htaccess Utilisation de mod_expires Durée conseillée : 1 mois > x < 1 an • Moins de requêtes HTTP • Contenu total à télécharger diminué • Cache mobile limité (Android 2.x < 6Mo; iOS ~50Mo)
requêtes Piste 2 : Mise en cache avec localStorage ! • Cache conservé à la fermeture du browser • Facile à mettre en place en Javascript • Compatibilité anciens navigateurs • « String » uniquement (images => base64)
requêtes Piste 3 : utiliser des sprites ! • Permet de récupérer les images en 1 seul fichier. Moins de requêtes, donc moins de RTT • Gestion via les classes CSS • Regrouper les images utilisant la même palette de couleur. Dans le cas contraire, taille ++ • Peut être combiné à de l’encodage base64
Performance Browser Networking, O’Reilly Servir les données situées + près de l’utilisateur peut réduire considérablement le temps de latence. Les techniques de routing par CDN peuvent améliorer la performance
d’économiser jusqu’à 70% du poids de la ressource • Mise en place avec mod_deflate (.htaccess) • Ne fonctionne que sur des ressources de type texte (HTML, JS, CSS) http:/ /www.whatsmyip.org/http-compression-test/
Le code source est écrit pour les humains, pas pour les machines » @drublic • Les espaces, indentations, sauts de ligne, commentaires, ne sont pas utiles à la machine. • Facilement automatisable (Gulp, Grunt, etc.)
1 : Choisir le bon format ! Fichiers photos : jpg. Format destructeur. L’image compressée est modifiée. Aplats de couleurs : png. Format non destructeur. Plusieurs formats d’encodage existant ! Piste 2 : Rapport qualité / poids ! Il n’est jamais nécessaire d’enregistrer à 100% de qualité.
la compression, certaines informations restent stockées dans le fichier image (méta- données, copyright, informations de calques…) ! Ces informations peuvent être supprimées sans risque (cf Toolbox) pour réduire encore le poids.
sur le sentiment de vitesse ressenti par l’utilisateur. ! Les attributs HTML5 « async » et « defer » permettent de retarder le chargement d’un fichier Javascript Objectif : charger et interpréter le JS sans bloquer le rendu HTML/CSS ! https:/ /developer.mozilla.org/fr/docs/Web/HTML/Element/script http:/ /caniuse.com/#search=defer http:/ /caniuse.com/#search=async
au navigateur de télécharger les scripts en parallèle, après l’analyse du document, en RESPECTANT l’ordre d’appel ! N’est pas effectif sur les <script> sans attribut ‘src’
au navigateur de télécharger les scripts en parallèle, après l’analyse du document, SANS NECESSAIREMENT RESPECTER l’ordre d’appel ! N’est pas effectif sur les <script> sans attribut ‘src’
CSS, JS) sur plusieurs sous-domaines. • Nombre de requêtes simultanées multiplié • Résolution DNS à chaque sous-domaine (~200ms) • Peu efficace sur mobile • Obsolète avec HTTP2 / SPDY ? Agir sur le contenu Chargement des sources
à la fois sur les performances et la perception de vitesse. • Ne charger en priorité que ce qui est « above the fold » • Etudier le CSS Critical Path https:/ /speakerdeck.com/patrickhamann/css-and-the- critical-path http:/ /googlecode.blogspot.de/2009/09/gmail-for- mobile-html5-series-reducing.html
Repaint : intervient en cas de changement de l’apparence d’un élément, sans changer son layout. • Ex: background-color, color, box-shadow, outline… • Reflow : intervient en cas de changement de le layout d’un élément, et donc de la page. + coûteux que le repaint. • Ex: width, margin, border, positioning…
Limiter la taille du DOM et le nombre de sélecteurs CSS le plus possible • Ne pas utiliser Javascript pour gérer le style 1 var el = document.getElementById('caenjs');! 2 el.style.color = "#eee";! 3 el.style.backgroundColor = "#000";! 4 el.style.borderColor = "red";! 1 var el = document.getElementById('caenjs');! 2 el.className = "caenjs";! 3 reflows 1 reflow
Opérations rapides, gérées par le GPU ! • scale -> transform: scale(x) • move -> transform: translateX(y px) • rotate -> transform: rotate(z deg) • fade -> opacity (0…1) ! Les autres opérations nécessitent de recalculer le layout, et souvent du repaint => plus lent
Débit insuffisant • Configuration du nombre max de connections BDD insuffisant • BDD mal configurée (indexes…) • Configuration du nombre max de connections au serveur Web insuffisant • Process MySQL gourmand / en boucle • File-locking mal configuré • …
inutile s’il ne sert qu’à la selection DOM ! github.com/ded/qwery => 1.281Ko minifié github.com/chjj/zest => 11Ko minifié ! ! Privilégier Vanilla JS autant que possible ! PS : http:/ /microjs.com/
il existe toujours un délai de 300ms au clic sur la plupart des navigateurs mobiles. ! • github.com/ftlabs/fastclick • github.com/EightMedia/hammer.js • github.com/filamentgroup/tappy • developers.google.com/mobile/articles/ fast_buttons
ne permet pas le téléchargement en parallèle de l’asset. Cela peut donc bloquer d’autres ressources ! • https:/ /developers.google.com/speed/docs/ best-practices/rtt#AvoidCssImport • http:/ /www.stevesouders.com/blog/ 2009/04/09/dont-use-import/
depuis 2009, par Google. Vise une réduction de 50% du temps de load • Met en place le multiplexing • Sécurisé par défaut • Devrait servir de base pour HTTP2 ! Google a testé 25 des « top 100 » sites => Amélioration 39%-55% http:/ /chimera.labs.oreilly.com/books/ 1230000000545/ch12.html